MFCC'lerin hesaplanmasına / anlaşılmasına yardımcı olun: Mel-Frequency Cepstrum Katsayıları


17

Çevrimiçi olarak bitleri ve parçaları okuyorum ama hepsini bir araya getiremiyorum. Bunun için yeterli önkoşullar olması gereken sinyaller / DSP şeyleri hakkında temel bilgilerim var. Sonunda Java'da bu algoritmayı kodlamakla ilgileniyorum ama tam olarak anlamadım, bu yüzden buradayım (matematik olarak sayılıyor, değil mi?).

İşte bilgimdeki boşluklarla birlikte nasıl çalıştığını düşünüyorum.

  1. Diziye okuyabileceğiniz bir .wav dosyası gibi sesli konuşma örneğinizle başlayın. Bu dizi ara x[n] , aralıkları (böylece örnekleri). Değerler sanırım ses yoğunluğuna karşılık geliyor - genlikler.0 , 1 , , N - 1 Nn0,1,...,N--1N-

  2. Ses sinyalini, konuşma sinyalinin "sabit" olduğunu düşündüğünüz 10ms gibi "karelere" ayırın. Bu bir tür kantifikasyon şeklidir. Örnekleme hızınız 44,1KHz ise, 10ms 441 örneğe veya değerlerine eşittir .x[n]

  3. Fourier dönüşümü yapın (hesaplama uğruna FFT). Şimdi bu, tüm sinyalin üzerinde mi, yoksa nin her bir ayrı karesinde mi yapılıyor ? Bence bir fark var çünkü genel olarak Fourier dönüşümü bir sinyalin tüm elemanlarına bakıyor, bu yüzden ile katıldı ile katıldı; burada daha küçük karelerdir. Her neyse, biraz FFT yaptığımızı ve bunun geri kalanında ile sonuçlandığımızı varsayalım .F ( x [ n ] ) F ( x 1 [ n ] ) F ( x 2 [ n ] ) F ( x N [ n ] ) x i [ n ] X [ k ]x[n]F(x[n])F(x1[n])F(x2[n])...F(xN-[n])xben[n]X[k]

  4. Mel ölçeğine eşleme ve günlüğe kaydetme. Düzenli frekans sayılarını Mel skalasına nasıl çevireceğimizi biliyorum. X [ k ] nin her ( bana izin verirseniz "x ekseni"), formülü burada yapabilirsiniz: http://en.wikipedia.org/wiki/Mel_scale . Peki "y-değerleri" ne veya X [ k ] ' nin genliklerine ne dersiniz ? Sadece aynı değerler olarak kalıyorlar mı, ancak yeni Mel (x-) eksenindeki uygun noktalara mı kayıyorlar? Bazı makalelerde X [ k ] ' nın gerçek değerlerinin kaydedilmesiyle ilgili bir şey olduğunu gördüm çünkü o zaman X [ k ] = A [ kkX[k]X[k]X[k] bu sinyallerin birinin istemediğiniz gürültü olduğu varsayılırsa, bu denklem üzerindeki günlük işlemi çarpma gürültüsünü, umarım filtrelenebilen (?) Toplayıcı gürültüye dönüştürür.X[k]=bir[k]*B[k]

  5. Şimdi son adım, değiştirilmiş ' nizin bir DCT'sini yukarıdan almaktır (ancak değiştirildi). Sonra bu nihai sonucun genliklerini alırsınız ve bunlar sizin MFCC'lerinizdir. Yüksek frekans değerlerini atmakla ilgili bir şey okudum.X[k]

Bu adamların adım adım nasıl hesaplanacağını gerçekten irdelemeye çalışıyorum ve açıkça bazı şeyler yukarıdan kaçıyor.

Ayrıca, "filtre bankaları" (temelde bant geçiren filtreler dizisi) kullandığınızı duydum ve bu orijinal sinyal kareleri yapmak anlamına gelir bilmiyorum, ya da belki FFT sonra kareleri yapmak?

Son olarak, 13 katsayısı olan MFCC'lerde gördüğüm bir şey var mı?


1
Bu harika bir soru, ama burada cevaplanacak çok şey var. Bunu 2-3 farklı soruya bölmeyi tavsiye ederim (sürekliliği korumak istiyorsanız diğerinden referans verebilirsiniz), böylece daha kolay cevaplanabilir.
jonsca

Daha önce aynı soruyu math.SE ile ilgili olarak sorduğunuzdan (ve dsp.SE'nin bunun için daha iyi bir ev olduğu tavsiye edildiğinden), belki de math.SE ile ilgili soruyu silmelisiniz.
Dilip Sarwate

Math üzerindeki sürümü sildim.SE
YoungMoney

Çok güzel ve infotmative öğretici thankssssssssssssss

1
Hey u, "Mel ölçeğine eşleme ve günlüğe kaydetme. Düzenli frekans sayılarını Mel ölçeğine nasıl dönüştüreceğimizi biliyorum." bu kısmı hesaplamama yardım edebilir misin? FFt çıkışım x [k] = 1 * 184 olduğu için, ancak üçgen bant geçiren filtrem 20 * 3 olarak ayarlandı. o zaman ikisini nasıl çarpabilirim. Lütfen ASAp
Ayush Agrawal

Yanıtlar:


25

Adım adım...

1. ve 2 . Doğru. Çerçevelerin genellikle örtüştüğüne dikkat edin, örneğin, çerçeve 0, 0 ila 440 arası örneklerdir; çerçeve 1, 220 ila 660 arasındaki numunelerdir; çerçeve 2, 440 ila 880 arası örneklerdir ... Ayrıca , çerçevedeki örneklere bir pencere işlevinin uygulandığına da dikkat edin.

3 . Fourier dönüşümü her çerçeve için yapılır. Bunun arkasındaki motivasyon basittir: bir konuşma sinyali zamanla değişir, ancak kısa segmentler üzerinde sabittir. Her kısa segmenti ayrı ayrı analiz etmek istiyorsunuz - çünkü bu segmentlerde sinyal birkaç katsayı ile verimli bir şekilde tanımlanabilecek kadar basittir. "Merhaba" diyen birini düşünün. Tüm sesleri aynı anda analiz ederek tüm fonemlerin tek bir spektrumda daraltılmasını (FFT geçici bilgileri daraltır) görmek istemezsiniz. Kelime aşama aşama tanımak için "hhhhheeeeeeeeeeelloooooooooo" görmek istiyorsanız, bu yüzden kısa bölümlere ayrılmalıdır.

4 . "Mel ölçeğine eşleme" yanıltıcıdır ve muhtemelen bu yüzden kafanız karışmaktadır. Bu adım için daha iyi bir açıklama şöyledir: "Sinyal enerjisini, erimiş ölçekli frekanslara ayarlanmış bir filtre kümesiyle hesaplayın". İşte böyle yapılır. Biz göz önünde frekansları (yaygın olarak kullanılan bir değerdir , N = 40 , 20 Hz (duyma aralığının alt) ve Nyquist frekansı arasında eşit mel skalasına göre aralıklı). Pratik örnek: Sinyal 8kHz'de örneklenmiştir ve 40 kutu istiyoruz. 4kHz (Nyquist) 2250 mel olduğu için, filtre bankası merkez frekansları: 0 mel, 2250/39 mel, 2 x 2250/39 mel. 2250 mel.N-N-=40

Bu frekanslar tanımlandıktan sonra, bu frekansların her birinin etrafında FFT büyüklüklerinin (veya enerjilerinin) ağırlıklı bir toplamını hesaplarız.

12 kutuya sahip bir filtre bankasını temsil eden aşağıdaki resme bakın:

12 kanallı Mel frekans filtre bankası

8. bölmenin merkezi frekansı 2kHz civarındadır. 8. bölmedeki enerji yaklaşık 1600 ila 2800 Hz arasındaki ağırlıklı FFT enerjilerinin toplanmasıyla elde edilir - ağırlık 2kHz civarında zirveye ulaşır.

Uygulama notu: Bu ağırlıklı toplamlar tek bir işlemle yapılabilir - bir "filtre bankası matrisinin" FFT enerji vektörü ile matris çarpımı.

Bu aşamada, FFT spektrumunu, her biri farklı bir frekans aralığına karşılık gelen 40 (çizimde 12) enerji değeri kümesine "özetledik". Bu değerlerin günlüğünü alıyoruz.

KK=13


Mel filtre bankası hakkında kısa bir soru - yükseklik / genlik 1.8 - 2 arasında değişiyor bu önemli mi yoksa birim (1) yükseklik olabilir mi?
YoungMoney

1
Bu önemli değil. Maks. 1.0 ve 2.0 arasındaki genlik, log-enerjiyi sadece 4. adımda sabit olarak kaydırır ve bu nedenle sadece 5. adımdaki ilk katsayıyı etkiler (ki bu genellikle yine de atılır). Bazı uygulamaların, filtre ne kadar geniş olursa, tepe genliği ne kadar düşük olursa ( i.imgur.com/IOaLa.gif ) enerji normalizasyonu kullandığını unutmayın . Bu, tanıma uygulamalarında küçük performans değişikliklerine neden olabilir. Kullanılan MFCC uygulamalarına bakarsanız, aslında her adımda birçok küçük varyasyon vardır - bit.ly/ULatdL
pichenettes

Burada eski bir konu ama grafik hakkında sormam gereken bir şey var. Nyquist 4kHz ise, bu bant sınırlı filtreler neden 4kHz noktasını aşmaktadır. MFCC için sorun yok. Normalde filtrenin Nyquist'i geçmesini istemiyor musunuz? Haklı mıyım?
Celdor

2
N = 40 mel filtre bankası frekanslarının (veya 26, gördüğüm başka bir ortak değer) neden kullanıldığına ilişkin bir referansınız var mı?
James Owers

1
nerede gelmez 39 meladım 4'tür geliyor?
Gert Kommer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.