Sir, I tried a matlab code for feature extraction using melfrequency cepstral coefficient (mfcc) but it showing error like "Matrix dimensions must agree.". How to correct the error?
    4 views (last 30 days)
  
       Show older comments
    
The code is given below, 
clear all;
close all;
 [x,fs1]=audioread('cryrumble.wav');
%     ts1=1/fs1;
%     N1=length(x);
%     Tmax1=(N1-1)*ts1;
%     fsu=fs/(N-1);
%     t=(0:ts:Tmax);
%     f=(-fs/2:fsu:fs/2);
%     figure, subplot(411),plot(t,x),xlabel('Time'),title('Original Speech');
%     subplot(412),plot(f,fftshift(abs(fft(x)))),xlabel('Freq (Hz)'),title('Frequency Spectrum');
%       fs2 = (20/441)*fs1;
%   na=resample(audio,2000,44100);
%   N2=length(na);
 ts1=1/fs1;
    N1=length(x);
    Tmax1=(N1-1)*ts1;
    t1=(0:ts1:Tmax1);
    figure;
  plot(t1,x),xlabel('Time'),title('Original audio');
  fs2 = (20/441)*fs1;
 na=resample(x,2000,44100);
%sound(y,fs2);
   ts2=1/fs2;
   N2=length(na);
   Tmax2=(N2-1)*ts2;
   t2=(0:ts2:Tmax2);
   fsu=fs2/(N2-1);
   f=(-fs2/2:fsu:fs2/2);
% Step 1: Pre-Emphasis
a=[1];
    b=[1 -0.95];
    y=filter(b,a,na);
    subplot(413),plot(t2,y),xlabel('Time'),title('Signal After High Pass Filter - Time Domain');
    subplot(414),plot(f,fftshift(abs(fft(y)))),xlabel('Freq (Hz)'),title('Signal After High Pass Filter - Frequency Spectrum');
% Step 2: Frame Blocking
     frameSize=882;
frame_duration=0.025;
frame_len = frame_duration*fs2;
framestep=0.01;
framestep_len=framestep*fs2;
num_frames =floor(N2/frame_len);
frames=[];
for j=1:num_frames
     frame=na((j-1)*framestep_len + 1: ((j-1)*framestep_len)+frame_len);
max_val=max(frame);
   if (max_val>0.025)
        frames=[frames;frame'];
   end
end
% Step 3: Hamming Windowing
NumFrames=size(frames,1);
hamm=hamming(frame_len)';
windowed=[];
    for i=1:NumFrames
    windowed(i,:)=frames(i,:).*hamm;
    end
    % Step 4: FFT 
    for i=1:NumFrames
    ft(i,:)=abs(fft((windowed(i,:)),frame_len));     
    %plot(ft(i,:))
    end
% Step 5: Mel Filterbanks
Lower_Frequency =100;
Upper_Frequency = fs2/2;
    Nofilters=20;
    lowhigh=[100 fs2/2];
    %Here logarithm is of base 'e'
    lh_mel=1125*(log(1+lowhigh/700));
    mel=linspace(lh_mel(1),lh_mel(2),Nofilters+2);
    figure;
    plot(mel);
    xlabel('frequency in Hertz');ylabel('mels');
    title('melscale');
    melinhz=700*(exp(mel/1125)-1);
    %Converting to frequency resolution
    fres=floor(((frameSize)+1)*melinhz/fs2); 
    %Creating the filters
    for m =2:length(mel)-1
        for k=1:frameSize/2
     if k<fres(m-1)
        H(m-1,k) = 0;
    elseif (k>=fres(m-1)&&k<=fres(m))
        H(m-1,k)= (k-fres(m-1))/(fres(m)-fres(m-1));
    elseif (k>=fres(m)&&k<=fres(m+1))
       H(m-1,k)= (fres(m+1)-k)/(fres(m+1)-fres(m));
    elseif k>fres(m+1)
        H(m-1,k) = 0;    
     end 
        end
    end
        %H contains the 20 filterbanks, we now apply it to the
    %processed signal.
    for i=1:NumFrames
    for j=1:Nofilters
        bankans(i,j)=sum((ft(i,:).*H(j,:)).^2);
    end
    end
     figure;
    plot(H);
    xlabel('Frequency');ylabel('Magnitude');
    title('Mel-Frequency Filter bank');
    % Step 6: Nautral Log and DCT
%     pkg load signal
    %Here logarithm is of base '10'
    logged=log10(bankans);
    for i=1:NumFrames
        mfcc(i,:)=dct2(logged(i,:));
    end
    %plotting the MFCC
    figure 
    hold on
    for i=1:NumFrames
        plot(mfcc(i,1:13));
    end
    hold off
% save c5 mfcc
i= mfcc;
save i i
The error is like this, 
Matrix dimensions must agree.
Error in mfccc (line 111)
        bankans(i,j)=sum((ft(i,:).*H(j,:)).^2);
0 Comments
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!