语音信号处理实验报告.docx
- 文档编号:16866105
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:31
- 大小:248.42KB
语音信号处理实验报告.docx
《语音信号处理实验报告.docx》由会员分享,可在线阅读,更多相关《语音信号处理实验报告.docx(31页珍藏版)》请在冰点文库上搜索。
语音信号处理实验报告
语音信号处理实验
班级:
学号:
姓名:
实验一基于MATLAB的语音信号时域特征分析(2学时)
1)短时能量
(1)加矩形窗
a=wavread('mike.wav’);
a=a(:
1);
subplot(6,1,1),plot(a);
N=32;
fori=2:
6
h=linspace(1,1,2.^(i—2)*N);%形成一个矩形窗,长度为2.^(i—2)*N
En=conv(h,a。
*a);%求短时能量函数En
subplot(6,1,i),plot(En);
if(i==2),legend('N=32');
elseif(i==3),legend('N=64’);
elseif(i==4),legend(’N=128');
elseif(i==5),legend(’N=256');
elseif(i==6),legend(’N=512');
end
end
(2)加汉明窗
a=wavread(’mike.wav');
a=a(:
1);
subplot(6,1,1),plot(a);
N=32;
fori=2:
6
h=hanning(2。
^(i—2)*N);%形成一个汉明窗,长度为2。
^(i—2)*N
En=conv(h,a.*a);%求短时能量函数En
subplot(6,1,i),plot(En);
if(i==2),legend(’N=32’);
elseif(i==3),legend(’N=64');
elseif(i==4),legend(’N=128');
elseif(i==5),legend(’N=256’);
elseif(i==6),legend('N=512');
end
end
2)短时平均过零率
a=wavread('mike。
wav’);
a=a(:
,1);
n=length(a);
N=320;
subplot(3,1,1),plot(a);
h=linspace(1,1,N);
En=conv(h,a。
*a);%求卷积得其短时能量函数En
subplot(3,1,2),plot(En);
fori=1:
n-1
ifa(i)>=0
b(i)=1;
else
b(i)=-1;
end
ifa(i+1)>=0
b(i+1)=1;
else
b(i+1)=—1;
end
w(i)=abs(b(i+1)-b(i));%求出每相邻两点符号的差值的绝对值
end
k=1;
j=0;
while(k+N—1) 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; elseifcount status=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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语音 信号 处理 实验 报告