Asked by Manolis Michailidis
on 1 Apr 2015

Hello, i know there are already plenty functions that create mel filter banks , but i need to create my own function. I found i decent guide http://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/ but i got stuck in the creation of triangular mel filters . So i need to make them form that equation

where m is the mel scaled frequencies and k is the length of DFT. I tried the code below, but i get warnings that exceded indeces

f_low=300;

f_high=8000;

filt_num=12;

fs=16000;

%%computing band in mel-scale

mel_low=2595*log10(1+(f_low/100));

mel_high=2595*log10(1+(f_high/100));

%%creating the mel-scaled vector

Mel = linspace(mel_low,mel_high,filt_num);

%%computing frequencies of the Mel vector

%FREQ=700*((10.^(Mel/2595))-1);

Freq=mel2hz(Mel);

%%convert frequencies to nearest bins

for i=1:filt_num

f(i) = floor((nfft+1)*Freq(i)/fs);

end

for m =2:length(Mel)+2

for k=1:nfft+1

if (k<f(Mel(m)-1));H(Mel,k)=0;

elseif (k>=f(Mel(m)-1) && k<=(f(Mel(m))));H(Mel,k)=(k-f(Mel(m)-1))/(f(Mel(m))-f(Mel(m)-1));

elseif (k>=f(Mel(m)) && k<=f(Mel(m)+1));H(Mel,k)=(f(Mel(m)+1)-k)/(f(Mel(m)+1)-f(Mel(m)));

elseif (k>f(Mel(m)+1));H(Mel,k)=0;

end

end

end

Please help any advice appreciated, thank in advance.

Answer by Christiaan
on 2 Apr 2015

Dear Manolis,

In your code you have computed an array 'f', where the frequencies are defined. These frequencies are calculated from this code: '' for i=1:filt_num f(i) = floor((nfft+1)*Freq(i)/fs);end '' However you have not specified nfft, you cannot calculate this. If you mean for nfft, the side of your FFT vector, please have a look at this website how NFFT in MATLAB is defined.

Then you wrote down the following in your code: ' f(Mel(m)) '

However when f has only 12 variables and Mel(1) is equal to a value higher then 12, MATLAB will give an error.

What may can help you is to define a formula to calculate your H value:

function H=formula(k,f,m)

if k<f(m-1)

H = 0;

elseif (k>=f(m-1)&&k<=f(m))

H = (k-f(m-1))/(f(m)-f(m-1));

elseif (k>=f(m+1)&&k<=f(m))

H = (f(m+1)-k)/(f(m+1)-f(m));

elseif k>f(m+1)

H = 0;

end

Then you can call the function in the mainfile to use in the loop.

Good luck! Christiaan

Manolis Michailidis
on 2 Apr 2015

Hello Cristian and thanks for you reply, yes indeed i forgot to mention that i use fft with 128 points.Anyway the idea is to create overlapped triangular filters (a matrix H[number_of_filters,nfft_points]) that will have different widths something like this

Anyway thanks again.

Awais Asghar
on 4 Apr 2018

Sign in to comment.

Answer by Aula Rizkiyani
on 17 Jul 2017

Hello manolis and christian, i've tried the function that you both gave but still wrong.

hz2mel = @ (hz) (1127*log(1+hz/700)); %Hertz to mel mel2hz = @ (mel) (700*exp(mel/1127)-700); %mel to Hertz f_low=300; f_high=8000; filt_num=12; fs=16000;

%% computing band in mel-scale mel_low=2595*log10(1+(f_low/100)); mel_high=2595*log10(1+(f_high/100));

%% creating the mel-scaled vector Mel = linspace(mel_low,mel_high,filt_num);

%% computing frequencies of the Mel vector Freq=700*((10.^(Mel/2595))-1); Freq=mel2hz(Mel);

Then i give the function that is explained by christian. like this : %% convert frequencies to nearest bins function H=formula(k,f,m) if k<f(m-1) H = 0; elseif (k>=f(m-1)&&k<=f(m)) H = (k-f(m-1))/(f(m)-f(m-1)); elseif (k>=f(m+1)&&k<=f(m)) H = (f(m+1)-k)/(f(m+1)-f(m)); elseif k>f(m+1) H = 0; end

After that I call the variable "Freq" to display on the plot. So the results I get like this.

Can you help me. thank you...

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## Angel David (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/195651-creating-mel-triangular-filters-function#comment_429061

## Suchithra K S (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/195651-creating-mel-triangular-filters-function#comment_684685

Sign in to comment.