Saya menggunakan Fungsi Perbedaan Perbedaan Rata - rata untuk memperkirakan frekuensi fundamental dari sinyal audio kuasi-periodik. AMDF didefinisikan sebagai
di mana adalah panjang sinyal. Fungsi ini menunjukkan minimum ketika sinyal digeser dengan jumlah yang sama dengan periodenya.
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:
Sebagai akibatnya, masalah penggandaan nada muncul: minimum yang terdeteksi sesuai dengan setengah periode sinyal (yaitu harmonik kedua):
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?
sumber
Jawaban:
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]
k⌊ ⋅ ⌋ adalah k ⌊ k2⌋ = ⌊ k + 12⌋ = k2
floor()
fungsi dan, jika adalah itupun .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 NN→ ∞ N N
Jadi sekarang pertimbangkan "autokorelasi" yang terbatas ini (di lingkungan sampel ) yang didefinisikan dari ASDF:x [ n0]
dimana
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] = 0 Qx[ k , n0] ≥ 0 k Rx[ k , n0] ≤ Rx[ 0 , n0] k
Misalkan sebentar bahwa periodik dengan periode (dan kebetulan bilangan bulat), makaP Px [ n ] P P
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[ M P, n0] = 0 Rx[ M P, n0] = Rx[ 0 , n0] ≥ Rx[ k , n0] k = 0 k P x [ n ] x [ n ] k = 0 k = P Pm k = 0 k P x [ n ] x [ n ] k = 0 k = P P
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] n0 N Rx[ 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 = n0 Rx[ 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 ] P P Rx[ 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[ 2 P, n0] Rx[ 3 P, n0] P k Rx[ 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.k k
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] k k = 2 P k = P
Jadi, jika sempurna periodik dengan periode , dan mengabaikan masalah interpolasi untuk non-integer , makaP Px [ n ] P P
tapi
Faktor di mana puncak untuk nada satu oktaf lebih rendah berkurang adalah rasio
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α
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.α
sumber
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.
sumber