程序代码如下: 1.%短时谱函数 figure(1) clear a=wavread('speech_c.wav'); subplot(2,1,1) plot(a);title('original signal'); grid N=256; h=hamming(N); for m=1:N b(m)=a(m)*h(m) end y=20*log(abs(fft(b))) subplot(2,1,2) plot(y);title(' 短时谱'); grid
2.%语谱图 figure(2) [x,fs,nbits]=wavread('speech_c.wav') specgram(x,512,fs,100); xlabel('时间(s)'); ylabel('频率(Hz)'); title('语谱图');
3.%短时能量 figure(3); a=wavread('speech_c.wav'); sound(a); subplot(6,1,1),plot(a); N=32; for i=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 figure(4); a=wavread('bird.wav'); subplot(6,1,1),plot(a); N=32; for i=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
4 %短时平均过零率 figure(5); a=wavread('speech_c.wav'); 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); for i=1:n-1 if a(i)>=0 b(i)= 1; else b(i) = -1; end if a(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)<n Zm(k)=0; for i=0:N-1; Zm(k)=Zm(k)+w(k+i); end j=j+1; k=k+N/2; %每次移动半个窗 end for w=1:j Q(w)=Zm(160*(w-1)+1)/(2*N); %短时平均过零率 end subplot(3,1,3),plot(Q);
5.%短时自相关函数 figure(6) N=240 a=wavread('speech_c.wav'); x=a(85001:85240); x=x.*rectwin(240); R=zeros(1,240); for k=1:240 for n=1:240-k R(k)=R(k)+x(n)*x(n+k); end end j=1:240; plot(j,R); grid; 6.%短时平均幅度 figure(7) N=240; L=length(a) LL=length(a)/N a=wavread('speech_c.wav'); sound(a); Mn=sum(abs(a))/N Mn=zeros(1,(LL-1)*240); for ii=1:(LL-1)*240; temp=a(ii:ii+240); Mn(ii)=sum(abs(temp))/N; end jj=[1:(LL-1)*240]; plot(jj, Mn,'b'); grid 一.实验要求 1 以波形和短时频谱的形式表示一个语音片段 2 用matlab 产生一个声谱图,然后将它和matlab中的 specgram.m文件进行比较以保证正确性 3对语音信号的时域波形进行分析,提取的特征参数主要有语音的短时能量,短时平均过零率,短时平均幅度,短时自相关函数等。 4*根据语音特征区分浊音和清音 语音分割,应用端点检测并给出简要结果比较
图(一)语音信号的波形和短时谱
利用a=(N1:N2)分别截取语音信号中的清音及浊音片段,得到其短时谱分别如下图(二)和图(三)所示: 图(二)清音的短时谱
图(三)浊音的短时谱
图(四)语音信号的语谱图
3.对语音信号的时域波形进行分析 (1).短时能量分析,由于语音信号的能量随时间变化,清音和浊音之间的能量差别相当显著。实验结果表明浊音段的能量En明显高于清音段,可通过设置一个能量门限值大致划分浊音区间跟清音区间,此外,信噪比较高时,短时能量还可以用来区分有声与无声。因此对语音的短时能量进行分析,可以描述语音的这种特征变化情况. 以下是分别对该语音信号的短时能量进行加矩形窗和汉明窗处理的图像
图(五)加矩形窗的不同窗长N时的短时能量函数
图(六)加汉明窗的不同窗长N时的短时能量函数 分析结果:由于在用短时能量反映语音信号的幅度变化时,不同的窗函数以及相应窗的长短均有影响。hamming窗的效果比矩形窗略好。但是,窗的长短影响起决定性作用。窗过大(N 很大),等效于很窄的低通滤波器,不能反映幅度En的变化;窗过小( N 很小),短时能量随时间急剧变化,不能得到平滑的能量函数。在11.025kHz左右的采样频率下,N 选为100~200比较合适。
(2).短时平均过零率。过零率可以反映信号的频谱特性。当离散时间信号相邻两个样点的正负号相异时,我们称之为"过零",即此时信号的时间波形穿过了零电平的横轴。统计单位时间内样点值改变符号的次数具可以得到平均过零率。该语音信号的平均过零率如图(七)所示
图(七)语音信号的短时能量及短时平均过零率 分析结果:清音的短时能量较低,过零率高,浊音的短时能量较高,过零率低。高频率对应着高过零率,低频率对应着低过零率,那么过零率与语音的清浊音就存在着对应关系。.清音的过零率为0.6左右,浊音的过零率为0.2左右,两但者分布之间有相互交叠的区域,所以单纯依赖于平均过零率来准确判断清浊音是不可能的,在实际应用中往往是采用语音的多个特征参数进行综合判决。
( 3 ) 短时自相关函数。自相关函数用于衡量信号自身时间波形的相似性。清音和浊音的发声机理不同,因而在波形上也存在着较大的差异。浊音的时间波形呈现出一定的周期性,波形之间相似性较好;清音的时间波形呈现出随机噪声的特性,样点间的相似性较差。因此,我们用短时自相关函数来测定语音的相似特性。实验结果如图(六)与图(七)所示:
图(八)语音信号中一段清音的短时自相关函数
图(九)语音信号中一段浊音的短时自相关函数 分析结果:比较图(六)与图(七)可知,清音的短时自相关函数没有周期性,也不具有明显突起的峰值,且随着延时k的增大迅速减小,其性质类似于噪声,而浊音的自相关函数的曲线呈现明显的周期性,自相关函数的周期就是浊音信号的周期,根据这个性质可以判断一个语音信号是清音还是浊音,还可以判断浊音的基音周期。浊音语音的周期可用自相关函数中第一个峰值的位置来估算。由于语音信号的特性是变化的,因此要求取较小的窗长,保留语音信号的特性,又因为自相关函数要充分反映语音的周期性,需要较长的窗长,综上选择N=240较为合适。
(4) 短时平均幅度。由于短时能量函数的En对信号电平值过于敏感,需要计算信号样值的平方和,在定点实现时很容易产生溢出,因此可定义一个平均幅度函数Mn来衡量语音幅度的变化。实验结果如图(八)所示
图(八)语音信号的短时平均幅度
分析结果:由于短时平均幅度的动态范围要比短时能量的小,尽管短时平均幅度也可以用来区分清音和浊音,无声和有声,但由于其幅度差有限,结果不如短时能量明显。 |
|
来自: icecity1306 > 《开发资料》