Ç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.
Diziye okuyabileceğiniz bir .wav dosyası gibi sesli konuşma örneğinizle başlayın. Bu dizi ara , aralıkları (böylece örnekleri). Değerler sanırım ses yoğunluğuna karşılık geliyor - genlikler.0 , 1 , … , N - 1 N
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 .
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 ]
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 [ 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.
Ş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.
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ı?