Membantu menghitung / memahami MFCC: Koefisien Cepstrum Mel-Frequency

17

Saya telah membaca sedikit demi sedikit secara online tetapi saya tidak bisa menyatukan semuanya. Saya memiliki beberapa latar belakang pengetahuan tentang sinyal / hal-hal DSP yang harus cukup prasyarat untuk ini. Saya tertarik akhirnya coding algoritma ini di Jawa tapi saya belum memahaminya sepenuhnya karena itulah saya di sini (itu dihitung sebagai matematika, kan?).

Begini menurut saya cara kerjanya seiring dengan kesenjangan dalam pengetahuan saya.

  1. Mulailah dengan sampel pidato audio Anda, ucapkan file .wav, yang dapat Anda baca menjadi sebuah array. Sebut array ini , di mana berkisar dari (jadi sampel). Nilai sesuai dengan intensitas audio yang saya kira - amplitudo.x[n]n0,1,,N1N

  2. Pisahkan sinyal audio menjadi "bingkai" berbeda 10ms atau lebih di mana Anda menganggap sinyal ucapan "diam". Ini adalah bentuk kuantisasi. Jadi jika laju sampel Anda adalah 44.1KHz, 10ms sama dengan 441 sampel, atau nilai .x[n]

  3. Lakukan transformasi Fourier (FFT demi komputasi). Sekarang apakah ini dilakukan pada seluruh sinyal atau pada setiap frame ? Saya pikir ada perbedaan karena secara umum transformasi Fourier melihat semua elemen sinyal, jadi bergabung dengan bergabung dengan di mana adalah frame yang lebih kecil. Ngomong-ngomong, katakanlah kita melakukan beberapa FFT dan berakhir dengan untuk sisa ini.x[n]F(x[n])F(x1[n])F(x2[n])F(xN[n])xi[n]X[k]

  4. Pemetaan ke skala Mel, dan logging. Saya tahu cara mengubah angka frekuensi reguler ke skala Mel. Untuk setiap dari ( "x-axis" jika Anda akan mengizinkan saya), Anda dapat melakukan rumus di sini: http://en.wikipedia.org/wiki/Mel_scale . Tetapi bagaimana dengan "nilai-y" atau amplitudo ? Apakah mereka hanya tetap nilai yang sama tetapi bergeser ke tempat yang sesuai pada sumbu Mel (x-) yang baru? Saya melihat di beberapa kertas ada sesuatu tentang logging nilai aktual karena jika mana salah satu sinyal tersebut dianggap sebagai noise yang tidak Anda inginkan , operasi log pada persamaan ini mengubah noise multiplikatif menjadi noise tambahan, yang diharapkan dapat disaring (?).kX[k]X[k]X[k]X[k]=A[k]B[k]

  5. Sekarang langkah terakhir adalah mengambil DCT Anda yang telah dimodifikasi dari atas (namun akhirnya diubah). Kemudian Anda mengambil amplitudo dari hasil akhir ini dan itu adalah MFCC Anda. Saya membaca sesuatu tentang membuang nilai frekuensi tinggi.X[k]

Jadi saya mencoba untuk benar-benar memahami cara menghitung orang-orang ini langkah demi langkah, dan jelas ada beberapa hal yang menghindarkan saya dari atas.

Juga, saya pernah mendengar tentang menggunakan "bank filter" (array band pass filter pada dasarnya) dan tidak tahu apakah ini mengacu pada pembuatan frame dari sinyal asli, atau mungkin Anda membuat frame setelah FFT?

Terakhir, ada sesuatu yang saya lihat tentang MFCC yang memiliki 13 koefisien?

YoungMoney
sumber
1
Ini adalah pertanyaan yang bagus, tetapi ada banyak yang harus dijawab. Saya akan merekomendasikan memecah ini menjadi 2-3 pertanyaan yang berbeda (Anda dapat merujuk satu dari yang lain jika Anda ingin menjaga kontinuitas) sehingga dapat lebih mudah dijawab.
jonsca
Karena sebelumnya Anda telah mengajukan pertanyaan yang sama pada math.SE (dan telah disarankan bahwa dsp.SE adalah rumah yang lebih baik untuk itu), mungkin Anda harus menghapus pertanyaan pada math.SE.
Dilip Sarwate
Saya menghapus versi di math.SE
YoungMoney
Sangat bagus dan infotmative tutorial
1
Hei, Anda mengatakan dalam pertanyaan Anda bahwa "Memetakan ke skala Mel, dan masuk. Saya tahu cara mengubah angka frekuensi reguler ke skala Mel.". dapatkah Anda membantu saya menghitung bagian ini. Karena saya memiliki output FFt saya x [k] = 1 * 184 tetapi filter pass band segitiga saya ditetapkan 20 * 3. lalu bagaimana saya bisa melipatgandakan keduanya. Please ASAp
Ayush Agrawal

Jawaban:

25

Selangkah demi selangkah...

1. & 2 . Ini benar. Perhatikan bahwa frame biasanya tumpang tindih, misalnya, frame 0 adalah sampel 0 hingga 440; bingkai 1 adalah sampel 220 hingga 660; bingkai 2 adalah sampel 440 hingga 880 dan seterusnya ... Perhatikan juga bahwa fungsi jendela diterapkan pada sampel dalam bingkai.

3 . Transformasi Fourier dilakukan untuk setiap frame. Motivasi di balik ini sederhana: sinyal wicara bervariasi dari waktu ke waktu, tetapi diam di atas segmen pendek. Anda ingin menganalisis setiap segmen pendek secara individual - karena pada segmen ini sinyalnya cukup sederhana untuk dijelaskan secara efisien oleh beberapa koefisien. Pikirkan seseorang yang mengatakan "halo". Anda tidak ingin melihat semua fonem diciutkan menjadi satu spektrum tunggal (FFT menciutkan informasi temporal) dengan menganalisis semua suara sekaligus. Anda ingin melihat "hhhhheeeeeeeeeeooooooooooo" untuk mengenali kata tahap demi tahap, sehingga harus dipecah menjadi segmen pendek.

4 . "Memetakan ke skala Mel" menyesatkan dan mungkin itulah sebabnya Anda bingung. Deskripsi yang lebih baik untuk langkah ini adalah: "Hitung energi sinyal melalui setumpuk filter yang disetel ke frekuensi skala mel". Inilah cara melakukannya. Kami menganggap frekuensi (nilai yang umum digunakan adalah ) dengan jarak yang sama sesuai dengan skala mel, antara 20 Hz (bagian bawah rentang pendengaran) dan frekuensi Nyquist. Contoh praktis: Sinyal dicicipi pada 8kHz dan kami ingin 40 nampan. Karena 4kHz (Nyquist) adalah 2250 mel, frekuensi pusat filterbank adalah: 0 mel, 2250/39 mel, 2 x 2250/39 mel .. 2250 mel.NN=40

Setelah frekuensi ini ditetapkan, kami menghitung jumlah bobot FFT (atau energi) tertimbang di sekitar masing-masing frekuensi ini.

Lihatlah gambar berikut, mewakili bank filter dengan 12 nampan:

Filterbank frekuensi mel dengan 12 saluran

Tempat sampah ke-8 memiliki frekuensi pusat sekitar 2kHz. Energi di tempat sampah ke-8 diperoleh dengan menjumlahkan energi FFT tertimbang di kisaran 1600 hingga 2800 Hz - dengan berat memuncak sekitar 2kHz.

Catatan Implementasi: Kumpulan jumlah tertimbang ini dapat dilakukan dalam satu operasi - penggandaan matriks dari "filterbank matrix" oleh vektor energi FFT.

Jadi pada tahap ini kita telah "meringkas" spektrum FFT menjadi satu set nilai energi 40 (12 dalam ilustrasi), masing-masing sesuai dengan rentang frekuensi yang berbeda. Kami mengambil log dari nilai-nilai ini.

5 . Langkah selanjutnya adalah mengambil DCT dari urutan 40 log-energi ini. Ini akan menghasilkan 40 nilai. Koefisien pertama adalah MFCC (Biasanya, ). Sebenarnya, koefisien DCT pertama adalah jumlah dari semua energi log yang dihitung pada langkah sebelumnya - jadi ini adalah ukuran keseluruhan dari kenyaringan sinyal dan tidak terlalu informatif mengenai kandungan spektral sinyal yang sebenarnya - sering dibuang. untuk aplikasi pengenalan suara atau pengeras suara di mana sistem harus kuat terhadap variasi kenyaringan.KK=13

pichenettes
sumber
Hanya pertanyaan singkat tentang Mel filterbank - kisaran tinggi / amplitudo dari 1,8 - 2 apakah ini penting atau dapatkah satuan (1) tinggi?
YoungMoney
1
Ini tidak penting. Efek menggunakan maks. amplitudo pada 1,0 vs 2,0 hanya akan menggeser energi log dengan konstanta pada langkah 4., dan dengan demikian hanya akan berdampak pada koefisien pertama pada langkah 5 (yang sering dibuang pula). Perhatikan bahwa beberapa implementasi menggunakan normalisasi energi sehingga semakin lebar filternya, semakin rendah amplitudo puncaknya ( i.imgur.com/IOaLa.gif ). Ini dapat menyebabkan perubahan kinerja kecil dalam aplikasi pengenalan. Jika Anda melihat implementasi MFCC yang digunakan, sebenarnya ada banyak variasi kecil di setiap langkah - bit.ly/ULatdL
pichenettes
Ini adalah topik lama di sini tapi ada sesuatu yang perlu saya tanyakan tentang grafik. Jika Nyquist adalah 4kHz mengapa filter terbatas-band melebihi titik 4kHz. apakah itu OK untuk MFCC. Biasanya, Anda tidak ingin filter untuk melewati Nyquist? Apakah saya benar?
Celdor
3
Apakah Anda memiliki referensi mengapa N = 40 mel frekuensi bankbank (atau 26, nilai umum lain yang saya lihat) digunakan?
James Owers
1
dari mana datangnya 39 mellangkah 4?
Gert Kommer