Zm(k)=0;
fori=0:
N—1;
Zm(k)=Zm(k)+w(k+i);
end
j=j+1;
k=k+N/2;%每次移动半个窗
end
forw=1:
j
Q(w)=Zm(160*(w—1)+1)/(2*N);%短时平均过零率
end
subplot(3,1,3),plot(Q),grid;
3)自相关函数
N=240
y=wavread('mike。
wav’);
y=y(:
,1);
x=y(13271:
13510);
x=x。
*rectwin(240);
R=zeros(1,240);
fork=1:
240
forn=1:
240-k
R(k)=R(k)+x(n)*x(n+k);
end
end
j=1:
240;
plot(j,R);
grid;
实验二基于MATLAB分析语音信号频域特征
1)短时谱
clear
a=wavread(’mike.wav');
a=a(:
,1);
subplot(2,1,1),
plot(a);title(’originalsignal’);
grid
N=256;
h=hamming(N);
form=1:
N
b(m)=a(m)*h(m)
end
y=20*log(abs(fft(b)))
subplot(2,1,2)
plot(y);title('短时谱’);
grid
2)语谱图
[x,fs,nbits]=wavread(’mike.wav')
x=x(:
1);
specgram(x,512,fs,100);
xlabel('时间(s)’);
ylabel(’频率(Hz)');
title('语谱图’);
3)倒谱和复倒谱
(1)加矩形窗时的倒谱和复倒谱
clear
a=wavread('mike。
wav’,[4000,4350]);
a=a(:
1);
N=300;
h=linspace(1,1,N);
form=1:
N
b(m)=a(m)*h(m);
end
c=cceps(b);
c=fftshift(c);
d=rceps(b);
d=fftshift(d);
subplot(2,1,1)
plot(d);title('加矩形窗时的倒谱’)
subplot(2,1,2)
plot(c);title('加矩形窗时的复倒谱')
(2)加汉明窗时的倒谱和复倒谱
clear
a=wavread(’mike.wav',[4000,4350]);
a=a(;,1);
N=300;
h=hamming(N);
form=1:
N
b(m)=a(m)*h(m);
end
c=cceps(b);
c=fftshift(c);
d=rceps(b);
d=fftshift(d);
subplot(2,1,1)
plot(d);title('加汉明窗时的倒谱')
subplot(2,1,2)
plot(c);title('加汉明窗时的复倒谱')
实验三基于MATLAB的LPC分析
MusicSource=wavread('mike。
wav');
MusicSource=MusicSource(:
1);
Music_source=MusicSource’;
N=256;%windowlength,N=100——1000;
Hamm=hamming(N);%createHammingwindow
frame=input('请键入想要处理的帧位置=’);
%originiscurrentframe
origin=Music_source(((frame—1)*(N/2)+1):
((frame—1)*(N/2)+N));
Frame=origin.*Hamm';
%
%ShortTimeFourierTransform
%
[s1,f1,t1]=specgram(MusicSource,N,N/2,N);
[Xs1,Ys1]=size(s1);
fori=1:
Xs1
FTframe1(i)=s1(i,frame);
end
N1=input(’请键入预测器阶数=');%N1ispredictor’sorder
[coef,gain]=lpc(Frame,N1);%LPCanalysisusingLevinson—Durbinrecursion
est_Frame=filter([0—coef(2:
end)],1,Frame);%estimateframe(LP)
FFT_est=fft(est_Frame);
err=Frame—est_Frame;%error
%FFT_err=fft(err);
subplot(2,1,1),plot(1:
N,Frame,1:
N,est_Frame,’-r’);grid;title(’原始语音帧vs。
预测后语音帧')
subplot(2,1,2),plot(err);grid;title('误差’);
pause
%subplot(2,1,2),plot(f’,20*log(abs(FTframe2)));grid;title(’短时谱’)
%
%GainsolutionusingG^2=Rn(0)-sum(ai*Rn(i)),i=1,2,。
..,P
%
fLength(1:
2*N)=[origin,zeros(1,N)];
Xm=fft(fLength,2*N);
X=Xm。
*conj(Xm);
Y=fft(X,2*N);
Rk=Y(1:
N);
PART=sum(coef(2:
N1+1).*Rk(1:
N1));
G=sqrt(sum(Frame。
^2)-PART);
A=(FTframe1-FFT_est(1:
length(f1’)))。
/FTframe1;%inversefilterA(Z)
subplot(2,1,1),plot(f1',20*log(abs(FTframe1)),f1’,(20*log(abs(1。
/A))),’-r’);grid;title('短时谱’);
subplot(2,1,2),plot(f1’,(20*log(abs(G。
/A))));grid;title(’LPC谱’);
pause
%plot(abs(ifft(FTframe1。
/(G./A))));grid;title(’excited’)
%plot(f1’,20*log(abs(FFT_est(1:
length(f1')).*A/G)));grid;
%pause
%
%find_pitch
%
temp=FTframe1-FFT_est(1:
length(f1'));
%notmovehigherfrequnce
pitch1=log(abs(temp));
pLength=length(pitch1);
result1=ifft(pitch1,N);
%movehigherfrequnce
pitch1((pLength—32):
pLength)=0;
result2=ifft(pitch1,N);
%directdorealcepstrumwitherr
pitch=fftshift(rceps(err));
origin_pitch=fftshift(rceps(Frame));
subplot(211),plot(origin_pitch);grid;title(’原始语音帧倒谱(直接调用函数)');
subplot(212),plot(pitch);grid;title('预测误差倒谱(直接调用函数)’);
pause
subplot(211),plot(1:
length(result1),fftshift(real(result1)));grid;title('预测误差倒谱(根据定义编写,没有去除高频分量)’);
subplot(212),plot(1:
length(result2),fftshift(real(result2)));grid;title(’预测误差倒谱(根据定义编写,去除高频分量)’);
实验四基于VQ的特定人孤立词语音识别研究
1、mfcc。
m
functionccc=mfcc(x)
bank=melbankm(24,256,8000,0,0。
5,’m');
bank=full(bank);
bank=bank/max(bank(:
));
fork=1:
12
n=0:
23;
dctcoef(k,:
)=cos((2*n+1)*k*pi/(2*24));
end
w=1+6*sin(pi*[1:
12]。
/12);
w=w/max(w);
xx=double(x);
xx=filter([1—0.9375],1,xx);
xx=enframe(xx,256,80);
fori=1:
size(xx,1)
y=xx(i,:
);
s=y'。
*hamming(256);
t=abs(fft(s));
t=t.^2;
c1=dctcoef*log(bank*t(1:
129));
c2=c1.*w’;
m(i,:
)=c2’;
end
dtm=zeros(size(m));
fori=3:
size(m,1)—2
dtm(i,:
)=—2*m(i—2,:
)-m(i-1,:
)+m(i+1,:
)+2*m(i+2,:
);
end
dtm=dtm/3;
ccc=[mdtm];
ccc=ccc(3:
size(m,1)-2,:
);
2、vad.m
function[x1,x2]=vad(x)
x=double(x);
x=x/max(abs(x));
FrameLen=240;
FrameInc=80;
amp1=10;
amp2=2;
zcr1=10;
zcr2=5;
maxsilence=8;%6*10ms=30ms
minlen=15;%15*10ms=150ms
status=0;
count=0;
silence=0;
tmp1=enframe(x(1:
end-1),FrameLen,FrameInc);
tmp2=enframe(x(2:
end),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<0;
diffs=(tmp1-tmp2)>0。
02;
zcr=sum(signs。
*diffs,2);
amp=sum(abs(enframe(filter([1-0.9375],1,x),FrameLen,FrameInc)),2);
amp1=min(amp1,max(amp)/4);
amp2=min(amp2,max(amp)/8);
x1=0;
x2=0;
forn=1:
length(zcr)
goto=0;
switchstatus
case{0,1}
ifamp(n)〉amp1
x1=max(n—count-1,1);
status=2;
silence=0;
count=count+1;
elseifamp(n)〉amp2|。
。
.
zcr(n)〉zcr2
status=1;
count=count+1;
else
status=0;
count=0;
end
case2,
ifamp(n)>amp2|.。
。
zcr(n)>zcr2
count=count+1;
else
silence=silence+1;
ifsilence〈maxsilence
count=count+1;
elseifcountstatus=0;
silence=0;
count=0;
else
status=3;
end
end
case3,
break;
end
end
count=count—silence/2;
x2=x1+count-1;
3、codebook.m
%clear;
functionxchushi=codebook(m)
[a,b]=size(m);
[m1,m2]=szhixin(m);
[m3,m4]=szhixin(m2);
[m1,m2]=szhixin(m1);
[m7,m8]=szhixin(m4);
[m5,m6]=szhixin(m3);
[m3,m4]=szhixin(m2);
[m1,m2]=szhixin(m1);
[m15,m16]=szhixin(m8);
[m13,m14]=szhixin(m7);
[m11,m12]=szhixin(m6);
[m9,m10]=szhixin(m5);
[m7,m8]=szhixin(m4);
[m5,m6]=szhixin(m3);
[m3,m4]=szhixin(m2);
[m1,m2]=szhixin(m1);
chushi(1,:
)=zhixinf(m1);
chushi(2,:
)=zhixinf(m2);
chushi(3,:
)=zhixinf(m3);
chushi(4,:
)=zhixinf(m4);
chushi(5,:
)=zhixinf(m5);
chushi(6,:
)=zhixinf(m6);
chushi(7,:
)=zhixinf(m7);
chushi(8,:
)=zhixinf(m8);
chushi(9,:
)=zhixinf(m9);
chushi(10,:
)=zhixinf(m10);
chushi(11,:
)=zhixinf(m11);
chushi(12,:
)=zhixinf(m12);
chushi(13,:
)=zhixinf(m13);
chushi(14,:
)=zhixinf(m14);
chushi(15,:
)=zhixinf(m15);
chushi(16,:
)=zhixinf(m16);
sumd=zeros(1,1000);
k=1;
dela=1;
xchushi=chushi;
while(k<=1000)
sum=ones(1,16);
forp=1:
a
fori=1:
16
d(i)=odistan(m(p,:
),chushi(i,:
));
end
dmin=min(d);
sumd(k)=sumd(k)+dmin;
fori=1:
16
ifd(i)==dmin
xchushi(i,:
)=xchushi(i,:
)+m(p,:
);
sum(i)=sum(i)+1;
end
end
end
fori=1:
16
xchushi(i,:
)=xchushi(i,:
)/sum(i);
end
ifk>1
dela=abs(sumd(k)-sumd(k—1))/sumd(k);
end
k=k+1;
chushi=xchushi;
end
return
4、testvq。
m
clear;
disp('这是一个简易语音识别系统,请保证已经将您的语音保存在相应文件夹中’)
disp(’正在训练您的语音模版指令,请稍后。
..’)
fori=1:
10
fname=sprintf(’D:
\\matlab\\work\\dtw1\\海儿的声音\\%da.wav',i-1);
x=wavread(fname);
[x1x2]=vad(x);
m=mfcc(x);
m=m(x1:
x2—5,:
);
ref(i).code=codebook(m);
end
disp('语音指令训练成功,恭喜!
¡')
disp(’正在测试您的测试语音指令,请稍后。
。
。
’)
fori=1:
10
fname=sprintf('D:
\\matlab\\work\\dtw1\\海儿的声音\\%db。
wav’,i-1);
x=wavread(fname);
[x1x2]=vad(x);
mn=mfcc(x);
mn=mn(x1:
x2-5,:
);
%mn=mn(x1:
x2,:
)
test(i).mfcc=mn;
end
sumsumdmax=0;
sumsumdmin=0;
disp('对训练过的语音进行测试’)
forw=1:
10
sumd=zeros(1,10);
[a,b]=size(test(w).mfcc);
fori=1:
10
forp=1:
a
forj=1:
16
d(j)=odistan(test(w)。
mfcc(p,:
),ref(i)。
code(j,:
));
end
dmin=min(d);
sumd(i)=sumd(i)+dmin;%×ÜʧÕæ
end
end
sumdmin=min(sumd)/a;
sumdmin1=min(sumd);
sumdmax(w)=max(sumd)/a;
sumsumdmin=sumdmin+sumsumdmax;
sumsumdmax=sumdmax(w)+sumsumdmax;
disp(’正在匹配您的语音指令,请稍后.。
.')
fori=1:
10
if(sumd(i)==sumdmin1)
switch(i)
case1
fprintf('您输入的语音指令为:
%s;识别结果为%s\n’,’前','前');
case2
fprintf('您输入的语音指令为:
%s;识别结果为%s\n’,’后','后’);
case3
fprintf(’您输入的语音指令为:
%s;识别结果为%s\n’,'左’,’左’);
case4
fprintf(’您输入的语音指令为ª:
%s;识别结果为%s\n’,’右’,'右');
case5
fprintf('您输入的语音指令为:
%s;识别结果为%s\n’,'东',’东’);
case6
fprintf(’您输入的语音指令为:
%s;识别结果为%s\n’,’南’,'南');
case7
fprintf(’您输入的语音指令为:
%s;识别结果为%s\n’,'西’,'西');
case8
fprintf(’您输入的语音指令为:
%s;识别结果为%s\n',’北’,'北');
case9
fprintf('您输入的语音指令为ª:
%s;识别结果为%s\n',’上','上’);
case10
fprintf(’您输入的语音指令为ª:
%s;识别结果为%s\n’,’下’,'下');
otherwise
fprintf(’error’);
end
end
end
end
delamin=sumsumdmin/10;
delamax=sumsumdmax/10;
disp(’对没有训练过的语音进行测试’)
disp('正在测试你的语音,请稍后。
。
。
’)
fori=1:
10
fname=sprintf(’D:
\\matlab\\work\\dtw1\\º£¶ùµÄÉùÒô\\%db.wav',i—1);
x=wavread(fname);
[x1x2]=vad(x)