语音信号处理实验报告

合集下载

语音信号处理实验报告.docx

语音信号处理实验报告.docx
在浊音清音对比中,可以发现,对呈现谐波特征的浊音语音谱来说这个特点很明显,就是在谐波成分处LPC谱匹配信号谱的效果要远比谐波之间好得多。
在实验中,当P值增加到一定程度,预测平方误差的改善就不很明显了,而且会增加计算量,一般取为8~14,这里P取为10。
5.基音周期估计
①自互相关函数法
②短时平均幅度差法
二.实验过程
1. 系统结构
2.仿真结果
(1)时域分析
男声及女声(蓝色为时域信号,红色为每一帧的能量,绿色为每一帧的过零率)
某一帧的自相关函数
3.频域分析
①一帧信号的倒谱分析和FFT及LPC分析
②男声和女声的倒谱分析
③浊音和清音的倒谱分析
④浊音和清音的FFT分析和LPC分析(红色为FFT图像,绿色为LPC图像)
从男声女声的时域信号对比图中可以看出,女音信号在高频率分布得更多,女声信号在高频段的能量分布更多,并且女声有较高的过零率,这是因为语音信号中的高频段有较高的过零率。
2.频域分析
这里对信号进行快速傅里叶变换(FFT),可以发现,当窗口函数不同,傅里叶变换的结果也不相同。根据信号的时宽带宽之积为一常数这一性质,可以知道窗口宽度与主瓣宽度成反比,N越大,主瓣越窄。汉明窗在频谱范围中的分辨率较高,而且旁瓣的衰减大,具有频谱泄露少的有点,所以在实验中采用的是具有较小上下冲的汉明窗。
三.实验结果分析
1.时域分析
实验中采用的是汉明窗,窗的长度对能否由短时能量反应语音信号的变化起着决定性影响。这里窗长合适,En能够反应语音信号幅度变化。同时,从图像可以看出,En可以作为区分浊音和清音的特征参数。
短时过零率表示一帧语音中语音信号波形穿过横轴(零电平)的次数。从图中可以看出,短时能量和过零率可以近似为互补的情况,短时能量大的地方过零率小,短时能量小的地方过零率较大。从浊音和清音的时域分析可以看出,清音过零率高,浊音过零率低。

语音信号处理实验报告实验二

语音信号处理实验报告实验二

语音信号处理实验报告实验二一、实验目的本次语音信号处理实验的目的是深入了解语音信号的特性,掌握语音信号处理的基本方法和技术,并通过实际操作和数据分析来验证和巩固所学的理论知识。

具体而言,本次实验旨在:1、熟悉语音信号的采集和预处理过程,包括录音设备的使用、音频格式的转换以及噪声去除等操作。

2、掌握语音信号的时域和频域分析方法,能够使用相关工具和算法计算语音信号的短时能量、短时过零率、频谱等特征参数。

3、研究语音信号的编码和解码技术,了解不同编码算法对语音质量和数据压缩率的影响。

4、通过实验,培养我们的动手能力、问题解决能力和团队协作精神,提高我们对语音信号处理领域的兴趣和探索欲望。

二、实验原理(一)语音信号的采集和预处理语音信号的采集通常使用麦克风等设备将声音转换为电信号,然后通过模数转换器(ADC)将模拟信号转换为数字信号。

在采集过程中,可能会引入噪声和干扰,因此需要进行预处理,如滤波、降噪等操作,以提高信号的质量。

(二)语音信号的时域分析时域分析是对语音信号在时间轴上的特征进行分析。

常用的时域参数包括短时能量、短时过零率等。

短时能量反映了语音信号在短时间内的能量分布情况,短时过零率则表示信号在单位时间内穿过零电平的次数,可用于区分清音和浊音。

(三)语音信号的频域分析频域分析是将语音信号从时域转换到频域进行分析。

通过快速傅里叶变换(FFT)可以得到语音信号的频谱,从而了解信号的频率成分和分布情况。

(四)语音信号的编码和解码语音编码的目的是在保证一定语音质量的前提下,尽可能降低编码比特率,以减少存储空间和传输带宽的需求。

常见的编码算法有脉冲编码调制(PCM)、自适应差分脉冲编码调制(ADPCM)等。

三、实验设备和软件1、计算机一台2、音频采集设备(如麦克风)3、音频处理软件(如 Audacity、Matlab 等)四、实验步骤(一)语音信号的采集使用麦克风和音频采集软件录制一段语音,保存为常见的音频格式(如 WAV)。

语音信号处理试验报告

语音信号处理试验报告

---------------------考试---------------------------学资学习网---------------------押题------------------------------语音信号处理实验班级:学号:姓名:实验一基于MATLAB的语音信号时域特征分析(2学时)短时能量)1.(1)加矩形窗a=wavread('mike.wav');a=a(:,1);subplot(6,1,1),plot(a);N=32;for i=2:6h=linspace(1,1,2.^(i-2)*N);%形成一个矩形窗,长度为2.^(i-2)*NEn=conv(h,a.*a);% 求短时能量函数Ensubplot(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');endend10-100.511.522.534x 104 20 N=3232.51.5200.514x 10 50 N=6431.50.51022.54x 10 1050 N=12831.5202.50.514x 10 20100 N=256322.50.511.504x 10 40200 N=5123100.51.522.54x 10(2)加汉明窗a=wavread('mike.wav');a=a(:,1);subplot(6,1,1),plot(a);N=32;for i=2:6h=hanning(2.^(i-2)*N);%形成一个汉明窗,长度为2.^(i-2)*NEn求短时能量函数En=conv(h,a.*a);%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');endend10-100.511.522.534x 102 10 N=3232.51.5020.514x 10 420 N=64311.522.50.504x 10 420 N=12831.5202.50.514x 10 1050 N=25631.522.500.514x 10 20100 N=512322.50.5011.54x 102)短时平均过零率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); %求卷积得其短时能量函数Ensubplot(3,1,2),plot(En);for i=1:n-1if a(i)>=0b(i)= 1;elseb(i) = -1;endif a(i+1)>=0b(i+1)=1;elseb(i+1)= -1;endw(i)=abs(b(i+1)-b(i)); %求出每相邻两点符号的差值的绝对值endk=1;j=0;while (k+N-1)<nZm(k)=0;for i=0:N-1;Zm(k)=Zm(k)+w(k+i);endj=j+1;k=k+N/2; %每次移动半个窗endfor w=1:jQ(w)=Zm(160*(w-1)+1)/(2*N); %短时平均过零率endsubplot(3,1,3),plot(Q),grid;10-100.511.522.534x 102010000.511.522.534x 100.500204060801001201401601803)自相关函数N=240y=wavread('mike.wav');y=y(:,1);x=y(13271:13510);x=x.*rectwin(240);R=zeros(1,240);for k=1:240for n=1:240-kR(k)=R(k)+x(n)*x(n+k);endendj=1:240;plot(j,R);grid;2.521.510.50-0.5-1-1.5050100150200250分析语音信号频域特征MATLAB基于实验二1)短时谱cleara=wavread('mike.wav');a=a(:,1);subplot(2,1,1),plot(a);title('original signal');gridN=256;h=hamming(N);for m=1:Nb(m)=a(m)*h(m)endy=20*log(abs(fft(b)))subplot(2,1,2)plot(y);title('短时谱');gridoriginal signal10.50-0.5-100.511.522.534x 10谱时短10.5000.20.40.60.811.21.41.61.822)语谱图[x,fs,nbits]=wavread('mike.wav')x=x(:,1);specgram(x,512,fs,100);xlabel('时间(s)');ylabel('频率(Hz)'););'语谱图'title(语谱图50004000)3000zH(率频2000100000.511.52(s)时间3)倒谱和复倒谱(1)加矩形窗时的倒谱和复倒谱cleara=wavread('mike.wav',[4000,4350]);a=a(:,1);N=300;h=linspace(1,1,N);for m=1:Nb(m)=a(m)*h(m);endc=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(加矩形窗时的倒谱10-1-2050100150200250300加矩形窗时的复倒谱1050-5-10050100150200250300(2)加汉明窗时的倒谱和复倒谱cleara=wavread('mike.wav',[4000,4350]);a=a(;,1);N=300;h=hamming(N);for m=1:Nb(m)=a(m)*h(m);endc=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(加汉明窗时的倒谱10-1-2-3050100150200250300加汉明窗时的复倒谱1050-5-10050100150200250300实验三基于MATLAB的LPC分析MusicSource = wavread('mike.wav');MusicSource=MusicSource(:,1);Music_source = MusicSource';N = 256; % window length,N = 100 -- 1000;Hamm = hamming(N); % create Hamming windowframe = input('请键入想要处理的帧位置= ');% origin is current frameorigin = Music_source(((frame - 1) * (N / 2) + 1):((frame - 1) * (N / 2) + N));Frame = origin .* Hamm';%%Short Time Fourier Transform%[s1,f1,t1] = specgram(MusicSource,N,N/2,N);[Xs1,Ys1] = size(s1);for i = 1:Xs1FTframe1(i) = s1(i,frame);endN1 = input('请键入预测器阶数= '); % N1 is predictor's order[coef,gain] = lpc(Frame,N1); % LPC analysis using Levinson-Durbin recursionest_Frame = filter([0 -coef(2:end)],1,Frame); % estimate frame(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('短时谱')%% Gain solution using G^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 ; % inverse filter A(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'));% not move higher frequncepitch1 = log(abs(temp));pLength = length(pitch1);result1 = ifft(pitch1,N);% move higher frequncepitch1((pLength - 32) : pLength) = 0;result2 = ifft(pitch1,N);% direct do real cepstrum with errpitch = fftshift(rceps(err));origin_pitch = fftshift(rceps(Frame));subplot(211),plot(origin_pitch);grid;title('原始语音帧倒谱(直接调用函数)');subplot(212),plot(pitch);grid;title('预测误差倒谱(直接调用函数)');pausesubplot(211),plot(1:length(result1),fftshift(real(result1)));grid;title('预测误差倒谱(根据定义编写,没有去除高频分量)');subplot(212),plot(1:length(result2),fftshift(real(result2)));grid;title('预测误差倒谱(根据定义编);)'写,去除高频分量原始语音帧vs.预测后语音帧0.40.20-0.2-0.4050100150200250300差误0.20.10-0.1-0.2300250100050150200短时谱500-50-100010203040506070谱LPC100806040010203040506070原始语音帧倒谱(直接调用函数)0.50-0.5-1050100150200250300预测误差倒谱(直接调用函数)0.50-0.5-1050100150200250300预测误差倒谱(根据定义编写,没有去除高频分量)0.20-0.2-0.4-0.6050100150200250300预测误差倒谱(根据定义编写,去除高频分量)0.10-0.1-0.2-0.3050100150200250300预测误差倒谱(根据定义编写,没有去除高频分量)0.20-0.2-0.4-0.6050100150200250300预测误差倒谱(根据定义编写,去除高频分量)0.10-0.1-0.2-0.3050100150200250300预测误差倒谱(根据定义编写,没有去除高频分量)0.20-0.2-0.4-0.6050100150200250300预测误差倒谱(根据定义编写,去除高频分量)0.10-0.1-0.2-0.3050100150200250300实验四基于VQ的特定人孤立词语音识别研究1、mfcc.mccc = mfcc(x)function);'m'bank=melbankm(24,256,8000,0,0.5,bank=full(bank); bank=bank/max(bank(:));k=1:12for n=0:23; dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));endw = 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); i=1:size(xx,1)for 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';enddtm = zeros(size(m)); i=3:size(m,1)-2for dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:);end dtm = dtm / 3;ccc = [m dtm];ccc = ccc(3:size(m,1)-2,:);2、vad.m[x1,x2] = vad(x)function x = double(x);x = x / max(abs(x));FrameLen = 240;FrameInc = 80;amp1 = 10;amp2 = 2;zcr1 = 10;zcr2 = 5;% 6*10ms = 30ms maxsilence = 8;% 15*10ms = 150ms minlen = 15;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; n=1:length(zcr)for goto = 0; status switch{0,1} caseif amp(n) > amp1x1 = max(n-count-1,1); status = 2; silence = 0; count = count + 1;... amp(n) > amp2 | elseif zcr(n) > zcr2status = 1; count = count + 1;else status = 0; count = 0;end2, caseamp(n) > amp2 | ...if zcr(n) > zcr2 count = count + 1; elsesilence = silence+1; if silence < maxsilencecount = count + 1; count < minlen elseifstatus = 0; silence = 0; count = 0;elsestatus = 3;endend3, case; break endcount = count-silence/2;x2 = x1 + count -1;3、codebook.m%clear; xchushi= codebook(m)function[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;(k<=1000)while sum=ones(1,16); p=1:a fori=1:16 for d(i)=odistan(m(p,:),chushi(i,:));enddmin=min(d); sumd(k)=sumd(k)+dmin;i=1:16ford(i)==dmin if xchushi(i,:)=xchushi(i,:)+m(p,:); sum(i)=sum(i)+1;end endendi=1:16forxchushi(i,:)=xchushi(i,:)/sum(i);endk>1if dela=abs(sumd(k)-sumd(k-1))/sumd(k);end k=k+1; chushi=xchushi; end return4、testvq.mclear;)这是一个简易语音识别系统,请保证已经将您的语音保存在相应文件夹中'disp(')正在训练您的语音模版指令,请稍后...'disp(' i=1:10for,i-1);\\ú.wav'海儿的声音 fname =sprintf('D:\\matlab\\work\\dtw1\\ x = wavread(fname); [x1 x2] = vad(x); m = mfcc(x); m = m(x1:x2-5,:);ref(i).code=codebook(m);end)?''语音指令训练成功,恭喜!disp()...''正在测试您的测试语音指令,请稍后disp( i=1:10for,i-1);海儿的声音\\?.wav'fname = sprintf('D:\\matlab\\work\\dtw1\\ x = wavread(fname);[x1 x2] = vad(x); mn = mfcc(x); mn = mn(x1:x2-5,:);%mn = mn(x1:x2,:) test(i).mfcc = mn;end sumsumdmax=0;sumsumdmin=0;)''对训练过的语音进行测试disp( w=1:10for sumd=zeros(1,10); [a,b]=size(test(w).mfcc);i=1:10forp=1:a for j=1:16 ford(j)=odistan(test(w).mfcc(p,:),ref(i).code(j,:));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(' i=1:10for (sumd(i)==sumdmin1) if (i) switch 1 case);前'', '您输入的语音指令为:%s; 识别结果为%s\n','前fprintf(' 2 case);', ''后:%s; 识别结果为%s\n','后 fprintf('您输入的语音指令为 3case);', '左识别结果为%s\n','左' fprintf('您输入的语音指令为:%s;4case);''右,'右', 您输入的语音指令为 fprintf('a:%s; 识别结果为%s\n' 5case);''东'东', fprintf('您输入的语音指令为:%s; 识别结果为%s\n', 6case);南'南', ' fprintf('您输入的语音指令为:%s; 识别结果为%s\n',' 7 case);', '西,:%s; 识别结果为%s\n''西' fprintf('您输入的语音指令为 8case);''北,'北', 您输入的语音指令为 fprintf(':%s; 识别结果为%s\n' 9case);上'', ', fprintf('您输入的语音指令为a:%s; 识别结果为%s\n''上 10case);下', '下'',您输入的语音指令为 fprintf('a:%s; 识别结果为%s\n'otherwise); 'error' fprintf(endendend end delamin=sumsumdmin/10;delamax=sumsumdmax/10;)''对没有训练过的语音进行测试disp()正在测试你的语音,请稍后...'disp(' i=1:10for,i-1);fname =sprintf('D:\\matlab\\work\\dtw1\\o£?ùμ?éùò?\\?.wav' x = wavread(fname);[x1 x2] = vad(x); mn = mfcc(x); mn = mn(x1:x2-5,:);%mn = mn(x1:x2,:)test(i).mfcc = mn;endw=1:10for sumd=zeros(1,10); [a,b]=size(test(w).mfcc); i=1:10forp=1:a for j=1:16ford(j)=odistan(test(w).mfcc(p,:),ref(i).code(j,:));enddmin=min(d);%×üê§?? sumd(i)=sumd(i)+dmin;end end sumdmin=min(sumd);z=0; i=1:10for (((sumd(i))/a)>delamax)|| if z=z+1;endend)...'disp('正在匹配您的语音指令,请稍后z<=3if i=1:10for (sumd(i)==sumdmin) if (i)switch1case);'前', '前',%s\n'识别结果为:%s; 您输入的语音指令为' fprintf(2 case);'后', ':%s; 识别结果为%s\n','后 fprintf('您输入的语音指令为3case);', '左识别结果为%s\n','左' fprintf('您输入的语音指令为:%s;4case);''右,'右', 识别结果为 fprintf('您输入的语音指令为a:%s; %s\n' 5case);''东'东', fprintf('您输入的语音指令为:%s; 识别结果为%s\n', 6 case);南'南', ' fprintf('您输入的语音指令为:%s; 识别结果为%s\n',' 7 case);', '西西:%s; 识别结果为%s\n','' fprintf('您输入的语音指令为 8case );''北,'北', 识别结果为 fprintf('您输入的语音指令为:%s; %s\n' 9case);上'', '上 fprintf('您输入的语音指令为a:%s; 识别结果为%s\n',' 10case);下'','下', 识别结果为 fprintf('您输入的语音指令为a:%s; %s\n'otherwise ); fprintf('error'endendend else)您输入的语音无效?£?\n'' fprintf(end end。

语音信号处理实验报告

语音信号处理实验报告

实验一基于 MATLAB 的语音信号时域特征分析操作:报告:一. 实验目的语音信号是一种非平稳的时变信号,它携带着各种信息。

在语音编码、语音合成、语音识别和语音增强等语音处理中无一例外需要提取语音中包含的各种信息。

语音信号分析的目的就在与方便有效的提取并表示语音信号所携带的信息。

语音信号分析可以分为时域和变换域等处理方法,其中时域分析是最简单的方法,直接对语音信号的时域波形进行分析,提取的特征参数主要有语音的短时能量,短时平均过零率,短时自相关函数等。

本实验要求掌握时域特征分析原理,并利用已学知识,编写程序求解语音信号的短时过零率、短时能量、短时自相关特征,分析实验结果,并能掌握借助时域分析方法所求得的参数分析语音信号的基音周期及共振峰。

二. 实验内容1.窗口的选择通过对发声机理的认识,语音信号可以认为是短时平稳的。

在 5~50ms 的范围内,语音频谱特性和一些物理特性参数基本保持不变。

我们将每个短时的语音称为一个分析帧。

一般帧长取 10~30ms。

我们采用一个长度有限的窗函数来截取语音信号形成分析帧。

通常会采用矩形窗和汉明窗。

1.1 给出了这两种窗函数在帧长 N=50图时的时域波形。

这两种窗函数都有低通特性,通过分析这两种窗的频率响应幅度特性可以发现(如图1.2):矩形窗的主瓣宽度小(4*pi/N ),具有较高的频率分辨率,旁瓣峰值大(-13.3dB),会导致泄漏现象;汉明窗的主瓣宽 8*pi/N ,旁瓣峰值低(-42.7dB),可以有效的克服泄漏现象,具有更平滑的低通特性。

因此在语音频谱分析时常使用汉明窗,在计算短时能量和平均幅度时通常用矩形窗。

2. 短时能量由于语音信号的能量随时间变化,清音和浊音之间的能量差别相当显著。

因此对语音的短时能量进行分析,可以描述语音的这种特征变化情况。

定义短时能量为:在用短时能量反映语音信号的幅度变化时,不同的窗函数以及相应窗的长短均有影响。

hamming 窗的效果比矩形窗略好。

语音信号处理实验一报告

语音信号处理实验一报告

语⾳信号处理实验⼀报告实验⼀语⾳信号的采集及预处理⼀、实验⽬的在理论学习的基础上,进⼀步地理解和掌握语⾳信号预处理及短时加窗的意义及基于matlab的实现⽅法。

⼆、实验原理及内容1、语⾳信号的录⾳、读⼊、放⾳等:练习matlab中⼏个⾳频处理函数,利⽤函数wavread对语⾳信号进⾏采样,记住采样频率和采样点数,给出以下语⾳的波形图(2.wav),wavread的⽤法参见mablab帮助⽂件。

利⽤wavplay或soundview 放⾳。

也可以利⽤wavrecord⾃⼰录制⼀段语⾳,并进⾏以上操作(需要话筒)。

I=wavread('2.wav');Fs=115200;soundview(I,Fs) %波形图如图1所⽰图1 2.wav的波形图利⽤wavplay函数,在佩戴⽿机的情况下可以清晰的听到所要播放于⼼的消息。

2、语⾳信号的分帧:对语⾳信号进⾏分帧,可以利⽤voicebox⼯具箱中的函数enframe。

voicebox⼯具箱是基于GNU协议的⾃由软件,其中包含了很多语⾳信号相关的函数。

voicebox⼯具箱安装⽅法:(1)把⼯具箱拷贝⼊C:\Program Files\MATLAB\R2006b\toolbox⽬录下;(2)菜单file-set path-"Add folder" 导⼊voicebox;图2 Set Path(3)菜单file-Preference-General-"Updata Toolbox Path Cache图3 Preferencesy=enframe(I,256,128);whos y I实验结果为:Name Size Bytes Class AttributesI 9000x1 72000 doubley 69x256 141312 doubleI=wavread('2.wav');t=enframe(I,256,128);plot(t)图4 分帧后的波形图3、语⾳信号的加窗:本步要求利⽤window函数设计窗⼝长度为256(N=256)的矩形窗(rectwin)、汉明窗(hamming)及汉宁窗(hann)),利⽤wvtool函数观察其时域波形图及频谱特性,⽐较得出结论。

语音信号处理实验报告

语音信号处理实验报告

语⾳信号处理实验报告语⾳信号处理实验报告【实验⼀】⼀、实验题⽬Short time analysis⼆、实验要求Write a MA TLAB program to analyze a speech and simultaneously, on a single page, plot the following measurements:1. the entire speech waveform2. the short-time energy, En3. the short-time magnitude, Mn4. the short-time zero-crossing, Zn5. the narrowband spectrogram6. the wideband spectrogramUse both the speech waveforms in the wznjdx_normal.wav. Choose appropriate window sizes, window shifts, and window for the analysis. Explain your choice of these parameters.三、实验程序clear[x,fs]=wavread('wznjdx_normal.wav');n=length(x);N=320;subplot(4,1,1);plot(x);h=linspace(1,1,N);En=conv(h,x.*x);subplot(4,1,2);plot(En);Mn=conv(h,abs(x));subplot(4,1,3);plot(Mn);for i=1:n-1if x(i)>=0 y(i)=1;else y(i)=-1;endif x(i+1)>=0 y(i+1)=1;else y(i+1)=-1;endw(i)=abs(y(i+1)-y(i));endk=1;j=0;while (k+N-1)Zm(k)=0;for i=0:N-1Zm(k)=Zm(k)+w(k+i);endj=j+1;k=k+N/2;endfor w=1:jQ(w)=Zm(160*(w-1)+1)/(2*N);endsubplot(4,1,4);plot(Q);grid;figure(2);subplot(2,1,1);spectrogram(x,h,256,200,0.0424*fs); subplot(2,1,2);spectrogram(x,h,256,200,0.0064*fs);四、实验结果语谱图:(Matlab 7.0 ⽤不了spectrogram)【实验⼆】⼀、实验题⽬Homomorphic analysis⼆、实验要求Write a MATLAB program to compute the real cepstrums of a section of voiced speech and unvoiced speech. Plot the signal, the log magnitude spectrum, the real cepstrum, and the lowpass liftered log magnitude spectrum.三、实验程序nfft=256;[x,fs] = wavread('wznjdx_normal.wav');fx=x;Xvm=log(abs(fft(fx,nfft)));xhv=real(ifft(Xvm,nfft));lifter=zeros(1,nfft);lifter(1:30)=1;lifter(nfft-28:nfft)=1;fnlen=0.02*fs; % 20mswin=hamming(fnlen);%加窗n=fnlen;%窗宽度赋给循环⾃变量nnoverlap=0.5*fnlen;while(n<=length(x)-1)fx=x(n-fnlen+1:n).*win;n=n+noverlap;endxhvp=xhv.*lifter';figure;subplot(4,1,1)plot(lifter);title('倒谱滤波器');subplot(4,1,2)plot(x);title('语⾳信号波形');subplot(4,1,3)plot(Xvm);title('Xvm');subplot(4,1,4)plot(xhv);title('xhv');四、实验结果【实验三】⼀、实验题⽬LP analysis⼆、实验要求Write a MATLAB program to convert from a frame of speech to a set of linear prediction coefficients. Plot the LPC spectrum superimposed on the corresponding STFT.三、实验程序clear;[x,fs]=wavread('wznjdx_normal.wav');fx=x(4000:4160-1);p=10;[a,e,k]=aryule(fx,p);G=sqrt(e*length(fx));f=log(abs(fft(fx)));h0=zeros(1,160);h=log(G)-log(abs(fft(a,160)));figure(1);subplot(211);plot(fx);subplot(212);plot(f);hold on;plot((0:160-1),h,'r');四、实验结果【实验四】⼀、实验题⽬Pitch estimation⼆、实验内容Write a program to implement the pitch estimation and the voiced/unvoiced decision using the LPC-based method.三、实验程序clear[x,fs]=wavread('wznjdx_normal.wav');n=length(x);Q = x';NFFT=512;N = 256;Hamm = hamming(N);frame = 30;M = Q(((frame -1) * (N / 2) + 1):((frame - 1) * (N / 2) + N)); Frame = M .* Hamm';% lowpass filter[b2,a2]=butter(2,900/4000);speech2=filter(b2,a2,Frame); % filter% residual[a,e] = lpc(speech2,20);errorlp=filter(a,1,speech2); % residual% Short-term autocorrelation.re = xcorr(errorlp);% Find max autocorrelation for lags in the interval minlag to maxlag. minlag = 17; % F0: 450Hzmaxlag =160; % F0: 50Hz[remax,idx] = max(re(fnlen+minlag:fnlen+maxlag));figuresubplot(3,1,1);plot(Frame);subplot(3,1,2);plot(speech2);subplot(3,1,3);plot(re);text(500,0,'idx');idx=idx-1+minlagremax四、实验结果【实验五】⼀、实验题⽬Speech synthesis⼆、实验内容Write a program to analyze a speech and synthesize it using the LPC-based method.三、实验程序主程序clear;[x,sr] = wavread('wznjdx_normal.wav');p=[1 -0.9];x=filter(p,1,x);N=256;inc=128;y=lpcsyn(x,N,inc);wavplay(y,sr);⼦程序lpcsynfunction y=lpcsyn(x,N,inc)%[x,sr] = wavread('wznjdx_normal.wav');%pre = [1 -0.97];%x = filter(pre,1,x);%N=256;%inc=128;fn=floor(length(x)/inc);y=zeros(1,50000);for (i=1:fn)x(1:N,i)=x((i-1)*inc+1:(i+1)*inc);[A(i,:),G(i),P(i),fnlen,fnshift] = lpcana(x(1:N,i),order); if (P(i)) % V oiced frame.e = zeros(N,1);e(1:P(i):N) = 1; % Impulse-train excitation.else % Unvoiced frame.e = randn(N,1); % White noise excitation.endyt=filter(G(i),A(i,:),e);j=(i-1)*inc+[1:N];y(j) = y(j)+yt';end;end⼦程序lpcanafunction [A,G,P,fnlen,fnshift] = lpcana(x,order) fnlen=256;fnshift=fnlen/2;n=length(x);[b2,a2]=butter(2,900/4000);speech2=filter(b2,a2,x);[A,e]=lpc(speech2,order);errorlp=filter(A,1,speech2);re=xcorr(errorlp);G=sqrt(e*length(speech2));minlag=17;maxlag=160;[remax,idx]=max(re(n+minlag:n+maxlag));P=idx-1+minlag;end四、实验结果【实验六】⼀、实验题⽬Speech enhancement⼆、实验内容Write a program to implement the basic spectral magnitude subtraction.三、实验程序clear[speech,fs,nbits]=wavread('wznjdx_normal.wav');%读⼊数据alpha=0.04;%噪声⽔平winsize=256;%窗长size=length(speech);%语⾳长度numofwin=floor(size/winsize);%帧数hamwin=zeros(1,size);%定义汉明窗长度enhanced=zeros(1,size);%定义增强语⾳的长度ham=hamming(winsize)';%%产⽣汉明窗x=speech'+alpha*randn(1,size);%信号加噪声noisy=alpha*randn(1,winsize);%噪声估计N=fft(noisy);nmag=abs(N);%噪声功率谱%分帧for q=1:2*numofwin-1frame=x(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2);%对带噪语⾳帧间重叠⼀半取值hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=...hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+ham;%加窗y=fft(frame.*ham);mag=abs(y);%带噪语⾳功率谱phase=angle(y);%带噪语⾳相位%幅度谱减for i=1:winsizeif mag(i)-nmag(i)>0clean(i)=mag(i)-nmag(i);else clean(i)=0;endend%频域中重新合成语⾳spectral=clean.*exp(j*phase);%反傅⾥叶变换并重叠相加enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=...enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+real(ifft(spectral));endfigure(1);subplot(3,1,1);plot(speech);xlabel('样点数');ylabel('幅度');title('原始语⾳波形'); subplot(3,1,2);plot(x);xlabel('样点数');ylabel('幅度');title('语⾳加噪波形'); subplot(3,1,3);plot(enhanced);xlabel('样点数');ylabel('幅度');title('增强语⾳波形');四、实验结果。

语音信号处理 实验报告

语音信号处理 实验报告

实验一、语音信号采集与分析一、实验目的:1)了解语音信号处理基本知识:语音信号的生成的数学模型。

2)在理论学习的基础上,进一步地理解和掌握语音信号的读入、回放、波形显示。

语音信号时域和频域分析方法。

二、实验原理一定时宽的语音信号,其能量的大小随时间有明显的变化。

其中清音段(以清音为主要成份的语音段),其能量比浊音段小得多。

短时过零数也可用于语音信号分析中,发浊音时,其语音能量约集中于3kHz以下,而发清音时,多数能量出现在较高频率上,可认为浊音时具有较低的平均过零数,而清音时具有较高的平均过零数,因而,对一短时语音段计算其短时平均能量及短时平均过零数,就可以较好地区分其中的清音段和浊音段,从而可判别句中清、浊音转变时刻,声母韵母的分界以及无声与有声的分界。

这在语音识别中有重要意义。

FFT在数字通信、语音信号处理、图像处理、匹配滤波以及功率谱估计、仿真、系统分析等各个领域都得到了广泛的应用。

本实验通过分析加噪的语音信号频谱,可以作为分离信号和噪声的理论基础。

三、实验内容:Matlab编程实验步骤:1.新建M文件,扩展名为“.m”,编写程序;2.选择File/Save命令,将文件保存在F盘中;3.在Command Window窗中输入文件名,运行程序;程序一、用MATLAB对原始语音信号进行时域分析,分析短时平均能量及短时平均过零数。

程序二、用MATLAB对原始语音信号进行频域分析,画出它的时域波形和频谱给原始的语音信号加上一个高频余弦噪声,频率为5kHz。

画出加噪后的语音信号时域和频谱图。

程序1.a=wavread(' D:\II.wav'); %读取语音信号的数据,赋给变量x1,这里的文件的全路径和文件名由个人设计n=length(a);N=320;subplot(3,1,1),plot(a);h=linspace(1,1,N);%形成一个矩形窗,长度为NEn=conv(h,a.*a);%求卷积得其短时能量函数Ensubplot(3,1,2),plot(En);for i=1:n-1if a(i)>=0b(i)= 1;elseb(i) = -1;endif a(i+1)>=0b(i+1)=1;elseb(i+1)=-1;endw(i)=abs(b(i+1)-b(i));end%求出每相邻两点符号的差值的绝对值k=1;j=0;while (k+N-1)<nZm(k)=0;for i=0:N-1;Zm(k)=Zm(k)+w(k+i);endj=j+1;k=k+160; %每次移动半个窗endfor w=1:jQ(w)=Zm(160*(w-1)+1)/640;%短时平均过零率endsubplot(3,1,3),plot(Q);实验结果打印粘贴到右侧:程序2:fs=22050; %语音信号采样频率为22050x1=wavread('D:\II.wav'); %读取语音信号的数据,赋给变量x1sound(x1,22050); %播放语音信号f=fs*(0:511)/1024;t=0:1/22050:(size(x1)-1)/22050; %将所加噪声信号的点数调整到与原始信号相同Au=0.03;d=[Au*cos(2*pi*5000*t)]'; %噪声为5kHz的余弦信号x2=x1+d;sound(x2,22050); %播放加噪声后的语音信号y2=fft(x2,1024); %对信号做1024点FFT变换figure(1)subplot(2,1,1);plot(x1) %做原始语音信号的时域图形title('原始语音信号');xlabel('time n');ylabel('幅值 n');subplot(2,1,2);plot(t,x2)title('加噪后的信号');xlabel('time n');ylabel('幅值 n');figure(2)subplot(2,1,1);plot(f,abs(x1(1:512)));title('原始语音信号频谱');xlabel('Hz');ylabel('幅值');subplot(2,1,2);plot(f,abs(y2(1:512)));title('加噪后的信号频谱');xlabel('Hz'); ylabel('幅值');实验结果打印粘贴到右侧:050010001500200025003000350040004500原始语音信号time n幅值 n加噪后的信号time n幅值 n020004000600080001000012000原始语音信号频谱Hz幅值加噪后的信号频谱Hz幅值四、实验分析加入噪声后音频文件可辨性下降,波形的平缓,频谱图上看,能量大部分集中在2000HZz到4000Hz之间。

语音信号信号处理实验报告

语音信号信号处理实验报告

实验一 语音信号的端点检测一、实验目的1、掌握短时能量的求解方法2、掌握短时平均过零率的求解方法3、掌握利用短时平均过零率和短时能量等特征,对输入的语音信号进行端点检测。

二、仪器设备HP 计算机、Matlab 软件三、实验原理3.1、短时能量3.1.1、原理:语音信号能量随时间有相当大的变化,特别是清音段的能量一般比浊音段的小得多。

语音信号的短时能量定义:3.1.2、短时能量序列反映了语音振幅或能量随着时间缓慢变化的规律。

从原始语音信号图中可以看到语音信号幅度随时间有相当大的变化,特别是清音段的幅度一般比浊音段的幅度小很多,语音信号的短时能量给出了反映这些幅度变化的一个合适的描述方法。

3.1.3、短时平均幅度函数和能量函数的作用(1)区分清/浊音。

En 、Mn 大,对应浊音; En 、Mn 小,对应清音。

其中Mn 是短时幅度差。

(2)在信噪比高的情况下,能进行有声/无声判决。

无声时,背景噪声的En 、Mn 小;有声时,En 、Mn 显著增大。

判决时可设置一个门限。

(3)大致能定出浊音变为清音的时刻,或反之。

3.2、短时过零率:3.2.1、定义:过零就是信号通过零值。

连续语音信号,考察其时域波形通过时间轴的情况;离散时间信号,相邻的 值改变符号则称为过零。

12()n N n w m nE x m +-==∑()()()01w x n w n x n m N =⋅≤≤-101() 0n N w n ≤≤-⎧=⎨⎩其它窄带信号,平均过零数作为信号频率的一种简单度量是很精确的,语音信号序列是宽带信号, 则不能简单用上面的公式,但是可以用短时平均过零数来得到频谱的粗略估计。

3.2.2、短时过零分析的意义:(1)、可以区分清音与浊音:浊音时具有较低的平均过零数,而清音时具有较高的平均过零数。

(2)、利用它可以从背景噪声中找出语音信号,可用于判断寂静无语音和有语音的起点和终点位置。

(3)、在背景噪声较小时用平均能量识别较为有效,而在背景噪声较大时用平均过零数识别较为有效。

语音信号处理实验报告

语音信号处理实验报告

一、实验目的1. 理解语音信号处理的基本原理和流程。

2. 掌握语音信号的采集、预处理、特征提取和识别等关键技术。

3. 提高实际操作能力,运用所学知识解决实际问题。

二、实验原理语音信号处理是指对语音信号进行采集、预处理、特征提取、识别和合成等操作,使其能够应用于语音识别、语音合成、语音增强、语音编码等领域。

实验主要包括以下步骤:1. 语音信号的采集:使用麦克风等设备采集语音信号,并将其转换为数字信号。

2. 语音信号的预处理:对采集到的语音信号进行降噪、去噪、归一化等操作,提高信号质量。

3. 语音信号的特征提取:提取语音信号中的关键特征,如频率、幅度、倒谱等,为后续处理提供依据。

4. 语音信号的识别:根据提取的特征,使用语音识别算法对语音信号进行识别。

5. 语音信号的合成:根据识别结果,合成相应的语音信号。

三、实验步骤1. 语音信号的采集使用麦克风采集一段语音信号,并将其保存为.wav文件。

2. 语音信号的预处理使用MATLAB软件对采集到的语音信号进行预处理,包括:(1)降噪:使用谱减法、噪声抑制等算法对语音信号进行降噪。

(2)去噪:去除语音信号中的杂音、干扰等。

(3)归一化:将语音信号的幅度归一化到相同的水平。

3. 语音信号的特征提取使用MATLAB软件对预处理后的语音信号进行特征提取,包括:(1)频率分析:计算语音信号的频谱,提取频率特征。

(2)幅度分析:计算语音信号的幅度,提取幅度特征。

(3)倒谱分析:计算语音信号的倒谱,提取倒谱特征。

4. 语音信号的识别使用MATLAB软件中的语音识别工具箱,对提取的特征进行识别,识别结果如下:(1)将语音信号分为浊音和清音。

(2)识别语音信号的音素和音节。

5. 语音信号的合成根据识别结果,使用MATLAB软件中的语音合成工具箱,合成相应的语音信号。

四、实验结果与分析1. 语音信号的采集采集到的语音信号如图1所示。

图1 语音信号的波形图2. 语音信号的预处理预处理后的语音信号如图2所示。

语音信号处理实验报告

语音信号处理实验报告

实验报告一、 实验目的、要求(1)掌握语音信号采集的方法(2)掌握一种语音信号基音周期提取方法(3)掌握短时过零率计算方法(4)了解Matlab 的编程方法二、 实验原理基本概念:(a )短时过零率:短时内, 信号跨越横轴的情况, 对于连续信号, 观察语音时域波形通过横轴的情况;对于离散信号, 相邻的采样值具有不同的代数符号, 也就是样点改变符号的次数。

对于语音信号, 是宽带非平稳信号, 应考察其短时平均过零率。

其中sgn[.]为符号函数⎪⎩⎪⎨⎧<=>=0 x(n)-1sgn(x(n))0 x(n)1sgn(x(n))短时平均过零的作用1.区分清/浊音:浊音平均过零率低, 集中在低频端;清音平均过零率高, 集中在高频端。

2.从背景噪声中找出是否有语音, 以及语音的起点。

(b )基音周期基音是发浊音时声带震动所引起的周期性, 而基音周期是指声带震动频率的倒数。

基音周期是语音信号的重要的参数之一, 它描述语音激励源的一个重要特征, 基音周期信息在多个领域有着广泛的应用, 如语音识别、说话人识别、语音分析与综合以及低码率语音编码, 发音系统疾病诊断、听觉残障者的语音指导等。

因为汉语是一种有调语言, 基音的变化模式称为声调, 它携带着非常重要的具有辨意作用的信息, 有区别意义的功能, 所以, 基音的提取和估计对汉语更是一个十分重要的问题。

由于人的声道的易变性及其声道持征的因人而异, 而基音周期的范围又很宽, 而同—个人在不同情态下发音的基音周期也不同, 加之基音周期还受到单词∑--=-=10)]1(sgn[)](sgn[21N m n n n m x m x Z发音音调的影响, 因而基音周期的精确检测实际上是一件比较困难的事情。

基音提取的主要困难反映在: ①声门激励信号并不是一个完全周期的序列, 在语音的头、尾部并不具有声带振动那样的周期性, 有些清音和浊音的过渡帧是很难准确地判断是周期性还是非周期性的。

语音信号处理实验报告

语音信号处理实验报告

语音信号处理实验报告实验一:语音信号的端点检测学院:电子与信息学院专业:11级信息工程姓名:学号:提交日期:实验一:语音信号的端点检测1、实验内容语音信号端点检测技术其目的就是从包含语音的一段信号中准确地确定语音的起始点和终止点,区分语音和非语音信号,它是语音处理技术中的一个重要方面。

本实验的目的就是要掌握基于MATLAB编程实现带噪语音信号端点检测,利用MATLAB对信号进行分析和处理,学会利用短时过零率和短时能量,对语音信号的端点进行检测。

2、实验方法本实验中,端点检测的方法有两种:短时能量和短时过零率。

语音和噪声的区别可以体现在它们的能量上,语音段的能量比噪声段能量大,语音段的能量是噪声段能量叠加语音声波能量的和。

在信噪比很高时,那么只要计算输入信号的短时能量或短时平均幅度就能够把语音段和噪声背景区分开。

这是仅基于短时能量的端点检测方法。

信号{x(n)}的短时能量定义为:短时过零表示一帧语音信号波形穿过横轴(零电平)的次数。

过零分析是语音时域分析中最简单的一种。

对于连续语音信号,过零意味着时域波形通过时间轴;而对于离散信号,如果相邻的取样值的改变符号称为过零。

过零率就是样本改变符号次数。

信号{x(n)}的短时平均过零率定义为:2.2、检测方法利用过零率检测清音,用短时能量检测浊音,两者配合。

首先为短时能量和过零率分别确定两个门限,一个是较低的门限数值较小,对信号的变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。

低门限被超过未必是语音的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音超过低门限,意味着信号开始。

此时整个端点检测可分为四段:静音段、过渡段、语音段、结束。

实验时使用一个变量表示当前状态。

静音段,如果能量或过零率超过低门限,就开始标记起始点,进入过渡段。

过渡段当两个参数值都回落到低门限以下,就将当前状态恢复到静音状态。

而如果过渡段中两个参数中的任一个超过高门限,即被认为进入语音段。

语音信号_实验报告

语音信号_实验报告

一、实验目的1. 理解语音信号的基本特性及其在数字信号处理中的应用。

2. 掌握语音信号的采样、量化、编码等基本处理方法。

3. 学习语音信号的时域、频域分析技术。

4. 熟悉语音信号的增强、降噪等处理方法。

二、实验原理语音信号是一种非平稳信号,其特性随时间变化。

在数字信号处理中,我们通常采用采样、量化、编码等方法将语音信号转换为数字信号,以便于后续处理和分析。

三、实验内容1. 语音信号的采集与预处理- 使用麦克风采集一段语音信号。

- 对采集到的语音信号进行预加重处理,提高高频成分的幅度。

- 对预加重后的语音信号进行采样,采样频率为8kHz。

2. 语音信号的时域分析- 画出语音信号的时域波形图。

- 计算语音信号的短时能量和短时平均过零率,分析语音信号的时域特性。

3. 语音信号的频域分析- 对语音信号进行快速傅里叶变换(FFT)分析,得到其频谱图。

- 分析语音信号的频谱特性,提取关键频段。

4. 语音信号的增强与降噪- 在语音信号中加入噪声,模拟实际应用场景。

- 使用谱减法对加噪语音信号进行降噪处理。

- 对降噪后的语音信号进行主观评价,比较降噪效果。

5. 语音信号的回放与对比- 对原始语音信号和降噪后的语音信号进行回放。

- 对比分析两种语音信号的时域波形、频谱图和听觉效果。

四、实验步骤1. 采集语音信号- 使用麦克风采集一段时长为5秒的语音信号。

- 将采集到的语音信号保存为.wav格式。

2. 预处理- 使用Matlab中的preemphasis函数对采集到的语音信号进行预加重处理。

- 设置预加重系数为0.97。

3. 时域分析- 使用Matlab中的plot函数画出语音信号的时域波形图。

- 使用Matlab中的energy和zero crossing rate函数计算语音信号的短时能量和短时平均过零率。

4. 频域分析- 使用Matlab中的fft函数对语音信号进行FFT变换。

- 使用Matlab中的plot函数画出语音信号的频谱图。

语音信处理实验报告

语音信处理实验报告

语音信号处理实验报告——语音信号分析实验一.实验目的及原理语音信号分析是语音信号处理的前提和基础,只有分析出可表示语音信号本质特征的参数,才有可能利用这些参数进行高效的语音通信、语音合成和语音识别等处理,并且语音合成的音质好坏和语音识别率的高低,都取决于对语音信号分析的准确性和精确性.贯穿语音分析全过程的是“短时分析技术”.因为从整体来看,语音信号的特性及表征其本质特征的参数均是随时间变化的,所以它是一个非平稳态过程,但是在一个短时间范围内一般认为在0~30ms的时间内,其特性基本保持不变,即相对稳定,可将其看做一个准稳态过程,即语音信号具有短时平稳性.所以要将语音信号分帧来分析其特征参数,帧长一般取为0ms~30ms.二.实验过程2.仿真结果(1) 时域分析男声及女声蓝色为时域信号,红色为每一帧的能量,绿色为每一帧的过零率 某一帧的自相关函数3. 频域分析一帧信号的倒谱分析和FFT 及LPC 分析050100150200250300-1-0.500.510510152025303540-50050100150050100150200250300-1-0.500.5100.51 1.52 2.53 3.5-40-2002040②男声和女声的倒谱分析③浊音和清音的倒谱分析④浊音和清音的FFT 分析和LPC 分析红色为FFT 图像,绿色为LPC 图像三. 实验结果分析 1. 时域分析实验中采用的是汉明窗,窗的长度对能否由短时能量反应语音信号的变对应的倒谱系数:,,……对应的LPC 预测系数:,,,,,……原语音一帧语音波形一帧语音的倒化起着决定性影响.这里窗长合适,En能够反应语音信号幅度变化.同时,从图像可以看出,En可以作为区分浊音和清音的特征参数.短时过零率表示一帧语音中语音信号波形穿过横轴零电平的次数.从图中可以看出,短时能量和过零率可以近似为互补的情况,短时能量大的地方过零率小,短时能量小的地方过零率较大.从浊音和清音的时域分析可以看出,清音过零率高,浊音过零率低.从男声女声的时域信号对比图中可以看出,女音信号在高频率分布得更多,女声信号在高频段的能量分布更多,并且女声有较高的过零率,这是因为语音信号中的高频段有较高的过零率.2.频域分析这里对信号进行快速傅里叶变换FFT,可以发现,当窗口函数不同,傅里叶变换的结果也不相同.根据信号的时宽带宽之积为一常数这一性质,可以知道窗口宽度与主瓣宽度成反比,N越大,主瓣越窄.汉明窗在频谱范围中的分辨率较高,而且旁瓣的衰减大,具有频谱泄露少的有点,所以在实验中采用的是具有较小上下冲的汉明窗.为了使频域信号的频率分辨率较高,所取的DFT及相应的FFT点数应该足够多,但时域信号的长度受到采样率和和短时性的限制,这里可以采用补零的办法,对补零后的序列进行FFT变换.从实验仿真图可以看出浊音的频率分布比清音高.3.倒谱分析通过实验可以发现,倒谱的基音检测与语音加窗的选择也是有关系的.如果窗函数选择矩形窗,在许多情况下倒谱中的基音峰将变得不清晰,窗函数选择汉明窗较为合理,可以发现,加汉明窗的倒谱基音峰较为突出.在典型的浊音清音倒谱对比中,理论上浊音倒谱基音峰应比较突出,而清音不出现这种尖峰,只是在倒谱的低时域部分包含声道冲激响应的信息.实验仿真的图形不是很理想.4.线性预测分析从实验中可以发现,LPC谱估计具有一个特点,在信号能量较大的区域即接近谱的峰值处,LPC谱和信号谱很接近;而在信号能量较低的区域即接近谱的谷底处,则相差比较大.在浊音清音对比中,可以发现,对呈现谐波特征的浊音语音谱来说这个特点很明显,就是在谐波成分处LPC谱匹配信号谱的效果要远比谐波之间好得多.在实验中,当P值增加到一定程度,预测平方误差的改善就不很明显了,而且会增加计算量,一般取为8~4,这里P取为0.5.基音周期估计自互相关函数法②短时平均幅度差法③倒谱分析法共偏移92+32=24个偏移点6000/24=可以发现,上面三种方法计算得到的基音周期基本相同.。

语音信号处理实验报告

语音信号处理实验报告

语音信号处理实验报告 The Standardization Office was revised on the afternoon of December 13, 2020语音信号处理实验报告——语音信号分析实验一.实验目的及原理语音信号分析是语音信号处理的前提和基础,只有分析出可表示语音信号本质特征的参数,才有可能利用这些参数进行高效的语音通信、语音合成和语音识别等处理,并且语音合成的音质好坏和语音识别率的高低,都取决于对语音信号分析的准确性和精确性。

贯穿语音分析全过程的是“短时分析技术”。

因为从整体来看,语音信号的特性及表征其本质特征的参数均是随时间变化的,所以它是一个非平稳态过程,但是在一个短时间范围内(一般认为在10~30ms的时间内),其特性基本保持不变,即相对稳定,可将其看做一个准稳态过程,即语音信号具有短时平稳性。

所以要将语音信号分帧来分析其特征参数,帧长一般取为10ms~30ms。

二.实验过程男声及女声(蓝色为时域信号,红色为每一帧的能量,绿色为每一帧的过零率)某一帧的自相关函数3.频域分析①一帧信号的倒谱分析和FFT及LPC分析②男声和女声的倒谱分析对应的倒谱系数:,,……对应的LPC预测系数:1,,,,,……原语音波形一帧语音波形一帧语音的倒谱③浊音和清音的倒谱分析④浊音和清音的FFT分析和LPC分析(红色为FFT图像,绿色为LPC图像)三.实验结果分析1.时域分析实验中采用的是汉明窗,窗的长度对能否由短时能量反应语音信号的变化起着决定性影响。

这里窗长合适,En能够反应语音信号幅度变化。

同时,从图像可以看出,En可以作为区分浊音和清音的特征参数。

短时过零率表示一帧语音中语音信号波形穿过横轴(零电平)的次数。

从图中可以看出,短时能量和过零率可以近似为互补的情况,短时能量大的地方过零率小,短时能量小的地方过零率较大。

从浊音和清音的时域分析可以看出,清音过零率高,浊音过零率低。

从男声女声的时域信号对比图中可以看出,女音信号在高频率分布得更多,女声信号在高频段的能量分布更多,并且女声有较高的过零率,这是因为语音信号中的高频段有较高的过零率。

语音信号处理实验报告2

语音信号处理实验报告2

实验二语音信号的频域特性一、实验目的(1)结合汉语语音信号的各类音素和复元音的特点分析其频域性质;(2)熟悉语音信号的各类音素和复元音的频域参数;(3)熟悉声音编辑软件PRAAT的简单使用和操作。

二、实验记录与思考题1.观察语音信号的频域特点, 总结其规律。

浊音段:其谱线结构是与浊音信号中的周期信号密切相关。

具有与基音及其谐波对应的谱线。

频谱包络中有几个凸起点, 与声道的谐振频率相对应。

这些凸起点为共振峰。

清音段:2.清音的频谱无明显的规律, 比较平坦。

总结清音/b/p/m/f/d/t/n/l/g/k/h/j/q/x/z/c/s/zh/ch/sh/r/共21个的语谱图的规律, 给出辅音的能量集中区;语谱图中的花纹有横杠、乱纹和竖直条。

横杠是与时间轴平行的几条深黑色带纹, 它们是共振峰。

从横杠对应的频率和宽度可以确定相应的共振峰频率和带宽。

在一个语音段的语谱图中, 有没有横杠出现是判断它是否是浊音的重要标志。

竖直条是语谱图中出现于时间轴垂直的一条窄黑条。

每个竖直条相当于一个基音, 条纹的起点相当于声门脉冲的起点, 条纹之间的距离表示基音周期, 条纹越密表示基音频率越高。

b, p……清音的语谱图为乱纹。

辅音的能量集中区为: 高频区4./r/、/m/、/n/、/l/ 从这几个音素的的基频、共振峰频率分析宽带语谱图和窄带语谱图的不同之处, 请解释原因;语谱图中的花纹有横杠、乱纹和竖直条等。

横杠是与时间轴平行的几条深黑色带纹, 它们是共振峰。

从横杠对应的频率和宽度可以确定相应的共振峰频率和带宽。

在一个语音段的语谱图中, 有没有横杠出现是判断它是否是浊音的重要标志。

竖直条(又叫冲直条)是语谱图中出现与时间轴垂直的一条窄黑条。

每个竖直条相当于一个基音, 条纹的起点相当于声门脉冲的起点, 条纹之间的距离表示基音周期。

条纹越密表示基音频率越高。

宽带语谱图的时域分辨率高、可以看见语谱图上的纵的线条;窄带语谱图的频域分辨率高、语谱图上横的线条明显。

语音信号实验报告

语音信号实验报告

一、实验目的1. 理解语音信号的基本特性和处理方法。

2. 掌握语音信号的采样、量化、编码等基本过程。

3. 学习使用相关软件对语音信号进行时域和频域分析。

4. 了解语音信号的降噪、增强和合成技术。

二、实验原理语音信号是一种非平稳的、时变的信号,其频谱特性随时间变化。

语音信号处理的基本过程包括:信号采集、信号处理、信号分析和信号输出。

三、实验仪器与软件1. 仪器:计算机、麦克风、耳机。

2. 软件:Matlab、Audacity、Python。

四、实验步骤1. 信号采集使用麦克风采集一段语音信号,并将其存储为.wav格式。

2. 信号处理(1)使用Matlab读取.wav文件,提取语音信号的采样频率、采样长度和采样数据。

(2)将语音信号进行时域分析,包括绘制时域波形图、计算信号的能量和过零率等。

(3)将语音信号进行频域分析,包括绘制频谱图、计算信号的功率谱密度等。

3. 信号分析(1)观察时域波形图,分析语音信号的幅度、频率和相位特性。

(2)观察频谱图,分析语音信号的频谱分布和能量分布。

(3)计算语音信号的能量和过零率,分析语音信号的语音强度和语音质量。

4. 信号输出(1)使用Audacity软件对语音信号进行降噪处理,比较降噪前后的效果。

(2)使用Python软件对语音信号进行增强处理,比较增强前后的效果。

(3)使用Matlab软件对语音信号进行合成处理,比较合成前后的效果。

五、实验结果与分析1. 时域分析从时域波形图可以看出,语音信号的幅度、频率和相位特性随时间变化。

语音信号的幅度较大,频率范围一般在300Hz~3400Hz之间,相位变化较为复杂。

2. 频域分析从频谱图可以看出,语音信号的能量主要集中在300Hz~3400Hz范围内,频率成分较为丰富。

3. 信号处理(1)降噪处理:通过对比降噪前后的时域波形图和频谱图,可以看出降噪处理可以显著降低语音信号的噪声,提高语音质量。

(2)增强处理:通过对比增强前后的时域波形图和频谱图,可以看出增强处理可以显著提高语音信号的幅度和频率,改善语音清晰度。

语音信号处理实验报告

语音信号处理实验报告

语音信号处理实验报告语音信号处理实验报告一、引言语音信号处理是一门研究如何对语音信号进行分析、合成和改善的学科。

在现代通信领域中,语音信号处理起着重要的作用。

本实验旨在探究语音信号处理的基本原理和方法,并通过实验验证其有效性。

二、实验目的1. 了解语音信号处理的基本概念和原理。

2. 学习使用MATLAB软件进行语音信号处理实验。

3. 掌握语音信号的分析、合成和改善方法。

三、实验设备和方法1. 设备:计算机、MATLAB软件。

2. 方法:通过MATLAB软件进行语音信号处理实验。

四、实验过程1. 语音信号的采集在实验开始前,我们首先需要采集一段语音信号作为实验的输入。

通过麦克风将语音信号输入计算机,并保存为.wav格式的文件。

2. 语音信号的预处理在进行语音信号处理之前,我们需要对采集到的语音信号进行预处理。

预处理包括去除噪声、归一化、去除静音等步骤,以提高后续处理的效果。

3. 语音信号的分析语音信号的分析是指对语音信号进行频谱分析、共振峰提取等操作。

通过分析语音信号的频谱特征,可以了解语音信号的频率分布情况,进而对语音信号进行进一步处理。

4. 语音信号的合成语音信号的合成是指根据分析得到的语音信号特征,通过合成算法生成新的语音信号。

合成算法可以基于传统的线性预测编码算法,也可以采用更先进的基于深度学习的合成方法。

5. 语音信号的改善语音信号的改善是指对语音信号进行降噪、增强等处理,以提高语音信号的质量和清晰度。

常用的语音信号改善方法包括时域滤波、频域滤波等。

六、实验结果与分析通过实验,我们得到了经过语音信号处理后的结果。

对于语音信号的分析,我们可以通过频谱图观察到不同频率成分的分布情况,从而了解语音信号的特点。

对于语音信号的合成,我们可以听到合成后的语音信号,并与原始语音信号进行对比。

对于语音信号的改善,我们可以通过降噪效果的评估来判断处理的效果。

七、实验总结通过本次实验,我们深入了解了语音信号处理的基本原理和方法,并通过实验验证了其有效性。

语音信号处理实验

语音信号处理实验
人发音时存在口唇的辐射效应,口唇的辐射模型相当于一阶高通滤波器,所 以在对实际信号进行分析处理时,常用“预加重技术”,目的提升信号的高频部 分,使信号的频谱更加平坦,方便信号的分析。
3 实验过程
1)读语音数 wavread 2)听语音 sound 3)写语音 wavwrite 4)对语音信号进行分帧处理 5)对语音信号进行预加重
分帧处理流程
1 读语音数据。 2 求语音长度。 3 确定帧长和帧移。 4 确定可以分多少帧 5 for 循环实现各帧信号的取出。先确定各帧信号的起点和终点坐标,然后利 用矩阵操作函数将各帧信号取出。
[x,fs,bits]=wavread(' c:\windows\media\dig.wav '); x=x(:,1); x=x'; len=length(x); N=256; M=128; Fn=fix((len-N)/M+1); y=[]; for i=1:Fn
实验一 语音信号的预处理
1 实验目的
通过 Matlab 编程掌握语音信号的预处理方法,包括对信号进行分帧、预加 重,加窗处理。
2 实验原理
由于语音信号从整体上来看是一个非平稳过程,但是在一个短的时间内,其 特性保持相对不变,所以语音信号具有短时平稳性,对语音信号的分析和处理必 须建立在“短时”的基础上,将信号分为一段一段来分析其特征参数。
down=1+(i-1)*M; up=down+N-1; temp=x(down:up); y=[y;temp]; end % K=100; M=[]; for i=1:Fn temp=sum(abs(y(i,:)),2)
1
M=[M,temp]; end plot(M)
%短时过零率 [x,fs,bits]=wavread('c:\WINDOWS\Media\chimes.wav'); x=x(:,1); x=x'; len=length(x); N=256; M=128; Fn=fix((len-N)/M+1); y=[]; for i=1:Fn

语音信号处理基础实验

语音信号处理基础实验

语音信号处理基础实验(一)实验目的:掌握MATLAB采集语音信号、创建语音文件、读写等的原理及常用命令。

掌握语音信号线性叠加的方法,熟悉语音信号卷积原理,熟悉语音信号升采样/降采样方法。

实验原理:指导书摘选。

仪器与材料:微机,Matlab软件,U盘,记录用的笔和纸。

实验步骤:1打开MATLAB软件,File→New→script2读取录制好的语音文件,并使用plot函数显示出来。

要求:横轴和纵轴带有标注。

横轴的单位为秒(S), 纵轴显示归一化后的数值。

3读取一段语音并归一化。

然后生成一段随机信号(长度与语音信号相同),归一化后幅度乘以0.01。

最后线性叠加两端语音,用plot函数显示三种信号。

要求:横轴和纵轴带有标注。

横轴单位为秒(s),纵轴显示的为归一化后的数值。

4将读取的语音信号与随机信号进行卷积,并用plot函数显示该信号,并对比线性叠加信号的区别。

然后使用wavplay函数播放两种信号,并比较区别。

5改变读取的语音信号的采样频率,使用plot函数进行显示。

然后采用wavplay函数播放,比较采样频率对改变语音信号的影响。

注:实验报告字写小一点,手写程序在实验报告上,打印实验波形图粘贴在实验报告上,程序和波形图要一一对应。

实验程序:1.读取语音信号fs=1600;[x,fs]=audioread('C2_1_y.wav');sound(x,fs);N=length(x);time=(0:N-1)/fs;plot(time,x);axis([0 2 -1 1]);xlabel('time/s');ylabel('amplitude');结果:2.语音信号叠加clcclear all[x,fs]=audioread('C2_2_y.wav'); s=1:length(x);t=s/fs;xmax=max(abs(x));x=x/xmax;y=randn(size(x));ymax=max(abs(y));y=y/ymax;z=x+y;zmax=max(abs(z));z=z/zmax;figure(1)subplot(311)plot(t,x);xlabel('时间/s');ylabel('归一化幅值')title('(a)原始信号')subplot(312)plot(t,y);xlabel('时间/s');ylabel('归一化幅值')title('(b)随机序列')subplot(313)plot(t,z);xlabel('时间/s');ylabel('归一化幅值')title('(c)线性叠加')3.语音信号卷积clcclear all[x,fs]=audioread('C2_2_y.wav'); %读取s=1:length(x);t=s/fs;xmax=max(abs(x));x=x/xmax; %归一化y=randn(size(x)); %产生同x相同长度的随机序列ymax=max(abs(y));y=y/ymax; %随机序列归一化z=conv(x,y); %卷积计算zmax=max(abs(z));z=z/zmax;t2=(1:length(z))/fs;figure(1)subplot(311)plot(t,x);xlabel('时间/s');ylabel('归一化幅值');title('(a)原始信号');subplot(312)plot(t,y);xlabel('时间/s');ylabel('归一化幅值');title('(b)随机序列');subplot(313)plot(t2,z);xlabel('时间/s');ylabel('归一化幅值');title('(c)信号卷积');4.语音信号采样频率变换clcclear all[x,fs1]=audioread('C2_2_y.wav'); s1=1:length(x);t1=s1/fs1;xmax=max(abs(x));x=x/xmax;figure(1)subplot(311)plot(t1,x);xlabel('时间/s');ylabel('归一化幅值');title('(a)原始信号');p=2;q=1;x1=resample(x,p,q);x1max=max(abs(x1));x1=x1/x1max;fa=fs1*p/q;ta=(1:length(x1))/fa;subplot(312)plot(ta,x1);xlabel('时间/s'); ylabel('归一化幅值'); title('(b)2倍采样率'); p=1;q=2;x2=resample(x,p,q);x2max=max(abs(x2)); x2=x2/x2max;fb=fs1*p/q;tb=(1:length(x2))/fb; subplot(313)plot(tb,x2);xlabel('时间/s'); ylabel('归一化幅值'); title('(c)1/2倍采样率');运行结果:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

语音信号处理实验班级:学号:姓名:实验一基于MATLAB的语音信号时域特征分析(2学时)1)短时能量(1)加矩形窗a=wavread('mike.wav');a=a(:,1);subplot(6,1,1),plot(a);N=32;for i=2:6h=linspace(1,1,2.^(i-2)*N);%形成一个矩形窗,长度为2.^(i-2)*NEn=conv(h,a.*a);% 求短时能量函数Ensubplot(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');endend00.51 1.52 2.53x 104-11x 104024x 10405x 1040510x 10401020x 10402040(2)加汉明窗a=wavread('mike.wav'); a=a(:,1);subplot(6,1,1),plot(a); N=32; for i=2:6h=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 end00.51 1.52 2.53x 104-11x 104012x 104024x 104024x 1040510x 104010202) 短时平均过零率 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); %求卷积得其短时能量函数Ensubplot(3,1,2),plot(En);for i=1:n-1if a(i)>=0b(i)= 1;elseb(i) = -1;endif a(i+1)>=0b(i+1)=1;elseb(i+1)= -1;endw(i)=abs(b(i+1)-b(i)); %求出每相邻两点符号的差值的绝对值endk=1;j=0;while (k+N-1)<nZm(k)=0;for i=0:N-1;Zm(k)=Zm(k)+w(k+i);endj=j+1;k=k+N/2; %每次移动半个窗 endfor w=1:jQ(w)=Zm(160*(w-1)+1)/(2*N); %短时平均过零率 endsubplot(3,1,3),plot(Q),grid;00.51 1.52 2.53x 104-1100.51 1.52 2.53x 10410200204060801001201401601800.53) 自相关函数 N=240y=wavread('mike.wav'); y=y(:,1);x=y(13271:13510);x=x.*rectwin(240); R=zeros(1,240); for k=1:240for n=1:240-kR(k)=R(k)+x(n)*x(n+k);endendj=1:240;plot(j,R); grid;050100150200250-1.5-1-0.500.511.522.5实验二基于MATLAB分析语音信号频域特征1)短时谱cleara=wavread('mike.wav');a=a(:,1);subplot(2,1,1),plot(a);title('original signal');gridN=256;h=hamming(N);for m=1:Nb(m)=a(m)*h(m)endy=20*log(abs(fft(b)))subplot(2,1,2)plot(y);title('短时谱');grid0.511.522.53x 104-1-0.500.51original signal00.20.40.60.81 1.2 1.4 1.6 1.820.51短时谱2)语谱图[x,fs,nbits]=wavread('mike.wav') x=x(:,1);specgram(x,512,fs,100); xlabel('时间(s)'); ylabel('频率(Hz)'); title('语谱图');时间(s)频率(H z )语谱图0.511.52100020003000400050003)倒谱和复倒谱(1)加矩形窗时的倒谱和复倒谱 cleara=wavread('mike.wav',[4000,4350]); a=a(:,1); N=300;h=linspace(1,1,N); for m=1:Nb(m)=a(m)*h(m); endc=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('加矩形窗时的复倒谱')050100150200250300-2-11加矩形窗时的倒谱050100150200250300-10-5510加矩形窗时的复倒谱(2)加汉明窗时的倒谱和复倒谱cleara=wavread('mike.wav',[4000,4350]);a=a(;,1);N=300;h=hamming(N);for m=1:Nb(m)=a(m)*h(m);endc=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('加汉明窗时的复倒谱')050100150200250300-3-2-11加汉明窗时的倒谱050100150200250300-10-5510加汉明窗时的复倒谱实验三基于MATLAB的LPC分析MusicSource = wavread('mike.wav');MusicSource=MusicSource(:,1);Music_source = MusicSource';N = 256; % window length,N = 100 -- 1000;Hamm = hamming(N); % create Hamming windowframe = input('请键入想要处理的帧位置 = ');% origin is current frameorigin = Music_source(((frame - 1) * (N / 2) + 1):((frame - 1) * (N / 2) + N));Frame = origin .* Hamm';%%Short Time Fourier Transform%[s1,f1,t1] = specgram(MusicSource,N,N/2,N);[Xs1,Ys1] = size(s1);for i = 1:Xs1FTframe1(i) = s1(i,frame);endN1 = input('请键入预测器阶数 = '); % N1 is predictor's order [coef,gain] = lpc(Frame,N1); % LPC analysis usingLevinson-Durbin recursionest_Frame = filter([0 -coef(2:end)],1,Frame); % estimate frame(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;titl e('原始语音帧vs.预测后语音帧')subplot(2,1,2),plot(err);grid;title('误差');pause%subplot(2,1,2),plot(f',20*log(abs(FTframe2)));grid;title('%% Gain solution using G^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 ; % inverse filter A(Z)subplot(2,1,1),plot(f1',20*log(abs(FTframe1)),f1',(20*log(a bs(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;%% find_pitch%temp = FTframe1 - FFT_est(1 : length(f1'));% not move higher frequncepitch1 = log(abs(temp));pLength = length(pitch1);result1 = ifft(pitch1,N);% move higher frequncepitch1((pLength - 32) : pLength) = 0;result2 = ifft(pitch1,N);% direct do real cepstrum with errpitch = fftshift(rceps(err));origin_pitch = fftshift(rceps(Frame));subplot(211),plot(origin_pitch);grid;title('原始语音帧倒谱(直接调用函数)');subplot(212),plot(pitch);grid;title('预测误差倒谱(直接调用函数)');pausesubplot(211),plot(1:length(result1),fftshift(real(result1)));grid;title('预测误差倒谱(根据定义编写,没有去除高频分量)');subplot(212),plot(1:length(result2),fftshift(real(result2)));grid;title('预测误差倒谱(根据定义编写,去除高频分量)');050100150200250300-0.4-0.20.20.4原始语音帧vs.预测后语音帧050100150200250300-0.2-0.10.10.2误差010203040506070-100-5050短时谱010203040506070406080100LPC 谱050100150200250300-1-0.50.5原始语音帧倒谱(直接调用函数)050100150200250300-1-0.50.5预测误差倒谱(直接调用函数)050100150200250300-0.6-0.4-0.20.2050100150200250300-0.3-0.2-0.10.1预测误差倒谱(根据定义编写,去除高频分量)050100150200250300-0.6-0.4-0.20.2预测误差倒谱(根据定义编写,没有去除高频分量)050100150200250300-0.3-0.2-0.10.1预测误差倒谱(根据定义编写,去除高频分量)050100150200250300-0.6-0.4-0.20.2050100150200250300-0.3-0.2-0.10.1预测误差倒谱(根据定义编写,去除高频分量)实验四 基于VQ 的特定人孤立词语音识别研究1、mfcc.mfunction ccc = mfcc(x)bank=melbankm(24,256,8000,0,0.5,'m');bank=full(bank);bank=bank/max(bank(:));for k=1:12n=0:23;dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24)); endw = 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);for i=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';enddtm = zeros(size(m));for i=3:size(m,1)-2dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:); enddtm = dtm / 3;ccc = [m dtm];ccc = ccc(3:size(m,1)-2,:);2、vad.mfunction [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 = 30msminlen = 15; % 15*10ms = 150msstatus = 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;for n=1:length(zcr)goto = 0;switch statuscase {0,1}if amp(n) > amp1x1 = max(n-count-1,1);status = 2;silence = 0;count = count + 1;elseif amp(n) > amp2 | ...zcr(n) > zcr2status = 1;count = count + 1;elsestatus = 0;count = 0;endcase 2,if amp(n) > amp2 | ...zcr(n) > zcr2count = count + 1;elsesilence = silence+1;if silence < maxsilence count = count + 1;elseif count < minlenstatus = 0;silence = 0;count = 0;elsestatus = 3;endendcase 3,break;endendcount = count-silence/2;x2 = x1 + count -1;3、codebook.m%clear;function xchushi= 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);for p=1:afor i=1:16d(i)=odistan(m(p,:),chushi(i,:));enddmin=min(d);sumd(k)=sumd(k)+dmin;for i=1:16if d(i)==dminxchushi(i,:)=xchushi(i,:)+m(p,:); sum(i)=sum(i)+1;endendendfor i=1:16xchushi(i,:)=xchushi(i,:)/sum(i); endif k>1dela=abs(sumd(k)-sumd(k-1))/sumd(k); endk=k+1;chushi=xchushi;endreturn4、testvq.mclear;disp('这是一个简易语音识别系统,请保证已经将您的语音保存在相应文件夹中')disp('正在训练您的语音模版指令,请稍后...')for i=1:10fname = sprintf('D:\\matlab\\work\\dtw1\\海儿的声音\\%da.wav',i-1);x = wavread(fname);[x1 x2] = vad(x);m = mfcc(x);m = m(x1:x2-5,:);ref(i).code=codebook(m);enddisp('语音指令训练成功,恭喜!¡')disp('正在测试您的测试语音指令,请稍后...')for i=1:10fname = sprintf('D:\\matlab\\work\\dtw1\\海儿的声音\\%db.wav',i-1);x = wavread(fname);[x1 x2] = vad(x);mn = mfcc(x);mn = mn(x1:x2-5,:);%mn = mn(x1:x2,:)test(i).mfcc = mn;endsumsumdmax=0;sumsumdmin=0;disp('对训练过的语音进行测试')for w=1:10sumd=zeros(1,10);[a,b]=size(test(w).mfcc);for i=1:10for p=1:afor j=1:16d(j)=odistan(test(w).mfcc(p,:),ref(i).code(j,:)); enddmin=min(d);sumd(i)=sumd(i)+dmin;%×ÜʧÕæendendsumdmin=min(sumd)/a;sumdmin1=min(sumd);sumdmax(w)=max(sumd)/a;sumsumdmin=sumdmin+sumsumdmax;sumsumdmax=sumdmax(w)+sumsumdmax;disp('正在匹配您的语音指令,请稍后...')for i=1:10if (sumd(i)==sumdmin1)switch (i)case 1fprintf('您输入的语音指令为:%s; 识别结果为%s\n','前', '前');case 2fprintf('您输入的语音指令为:%s; 识别结果为%s\n','后', '后');case 3fprintf('您输入的语音指令为:%s; 识别结果为%s\n','左', '左');case 4fprintf('您输入的语音指令为ª:%s; 识别结果为%s\n','右', '右');case 5fprintf('您输入的语音指令为:%s; 识别结果为%s\n','东', '东');case 6fprintf('您输入的语音指令为:%s; 识别结果为%s\n','南', '南');case 7fprintf('您输入的语音指令为:%s; 识别结果为%s\n','西', '西');case 8fprintf('您输入的语音指令为:%s; 识别结果为%s\n','北', '北');case 9fprintf('您输入的语音指令为ª:%s; 识别结果为%s\n','上', '上');case 10fprintf('您输入的语音指令为ª:%s; 识别结果为%s\n','下', '下');otherwisefprintf('error');endendendenddelamin=sumsumdmin/10;delamax=sumsumdmax/10;disp('对没有训练过的语音进行测试')disp('正在测试你的语音,请稍后...')for i=1:10fname =sprintf('D:\\matlab\\work\\dtw1\\º£¶ùµÄÉùÒô\\%db. wav',i-1);x = wavread(fname);[x1 x2] = vad(x);mn = mfcc(x);mn = mn(x1:x2-5,:);%mn = mn(x1:x2,:)test(i).mfcc = mn;endfor w=1:10sumd=zeros(1,10);[a,b]=size(test(w).mfcc);for i=1:10for p=1:afor j=1:16d(j)=odistan(test(w).mfcc(p,:),ref(i).code(j,:)); enddmin=min(d);sumd(i)=sumd(i)+dmin;%×ÜʧÕæendendsumdmin=min(sumd);z=0;for i=1:10if (((sumd(i))/a)>delamax)||z=z+1;endenddisp('正在匹配您的语音指令,请稍后...')if z<=3for i=1:10if (sumd(i)==sumdmin)switch (i)case 1fprintf('您输入的语音指令为:%s; 识别结果为%s\n','前', '前');case 2fprintf('您输入的语音指令为:%s; 识别结果为%s\n','后', '后');case 3fprintf('您输入的语音指令为:%s; 识别结果为%s\n','左', '左');case 4fprintf('您输入的语音指令为ª:%s; 识别结果为%s\n','右', '右');case 5fprintf('您输入的语音指令为:%s; 识别结果为%s\n','东', '东');case 6fprintf('您输入的语音指令为:%s; 识别结果为%s\n','南', '南');case 7fprintf('您输入的语音指令为:%s; 识别结果为%s\n','西', '西');case 8fprintf('您输入的语音指令为:%s; 识别结果为%s\n','北', '北');case 9fprintf('您输入的语音指令为ª:%s; 识别结果为%s\n','上', '上');case 10fprintf('您输入的语音指令为ª:%s; 识别结果为%s\n','下', '下');otherwisefprintf('error');endendendelsefprintf('您输入的语音无效¡£¡\n')endend(学习的目的是增长知识,提高能力,相信一分耕耘一分收获,努力就一定可以获得应有的回报)。

相关文档
最新文档