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?

2 vues (au cours des 30 derniers jours)
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);

Réponses (0)

Catégories

En savoir plus sur Feature Extraction dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by