2017-11-19 4 views
0

Unten ist der Code, den ich geschrieben habe, um eine mel dreieckige Filterbank zu erstellen.Filter für FFT-Signale für die Analyse und MFCC

Ich beginne mit 300 bis 8000 Hz-Bereich, wandeln Sie die Frequenz in mels, und dann mels zurück in Frequenz, um dann die fft_bin Zahlen zu erhalten.

clear all; 

g=[300 8000]; % low freqncy and fs/2 for the highest frequency 

freq2mel=1125*log(1+(g/700)); % creating mel scale from the frequency 
           % answer [401.25 2834.99] 

f=linspace(0,2835,12); % if we want 10 filter banks that we use the 
         two endpoints and it will put 10 banks between them 

         % answer is [401.25 622.50 843.75 1065.0 1286.25 1507.50 1728.74 
            1949.99 2171.24 2392.49 2613.74 2834.99] 

mel2freq=700*(exp(f/1125)-1); % converting the mel back into frequency 

           %answer is [300 517.33 781.90 1103.97 1496.04 1973.32 2554.33 
              3261.62 4122.63 5170.76 6446.70 8000] 

fft_bins=floor((mel2freq/16000)*512); % creating fft bins 

           %answer is [9 16 25 35 47 63 81 104 132 165 206 256] 

Mein Problem ist dies. Ich stecke danach fest. Ich sehe immer wieder die stückweise Funktion der Filterbank, aber ich verstehe nicht, was K in dieser Funktion ist. Ist k das Array von $$ \ mid (FFT) \ mid^2 $$ Zahlen aus dem Hamming-Fenster? wie man den tatsächlichen Filter mit der dreieckigen Ausgabe mit der Magnitude 1 erhält, um die $ \ mid (FFT) \ mid^2 $ zu übergeben, um meine MFCCs zu erhalten. Kann mir bitte jemand helfen?

enter image description here enter image description here

Antwort

0

Normalerweise, wenn man diese Art von Filterung tun, müssen Sie Spektrum in einer 1D-Array und dann haben Sie eine Mel-Filterbank in 2D-Matrix mit einer Dimension, den FFT-Bins auf dem Spektrum passenden Array, und eine weitere Dimension ist Ihr Ziel Mel Bands. Sie multiplizieren sie und erhalten Ihr 1D Mel-Spektrum.

Die H_m Funktion beschreibt wirklich nur ein Dreieck um m zentriert ist, wo das Zentrum m Mel-Band ist und k ist die Frequenz von 0 bis Fs/2. Theoretisch sollte der Parameter k kontinuierlich sein. Sie können davon ausgehen, dass k ein FFT-Bin ist und es wird funktionieren, aber Sie werden keine guten Ergebnisse bei niedrigen Frequenzen bekommen, wo Sie das gesamte Mel-Band 1 oder 2 FFT-Bins abdecken. Wenn Sie eine bessere Auflösung benötigen, überlegen Sie, wie viel von dem Dreieck in einem bestimmten FFT-Bin enthalten ist.