Sir my program howing a error. how to rectify the error.

[audio, fs1] = audioread('noisyroaradultfemale.wav');
%sound(x,fs1);
ts1=1/fs1;
N1=length(audio);
Tmax1=(N1-1)*ts1;
t1=(0:ts1:Tmax1);
figure;
plot(t1,audio),xlabel('Time'),title('Original audio');
fs2 = (20/441)*fs1;
y=resample(audio,2000,44100);
%sound(y,fs2);
ts2=1/fs2;
N2=length(y);
Tmax2=(N2-1)*ts2;
t2=(0:ts2:Tmax2);
figure;
plot(t2,y),xlabel('Time'),title('resampled audio');
% Step 2: Frame Blocking
frameSize=600;
% frameOverlap=128;
% frames=enframe(y,frameSize,frameOverlap);
% NumFrames=size(frames,1);
frame_duration=0.03;
frame_len = frame_duration*fs2;
framestep=0.01;
framestep_len=framestep*fs2;
% N = length (x);
num_frames =floor(N2/frame_len);
% new_sig =zeros(N,1);
% count=0;
% frame1 =x(1:frame_len);
% frame2 =x(frame_len+1:frame_len*2);
% frame3 =x(frame_len*2+1:frame_len*3);
frames=[];
for j=1:num_frames
frame=y((j-1)*framestep_len + 1: ((j-1)*framestep_len)+frame_len);
% frame=x((j-1)*frame_len +1 :frame_len*j);
% identify the silence by finding frames with max amplitude less than
% 0.025
max_val=max(frame);
if (max_val>0.025)
% count = count+1;
% new_sig((count-1)*frame_len+1:frame_len*count)=frames;
frames=[frames;frame];
end
end
% Step 3: Hamming Windowing
NumFrames=size(frames,1);
hamm=hamming(500)';
windowed = bsxfun(@times, frames, hamm);
% Step 4: FFT
% Taking only the positive values in the FFT that is the first half of the frame after being computed.
ft = abs( fft(windowed,500, 2) );
plot(ft);
% Step 5: Mel Filterbanks
Lower_Frequency = 100;
Upper_Frequency = fs2/2;
% With a total of 22 points we can create 20 filters.
Nofilters=20;
lowhigh=[300 fs2/2];
%Here logarithm is of base 'e'
fmin=10;
fmax=10000;
k=0.88;
x=0:1;
A=fmin/(1-k);
a=log10((fmax/A)+k);
%%perceived_freq_Fp=(1/a)*(ln((f/a)+K)/ln10);
%perceived_freq_F=A*((10^(a*x))-k);
f=A*((10.^(A*x))-k);
figure;
plot(f);
title('Greenwood scale');
%Converting to frequency resolution
fres=floor(((frameSize)+1)*f/fs2);
%Creating the filters
for m =2:length(fres)-1
for k=0:0.88
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);
title('Greenwood filterbank');
xlabel('Frequency');
ylabel('Magnitude');
% Step 6: Nautral Log and DCT
% pkg load signal
%Here logarithm is of base '10'
logged=log10(bankans);
for i=1:NumFrames
gfcc(i,:)=dct2(logged(i,:));
end
%plotting the MFCC
figure
hold on
for i=1:NumFrames
plot(gfcc(i,1:13));
figure;
title('gfcc');
end
hold off
% save c5 mfcc
d= gfcc;
save i d
load i.mat
X=d;
the error is like this,"Undefined function or variable 'H'.
Error in gfccc (line 107)
bankans(i,j)=sum((ft(i,:).*H(j,:)).^2);"

Réponses (1)

The variable 'H' is used but does not exist. I see that you are trying to assign to 'H' in a loop above this failure, and I'll guess this code is never run. Try setting a breakpoint around the statements ans single-step through the code to spot the error:
for m =2:length(fres)-1
for k=0:0.88
In particular, that inner 'for' loop looks supect - that will generated just k==0

7 commentaires

now also it showing the error
x=0:1;
So x is a vector of length 2.
f=A*((10.^(A*x))-k);
f is a vector of length 2 because it uses x which is a vector of length 2.
fres=floor(((frameSize)+1)*f/fs2);
fres is a vector of length 2 because it uses f which is a vector of length 2.
for m =2:length(fres)-1
with fres being a vector of length 2, then length(fres) is 2, and length(fres)-1 is 1. So you have for m=2:1 which will not execute the body at all. Therefore H will not get assigned to.
Sir then how i will correct this code. I have to plot the gfcc.
Why is x=0:1 instead of something longer?
Whre x is the cochlea position. I dont know what value i have to choose. randomply i have choosed 0:1
Well look at your code:
%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
If the "20 filterbanks" is intended to correspond with "Nofilters" then it follows that H is expected to be an array with at least 20 rows, which is to say Nofilters rows.
The loop
for m =2:length(fres)-1
consistently assigns to H(m-1,something). Therefore in order for the final m-1 to equal Nofilters, it follows that the maximum m must equal Nofilters+1 . You are defining the maximum m as length(fres)-1 and from there it follows that for the right number of rows to be created in H, that length(fres)-1 must equal Nofilters+1 and so that length(fres) = Nofilters+2 .
This suggests that you should use
x = linspace(0, 1, Nofilters+2);
Now it showing the error like this,
Subscript indices must either be real positive integers or logicals.
Error in gfccc (line 94)
H(m-1,k) = 0;

Connectez-vous pour commenter.

Catégories

En savoir plus sur Audio Plugin Creation and Hosting dans Centre d'aide et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by