Cara paling efisien untuk mengekstrak komponen frekuensi dari sinyal audio dengan akurasi mendekati manusia dalam waktu nyata


14

Saya mencoba mencari cara bagaimana (jika mungkin) untuk mengekstraksi komponen frekuensi dari sampel audio yang sewenang-wenang (biasanya musik) dengan cara seperti FFT, tetapi dalam penelitian saya pada algoritma FFT, saya belajar bahwa ia menderita beberapa pembatasan ketat untuk tujuan ini.

Ada 3 masalah yang FFT presentasikan:

  1. Karena resolusi bin FFT setara dengan ukuran jendela Anda, untuk mencapai akurasi yang cukup masuk akal (katakanlah 1 Hz), Anda memerlukan jendela yang terlalu panjang (katakanlah 1 detik). Ini berarti Anda tidak dapat mendeteksi transien atau frekuensi yang baru diperkenalkan dengan cepat. Ini juga berarti bahwa masalahnya tidak dapat diselesaikan dengan CPU yang lebih cepat dan laju sampel yang lebih tinggi - batasannya secara intrinsik terkait dengan waktu.

  2. Manusia merasakan frekuensi secara logaritmik, tetapi tempat sampah FFT ditempatkan secara linear. Misalnya perbedaan 20 hz di ujung pendengaran kita sangat besar , sedangkan perbedaan 20 hz di ujung yang tinggi tidak terlihat. Jadi untuk mendapatkan akurasi yang kami butuhkan pada frekuensi rendah, kami harus menghitung jauh lebih banyak daripada yang kami butuhkan pada frekuensi tinggi.

  3. Beberapa masalah ini dapat diatasi dengan interpolasi antara tempat sampah FFT. Ini dapat bekerja untuk banyak audio musik, karena frekuensi akan sering ditempatkan agak berjauhan sehingga tidak lebih dari 1 frekuensi akan bocor ke dalam sepasang tempat sampah. Tapi ini tidak selalu menjadi masalah, terutama untuk suara inharmonik seperti instrumen perkusi. Jadi interpolasi benar-benar hanya dugaan.

Dari apa yang saya mengerti tentang algoritma DFT / FFT, output (bin amplitudes) secara efektif adalah korelasi sinus / cosinus pada frekuensi masing-masing bin. Itu mengejutkan saya bahwa jika algoritme dapat dirancang ulang sehingga frekuensi nampan diberi spasi non-linear (yaitu kita mengkorelasikan rangkaian sinus / cosinus) yang berbeda, maka kita dapat mencapai resolusi yang sama secara pyschoacoustically pada semua frekuensi. Apakah ini mungkin, atau itu hanya mimpi-pipa berdasarkan pemahaman saya yang tidak lengkap tentang matematika yang terlibat?

Saya kira saya juga bisa menyelesaikan masalah dengan brute-force, dengan mengkorelasikan sinus / cosinus pada setiap frekuensi yang saya minati. Saya tidak terlalu memahami matematika di sini. Apakah ini mungkin? Seperti apa efisiensi? Apakah ini akan menyelesaikan masalah saya?

Apakah ada cara berbeda untuk mencapai dekomposisi frekuensi sinyal yang lebih akurat, waktu nyata,? Efisiensi CPU adalah masalah, tetapi bukan masalah utama - saya sebagian tertarik pada apakah secara teoritis dapat dilakukan sama sekali. Namun, sesuatu yang layak secara realtime pada mesin desktop modern akan ideal.


3
Masalah apa yang Anda coba selesaikan? deteksi f0, deteksi multi-f0 (untuk transkripsi), pengenalan akor, pemodelan timbre ...? Ada solusi ad-hoc untuk beberapa masalah ini. Apakah Anda peduli tentang keterbalikan (untuk digunakan dalam kerangka kerja analisis-> transformasi-> resintesis)?
pichenettes

Masalah yang saya coba selesaikan memang agak terbuka. Saya memiliki minat umum dalam musik digital, yang mencakup sebagian besar daftar Anda. Tetapi ketidakjelasan saya sebagian disebabkan oleh kurangnya pengetahuan saya tentang apa yang dapat dilakukan dan apa standar industri khusus atau cara terbaik untuk menyelesaikan setiap masalah yang Anda sebutkan (sampai saya mengajukan pertanyaan ini, saya selalu menganggap FFT adalah itu ). Tetapi item dalam daftar Anda yang paling menarik bagi saya adalah pemodelan timbre. Saya juga ingin menemukan cara mengekstraksi nada warna kompleks yang terdengar secara bersamaan dalam rekaman. Resintesis menarik. Algoritma AI menarik.
bryhoyt

Masalah yang lebih spesifik yang saya coba selesaikan di masa lalu dan ingin mencoba lagi kapan-kapan: Saya ingin menulis sebuah program untuk "berimprovisasi" secara real-time dengan sekelompok pemain atau penyanyi yang direkam dengan mikrofon. Saya sampai komputer saya "bersiul" sinus dengan saya, terasa tertunda dan tidak selaras. Sangat penting untuk improvisasi seperti itu agar akurat dan sesuai irama. Tentu, ada cara lain untuk mencapai ini (pemain memainkan instrumen digital, atau memberi komputer "informasi orang dalam" seperti progresi akor yang telah ditentukan, dll.) Tetapi ini bukan tujuan saya.
bryhoyt

"Algoritme dapat dirancang ulang sehingga frekuensi nampan ditempatkan secara non-linear, maka kita bisa mencapai resolusi yang sama dengan pyschoacoustically di semua frekuensi." Kedengarannya seperti transformasi wavelet Morlet terus menerus
endolith

Jawaban:


5

Seperti yang saya komentari pada posting sebelumnya, metode analisis frekuensi waktu yang dikenal sebagai "transformasi Fourier jangka pendek" setara dengan bank filter, menganalisis sinyal Anda x . Untuk jendela analisis diberikan w n , ukuran N , filter pada frekuensi k / N adalah: h n = w - n e j 2 π n kXxwnNk/N

hn=w-nej2πnkN

Untuk analisis biasa jendela (Hann, Hamming, atau bahkan persegi panjang), ini sesuai dengan low-pass filter, dengan frekuensi cut-off sekitar , yang "bergeser" ke frekuensi bin k1/Nk (berkat modulasi eksponensial kompleks) , oleh karena itu mengarah ke filter band-pass.

fkfk+1=21/12fk21/12-12fk

Anda dapat menemukan implementasi CQT di sana-sini, yang baru-baru ini oleh Prof. Klapuri, datang dengan invers yang lumayan dapat ditemukan di sini . Grup Audio di Telecom ParisTech juga memiliki implementasi oleh Prof. Prado, tetapi saya belum mencobanya.

[Brown91] J. Brown, "Perhitungan Transformasi Spektrum Q Konstan", Jurnal Masyarakat Akustik Amerika, 1991, 89, 425-434

EDIT 20121014: beberapa jawaban dan komentar untuk pertanyaan (bryhoyt) Anda.

  1. Hanya ide-ide umum pada komentar Anda sendiri untuk pertanyaan utama: Anda tampaknya tertarik pada banyak aplikasi yang, bagi saya, bukan masalah sepele untuk ditangani. "Pemodelan Timbre" bagi saya lebih terkait dengan pengenalan suara atau sejenisnya, yang nada atau resolusi frekuensi atau ketepatannya tidak terlalu menjadi masalah (pertimbangkan bagaimana MFCC biasanya dihitung).

    Pertimbangkan juga berapa banyak peneliti top ( F. Pachet dan tim repmus di IRCAM, Prancis , untuk mengutip beberapa) bekerja pada topik improvisasi dan pendampingan otomatis: tugas itu tidak mustahil, tetapi membutuhkan keahlian di banyak bidang. Untuk meringkas, sistem yang khas perlu meniru sistem pendengaran manusia (setidaknya), menerapkan persepsi suara / musik / nada / ritme, tahu tentang teori musik dan mengambil keputusan berdasarkan estimasi semua langkah sebelumnya. Transformasi Fourier, atau representasi sinyal apa pun, hanyalah satu (kecil) langkah menuju tujuan akhir - dan, menurut pendapat saya, berpotensi paling baik dipahami sejauh ini.

    Yang mengatakan, masih ada kemungkinan bahwa semua orang melihat jauh melampaui apa yang sebenarnya terjadi, dan bahwa Anda dapat mengatasinya dalam solusi yang sederhana dan elegan! Jangan lupa untuk mempublikasikannya setelah selesai! :-)

  2. sampel 0,1s pada 44kHz sudah cukup untuk memuat berbagai frekuensi

    Fs/N=44100/4410=10Hz

  3. FFT tidak dapat mendeteksi ini untuk frekuensi rendah dan tinggi, tetapi Anda mengatakan algoritma lain dapat: apa untungnya?

    Jawaban singkat: baca tesis saya tentang estimasi melodi!

    Untuk menguraikan lebih banyak: banyak algoritma estimasi pitch melampaui batasan FT, berkat asumsi pada suara untuk diproses. Kami berharap nada dari suara alami (suara manusia, oboe, saksofon, piano ...) lebih kompleks daripada sinusoid tunggal. Sebagian besar suara bernada lebih atau kurang harmonis, yang berarti bahwa mereka dapat dimodelkan sebagai jumlah sinusoid yang frekuensinya merupakan kelipatan dari frekuensi dasar.

    Oleh karena itu berguna untuk memperhitungkan harmonik ini ketika memperkirakan pitch, dengan metode yang menggunakan fungsi deteksi seperti jumlah spektral, produk spektral atau fungsi auto-korelasi ada. Seseorang memulai topik terkait baru-baru ini.

  4. Apa pengorbanannya? Lebih khusus lagi, tingkat akurasi frekuensi apa yang dapat saya harapkan untuk jendela yang cukup pendek? (Saya mengerti ukuran jendela dalam CQT adalah variabel - seberapa banyak?) Bahkan lebih khusus lagi, seberapa dekat saya bisa mendapatkan kira-kira. Tujuan dari perbedaan frekuensi 0,5% dengan jendela 0,005?

    Seperti yang dikatakan sebelumnya, dengan jendela 0,005, Anda dapat mengharapkan sekitar 200Hz "kebocoran frekuensi". Itu benar-benar masalah hanya ketika Anda memiliki 2 sinusoid dengan frekuensi yang lebih dekat dari 200Hz, sehingga FT tidak akan dapat menunjukkan bahwa mereka adalah 2 sinusoid yang berbeda. Yah, kami jauh dari 0,5% Anda (ngomong-ngomong, semitone berada di 6% dari frekuensi!) Dan 0,005s benar-benar agak kecil untuk tujuan Anda. Namun, jika Anda ingin memberikan perkiraan setiap 0,005, Anda masih dapat memproses frame yang tumpang tindih lebih lama, seperti yang biasanya dilakukan dalam pemrosesan suara / musik. Itukah yang sebenarnya Anda inginkan?

    Nk=Fsfk(21/B-1)
    BB=48fk=100Hzmembutuhkan sekitar 0,7 jendela panjang. Bukan apa-apa untuk mengatakan bahwa kita kemudian kehilangan sedikit resolusi temporal ... Tetapi seperti yang disebutkan sebelumnya, ini hanya masalah jika kita melupakan struktur bunyi. Selain itu, psychoacoustics menganggap bahwa di bawah 500Hz, manusia tidak benar-benar membedakan sinusoid dengan baik: bahkan manusia ditantang di sana. Tentu saja, kita dapat berharap komputer kita dapat melakukan lebih baik daripada kita, tetapi di sini, kita menghadapi masalah yang sulit!

    Akhirnya, perhatikan bahwa ada cara lain untuk menghitung representasi frekuensi waktu dari suara, pertimbangkan misalnya bank filter gammatone. Keuntungan dari CQT yang saya sebutkan sebelumnya adalah bahwa ada perangkat lunak untuk transformasi dan pembalikannya. Secara pribadi, saya masih tetap menggunakan STFT, karena kesederhanaannya dan karena, sejauh ini, saya tidak pernah membutuhkan resolusi yang lebih baik dalam frekuensi rendah, bahkan untuk pemisahan sumber.

    [Schoerkhuber2010] Schoerkhuber, C. dan Klapuri, A., "Constant-Q transform toolbox untuk pemrosesan musik,", Konferensi Suara dan Musik ke-7, Barcelona, ​​Spanyol, 2010.


Sebuah komentar kecil: CQT dapat membantu menyelesaikan poin 1 dan 2 dari Anda, tetapi bukan poin 3. Adapun poin 3, selalu ada pertukaran antara resolusi waktu dan frekuensi, dan jika Anda menginginkan resolusi frekuensi yang baik di rendah komponen frekuensi, Anda kemungkinan besar harus menerima untuk kehilangan resolusi waktu. Sekarang, untuk estimasi pitch, mungkin ada beberapa solusi lain, Anda dapat membaca milik saya dalam tesis PhD saya jika Anda tertarik: D
Jean-louis Durrieu

Saya tidak begitu mengerti. Saya tahu Anda tidak mendapatkan apa pun secara gratis - Saya tidak dapat mengharapkan algoritma untuk secara akurat mendeteksi frekuensi yang belum diambil sampelnya pada resolusi yang baik untuk setidaknya beberapa periode frekuensi terendah. Tetapi sampel 0,1 detik pada frekuensi 44 kHz sudah cukup untuk memuat berbagai frekuensi, yang dapat dibedakan secara akurat oleh manusia (dalam istilah relatif - "inilah angka 5", "ada flat yang berkurang ke-4", dll.), Buktikan info ada di suatu tempat. FFT tidak dapat mendeteksi ini untuk frekuensi rendah dan tinggi, tetapi Anda mengatakan algoritma lain dapat: apa untungnya?
bryhoyt

Dari semua jawaban yang sangat baik di atas, CQT sepertinya paling cocok untuk pertanyaan yang saya ajukan. Apa pengorbanannya? Lebih khusus lagi, tingkat akurasi frekuensi apa yang dapat saya harapkan untuk jendela yang cukup pendek? (Saya mengerti ukuran jendela dalam CQT adalah variabel - seberapa banyak?) Bahkan lebih khusus lagi, seberapa dekat saya bisa mendapatkan kira-kira. Tujuan dari perbedaan frekuensi 0,5% dengan jendela 0,005? (Itulah perkiraan kasar saya tentang kapan manusia dapat mulai mendengar sesuatu yang tidak selaras atau tidak tepat)
bryhoyt

5

Pertama, dengan pendekatan transformasi Fourier jangka pendek klasik, ada alternatif untuk interpolasi - khususnya teknik yang memanfaatkan informasi fase untuk memulihkan frekuensi sesaat ( Lihat pertanyaan ini ) yang dapat memberi Anda posisi puncak spektral yang sangat akurat tanpa peningkatan ukuran FFT. Kekurangannya, seperti yang Anda katakan dengan benar, adalah bahwa Anda tidak meningkatkan kemampuan sistem untuk membedakan puncak yang berdekatan - tetapi ini sudah merupakan peningkatan besar dibandingkan dengan menggunakan frekuensi pusat dari indeks bin FFT.

srFFT_ssayaze

Ada pendekatan brute-force lain yang berfungsi: "selidiki" sinyal Anda dengan eksponensial kompleks berjendela (wavelet Gabor). Ini ditandai dengan frekuensi pusat, waktu pusat, dan bandwidth (yang mengukur bagaimana wavelet tersebar dari waktu ke waktu atau dari frekuensi). Anda harus mengevaluasi banyak, banyak, banyak korelasi antara sinyal Anda dan wavelet ini pada offset waktu, frekuensi, dan bandwidth yang Anda inginkan. Hasilnya akan sama dengan STFT "ubin" yang sangat fleksibel di mana ukuran jendela optimal dipilih untuk setiap rentang waktu dan setiap pita frekuensi. Selain biaya komputasi, downside adalah bahwa tidak ada algoritma yang efisien, dan tidak ada algoritma sebab-akibat (Anda akan perlu tahu sebanyak sampel di muka sebagai wavelet terpanjang dalam kamus Anda). Jika Anda ingin bereksperimen dengan teknik-teknik ini,MPTK .

k

  • k
  • Mereka berkinerja baik di hadapan white noise - ini membutuhkan sinyal untuk memutih sebelum analisis; melakukan analisis dalam saluran individual bank filter juga membantu.

Ini mahal secara komputasi, tetapi mereka dapat bekerja secara online, dengan jendela pendek jika pesanan model dan / atau kebisingan rendah.


4

Frekuensi atau nada? Sudah ada banyak makalah penelitian dan buku tentang persepsi pitch manusia. Tetapi, IIRC, manusia cenderung buruk dalam "mengekstraksi" frekuensi secara akurat kecuali mereka kebetulan sangat mendasar. Dan beberapa puncak frekuensi dalam "pita kritis" cenderung dianggap sebagai kebisingan. Jadi metode apa pun dengan "ketelitian manusia dekat" juga mungkin harus menyertakan beberapa kegagalan estimasi persepsi manusia juga.

FFT hanyalah kumpulan filter yang tidak optimal untuk banyak tujuan kecuali ortogonalitas dan keterbalikan adalah persyaratan. Bank filter lain dimungkinkan jika Anda tidak memerlukan keduanya (dan persepsi manusia jelas tidak), seperti bank filter frekuensi MEL. Setelah puncak frekuensi diidentifikasi oleh bank filter frekuensi MEL, analisis lebih lanjut dengan interpolasi FFT atau teknik vocoder fase mungkin berguna untuk menyempurnakan estimasi frekuensi dari setiap puncak frekuensi spektral terisolasi.

Perhatikan bahwa tidak ada informasi lebih lanjut yang benar-benar dikumpulkan oleh salah satu teknik pemfilteran ini yang digunakan selama rentang data domain waktu yang sama, dibandingkan dengan FFT. Apa yang terjadi sebenarnya adalah hilangnya informasi agar lebih cocok dengan "ketidaktepatan" atau anomali sistem pendengaran manusia.

Dan estimasi pitch dari serangkaian frekuensi adalah masalah yang sama sekali berbeda, lagi-lagi topik dengan banyak makalah penelitian dan bab dalam buku-buku tentang audiologi dan semacamnya.

Bagian terakhir dari pertanyaan Anda tentang kinerja mungkin adalah ikan haring merah. Satu dapat melakukan puluhan FFT dan puluhan bank filter yang berbeda secara real-time pada prosesor ponsel hari ini. Diberikan pustaka FFT yang sangat efisien yang tersedia dari vendor CPU, FFT dengan 1000's "kelebihan" nampan mungkin lebih efisien daripada bank filter yang secara signifikan lebih kecil tetapi lebih berkode naif.


Jawaban yang sangat informatif, terima kasih. Saya menyadari perbedaan antara nada dan frekuensi, tetapi jawaban Anda benar-benar membantu menyoroti seberapa besar akurasi manusia tergantung pada suara yang memenuhi persyaratan tertentu. Itu berdering sesuai dengan pengetahuan saya tentang harmoni bahwa manusia sangat buruk dalam mengekstraksi frekuensi yang bukan nada dasar. Saya dapat secara akurat membedakan interval in-tune dari satu sama lain, dan dari interval out-of-tune (interval konsonan lebih mudah daripada dissonan). Tetapi saya akan kesulitan membedakan dua interval yang tidak selaras (selain "flat", "sangat flat", "tajam", dll).
bryhoyt

2

Ada banyak alternatif, tetapi itu tergantung pada apa yang Anda lakukan. Secara fisik, saya berpendapat telinga kita lebih seperti bank filter paralel daripada FFT, yang memberi mereka resolusi waktu yang baik, dan proses yang disebut "fokus" memberi mereka resolusi frekuensi yang baik. Jadi, dalam beberapa kasus, Anda secara teoritis bisa menggunakan bank filter, tetapi ini membutuhkan banyak pemrosesan membuat Anda memiliki banyak data untuk diproses.

Dimungkinkan untuk melihat wavelet sebagai satu set filter yang sangat efisien dan terkait. Masalah dengan wavelet untuk analisis musik dan audio adalah bahwa mereka biasanya hanya memberi Anda resolusi 1 oktaf (walaupun Anda dapat melakukan berbagai hal tentang ini, saya belum benar-benar melihat wavelet sangat berguna dalam audio).

Pendekatan lain adalah dengan menggunakan windows FFT yang tumpang tindih. Anda dapat meningkatkan resolusi frekuensi FFT dengan melihat tidak hanya pada informasi besarnya, tetapi juga informasi fase. Ini memungkinkan Anda untuk menggunakan jendela yang jauh lebih pendek daripada yang mungkin Anda gunakan, yang menghasilkan kinerja yang lebih baik dan resolusi waktu yang lebih baik. Jendela yang tumpang tindih sulit disintesis ulang dengan benar, dan membuat terlalu banyak asumsi tentang fase juga bisa berbahaya. Meskipun demikian, trik semacam ini mungkin merupakan pokok dari penyelesaian masalah analisis frekuensi-waktu yang kompleks.

Ada sejumlah alat lain untuk aplikasi spesifik juga.


1
xnXkmwn
Xfm=nxn+mwne-j2πnkN
Nxnm
Xfm=halxhalwhal-me-j2π(hal-m)kN=halxhalhm-hal
hn=w-nej2πnkN

1
STFT mungkin merupakan bank filter, tetapi tidak semua bank filter adalah STFT.
Bjorn Roche
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.