Bagaimana cara menghadapi fundamental rendah ketika menggunakan AMDF untuk ekstraksi pitch?

11

Saya menggunakan Fungsi Perbedaan Perbedaan Rata - rata untuk memperkirakan frekuensi fundamental dari sinyal audio kuasi-periodik. AMDF didefinisikan sebagai

Dn=1N-nk=nN-1|Sk-Sk-n|

di mana adalah panjang sinyal. Fungsi ini menunjukkan minimum ketika sinyal digeser dengan jumlah yang sama dengan periodenya.N

Ini adalah kode yang saya gunakan untuk mengekstrak pitch (dalam Matlab):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);

Namun, saya berurusan dengan sinyal audio di mana frekuensi dasarnya sangat rendah:

spektrum sinyal audio

Sebagai akibatnya, masalah penggandaan nada muncul: minimum yang terdeteksi sesuai dengan setengah periode sinyal (yaitu harmonik kedua):

AMDF dari sinyal di atas

Saya mencoba mengekstraksi puncak terbesar dan bukan hanya yang pertama, tetapi terkadang masalah ini tetap ada. Bagaimana saya dapat meningkatkan kode saya dan / atau fungsi AMDF untuk menghadapi fundamental yang rendah?

Firion
sumber
Akustik-psiko dan persepsi manusia mempengaruhi persepsi nada dan ketidakpastian oktaf. Mungkin diperlukan eksperimen untuk menentukan dalam kondisi apa puncak AMDF terbesar membuat perbedaan yang dapat didengar.
hotpaw2
seberapa rendah frekuensi Anda? apakah ada contoh untuk saya dengarkan?
ederwander

Jawaban:

10

Inilah yang kami sebut dalam biz deteksi lapangan, " masalah oktaf ".

Pertama-tama, saya akan mengubah AMDF menjadi ASDF. Dan saya tidak akan mengurangi ukuran jendela karena lag bertambah. (Juga, saya mengubah notasi ke apa yang saya anggap lebih konvensional. " " adalah sinyal waktu diskrit.)x[n]

Fungsi Perbedaan Kuadrat Rata-rata (ASDF) dari di lingkungan sampel adalah:x [ n 0 ]x[n]x[n0]

Qx[k,n0]1Nn=0N-1(x[n+n0-N+k2] - x[n+n0-N+k2+k])2

k adalah floor()fungsi dan, jika adalah itupun .kk2=k+12=k2

Sekarang, memperluas alun-alun dan mempertimbangkan apa yang penjumlahan terlihat seperti sebagai (tidak adalah akan tak terhingga, tetapi untuk memberikan ide jika besar). ASDF secara langsung terkait dengan autokorelasi. Ini pada dasarnya autokorelasi terbalik. Langkah-langkah ini akan saya serahkan kepada Anda. lihat jawaban ini.N NNN N

Jadi sekarang pertimbangkan "autokorelasi" yang terbatas ini (di lingkungan sampel ) yang didefinisikan dari ASDF:x[n0]

Rx[k,n0]=Rx[0,n0]-12Qx[k,n0]

dimana

Rx[0,n0]1Nn=0N-1(x[n+n0-N2])2

Karena dan untuk semua lag , itu berarti untuk semua lag .Q x [ k , n 0 ] 0 k R x [ k , n 0 ] R x [ 0 , n 0 ] kQx[0,n0]=0Qx[k,n0]0kRx[k,n0]Rx[0,n0]k

Misalkan sebentar bahwa periodik dengan periode (dan kebetulan bilangan bulat), makaP Px[n]PP

x[n+P]=x[n]n

dan dan untuk jumlah periode bilangan bulat mana pun ( adalah bilangan bulat). Jadi Anda mendapatkan puncak pada dan pada sama dengan kelipatan jika periodik. Jika adalah tidak sempurna periodik, apa yang kita harapkan adalah puncak terbesar di , puncak lain (tapi sedikit lebih kecil) di (periode kita cari) dan puncak semakin kecil untuk kelipatan lebih besar dari .R x [ m P , n 0 ] = R x [ 0 , n 0 ] R x [ k , n 0 ]Qx[mP,n0]=0Rx[mP,n0]=Rx[0,n0]Rx[k,n0]k = 0 k P x [ n ] x [ n ] k = 0 k = P Pmk=0kPx[n]x[n]k=0k=PP

Jadi masalah oktaf muncul karena beberapa alasan. Pertama-tama, tidak harus berupa bilangan bulat. Itu adalah masalah interpolasi, bukan masalah besar. P

Alasan kedua dan masalah yang lebih sulit adalah karena subharmonik . Pertimbangkan bahwa Anda mendengarkan nada periodik yang bagus pada A-440 Hz dan kedengarannya seperti A yang 9 semiton di atas tengah C. Sekarang anggaplah seseorang menambahkan nada yang sangat kecil-amplitudo (seperti turun 60 dB) A -220? Seperti apa suara itu dan secara matematis apa periode "benar"?


Memilih puncak "kanan" untuk periode tersebut.

Katakanlah Anda menjalankan catatan Anda melalui filter pemblokiran DC, sehingga rata-rata adalah nol. Ternyata yang menyebabkan rerata autokorelasi untuk setiap juga menjadi nol (atau dekat dengannya jika besar). Itu berarti harus menjumlahkan (lebih dari ) menjadi nol yang berarti ada banyak area di atas nol seperti di bawah ini.R x [ k , n 0 ] n 0 N R x [ k , n 0 ] kx[n]Rx[k,n0]n0NRx[k,n0]k

Oke, jadi mewakili kekuatan di sekitar dan harus non-negatif. tidak pernah melebihi tetapi bisa menjadi sebesar ketika periodik. jika . Jadi jika adalah periodik dengan periode dan Anda memiliki banyak puncak yang dipisahkan oleh dan Anda memiliki gagasan tentang seberapa tinggi puncak itu seharusnya. Dan jika komponen DC dari adalah nol, itu berarti di antara puncak, itu harus memiliki nilai negatif.x [ n ] n = n 0 R x [ k , n 0 ] R x [ 0 , n 0 ] x [ n ] R x [ P , n 0 ] = R x [ 0 , n 0 ] x [ n + P ] = xRx[0,n0]x[n]n=n0Rx[k,n0]Rx[0,n0]x[n]Rx[P,n0]=Rx[0,n0]x [ n ] P P R x [ k , n 0 ]x[n+P]=x[n]x[n]PPRx[k,n0]

Jika adalah "quasi-periodic", satu siklus akan terlihat sangat mirip dengan siklus yang berdekatan, tetapi tidak jauh seperti siklus lebih jauh ke bawah sinyal pada waktunya. Itu berarti puncak pertama akan lebih tinggi dari yang kedua di atau ketiga . Seseorang dapat menggunakan aturan untuk selalu memilih puncak tertinggi dan mengharapkan puncak tertinggi untuk selalu menjadi yang pertama. Tetapi, karena subharmonik yang tidak terdengar, terkadang itu tidak terjadi. kadang-kadang puncak kedua atau mungkin ketiga adalah oh-begitu-sedikit lebih tinggi. Juga, karena periode kemungkinan bukan jumlah integer sampel tetapi dalamx [ n ] x [ n ] R x [ P , n 0 ] R x [ 2 P , n 0 ] R x [ 3 P , n 0 ] P k R x [ k , n 0 ] k kx[n]x[n]x[n]Rx[P,n0]Rx[2P,n0]Rx[3P,n0]PkRx[k,n0]selalu merupakan bilangan bulat, sehingga puncak sebenarnya kemungkinan berada di antara nilai integer . Bahkan jika Anda interpolasi di mana puncak halus (yang saya sarankan dan interpolasi kuadrat cukup baik), dan seberapa tinggi itu sebenarnya antara bilangan bulat , interpolasi Anda juga dapat membuat puncak sedikit lebih tinggi atau sedikit lebih rendah daripada yang sebenarnya. Jadi memilih puncak yang benar-benar tertinggi dapat mengakibatkan memilih yang kedua secara palsu dari puncak pertama (atau sebaliknya) ketika Anda benar-benar menginginkan yang lain.kk

Jadi, entah bagaimana, Anda harus menghambat puncak pada peningkatan sehingga puncak pertama memiliki sedikit keunggulan di atas yang kedua, dan yang kedua di atas yang keempat (oktaf berikutnya turun), dll. Bagaimana Anda melakukannya?k

Anda melakukannya dengan mengalikan dengan fungsi yang menurun dari sehingga puncak pada berkurang oleh beberapa faktor, relatif terhadap puncak identik di . Ternyata fungsi daya (bukan eksponensial) melakukan itu. jadi hitungk k = 2 P k = PRx[k,n0]kk=2Pk=P

k-α Rx[k,n0]

Jadi, jika sempurna periodik dengan periode , dan mengabaikan masalah interpolasi untuk non-integer , makaP Px[n]PP

Rx[2P,n0]=Rx[P,n0]

tapi

(2P)-αRx[2P,n0]=(2P)-αRx[P,n0]<P-αRx[P,n0]

Faktor di mana puncak untuk nada satu oktaf lebih rendah berkurang adalah rasio

(2P)-αRx[2P,n0]P-αRx[P,n0]=(2P)-αP-α=2-α

Jadi, jika Anda ingin memberikan puncak pertama Anda dorongan 1% dari puncak kedua, yang berarti Anda tidak akan memilih nada untuk menjadi nada sub-harmonik, kecuali autokorelasi pitch sub-harmonik setidaknya 1% lebih dari yang pertama puncak, Anda akan menyelesaikan untuk dariα

2-α=0,99

Itu adalah cara yang konsisten untuk menimbang atau mengurangi penekanan atau menghambat puncak yang sesuai dengan nada subharmonik satu oktaf di bawah ini.

Masih memberi Anda masalah ambang batas. Anda harus memilih baik. Tetapi ini adalah cara yang konsisten menekankan puncak pertama di atas yang kedua, yang merupakan satu oktaf lebih rendah, tetapi tidak terlalu banyak sehingga jika notnya benar - benar satu oktaf lebih rendah, tetapi energi di semua harmonik genap itu kuat, dibandingkan dengan yang aneh harmonik, ini masih akan meninggalkan kemungkinan puncak kedua dipilih.α

robert bristow-johnson
sumber
1
Untuk menjawab pertanyaan terakhir Anda: jika Anda menambahkan amplitudo 220 Hz, maka nada akan menjadi 220 Hz di mana 440 Hz adalah harmonik pertama setelah fundamental (secara matematis berbicara). Kasus saya serupa tetapi ada juga harmonik yang lebih tinggi, sehingga fundamental yang hilang bukan masalah dari sudut pandang persepsi. Saya tidak mengerti bagaimana mengganti AMDF dengan ASDF dapat menyelesaikan masalah oktaf
firion
tetapi bagian lain dari pertanyaannya adalah * "seperti apa bunyinya"? jawab itu dan kemudian mari kita lihat apa yang Anda ingin detektor pitch Anda lakukan.
robert bristow-johnson
cobalah menghitung dan memplot untuk nada yang sama yang telah Anda lakukan untuk AMDF. harus terlihat seperti AMDF terbalik. Rx[k,n0]
robert bristow-johnson
Jika Anda tidak memiliki harmonik yang lebih tinggi tetapi hanya yang 440 Hz, dan nada 220 Hz cukup rendah, Anda akan mendengar nada 440 Hz. Di atas level tertentu (saya tidak tahu yang mana), Anda juga akan mendengar nada 220 Hz dan nada 220 Hz.
firion
ada alasan mengapa saya katakan -60 dB. sekarang apa yang Anda ingin detektor pitch Anda katakan, bahwa itu adalah 220 Hz atau 440 Hz atau sesuatu yang lain?
robert bristow-johnson
0

Secara heuristik, frekuensi fundamental dari suara yang disuarakan akan terletak pada interval [70, 400] Hz. Jadi, langkah pertama adalah menerapkan filter bandpass untuk mengisolasi band itu.

Kedua, Anda bisa menerapkan fungsi pembobotan ke spektrum daya. Mendekati fundamental, berat harus mendekati 1, sementara lebih dekat ke ujung band, berat harus dekat 0. Bobot ini dinormalisasi tentu saja. Saya akan merekomendasikan sesuatu yang super-linear: kuadratik, kuartik dll - untuk benar-benar membunuh oktaf.

Pria itu
sumber
Bagaimana saya bisa menerapkan berat? Saya tidak tahu di mana letak fundamentalnya. Juga, sinyal saya adalah not instrumen, jadi kisarannya lebih besar
firion