语音信号是一种非平稳的时变信号,它携带着各种信息。一般而言语音处理目的有两种,一种是对语音信号进行分析,提取特征参数,用于后续处理;一种是加工语音信号,如在语音增强中对含噪语音进行背景噪声抑制,以获得相对“干净”的语音。
根据分析参数不同,可分为时域分析和变换域(频域、倒谱域)分析,其中时域分析是最简单、最直观的方法,它直接对语音信号的时域波形进行分析提取主要有语音短时能量和平均幅度、短时平均过零率、短时自相关函数和短时平均幅度差函数等。
实际的语音信号是模拟信号,因此在对语音信号进行数字处理之前,首先要将模拟语音信号是s(t)以采样周期T采样,将其离散化为s(n),采样周期的选择应根据模拟语音信号的带宽来确定,以避免信号的频域混叠失真。
语音信号的预处理一般包括预加重处理和加窗处理
一 预加重处理
对输入的数字语音进行预加重,其目的是为了对语音的高频部分进行加重,去除口唇辐射的影响,增加语音的高频分辨率。一般通过传递函数为
的高通数字滤波器来实现预加重,其中a为预加重系数,一般为0.9<a<1。设n时刻语音采样值为x(n),经过预加重处理后的结果为y(n) = x(n) - ax(n-1),这里a=0.98。matlab代码如下,可以参考。
<span style="font-size:14px;">e=wavread('beijing.wav'); ee=e(200:455); %选取原始文件e的第200到455点的语音,也可选其他样点 r=fft(ee,1024); %对信号ee进行1024点傅立叶变换 r1=abs(r); %对r取绝对值 r1表示频谱的幅度值 pinlv=(0:1:255)*8000/512; %点和频率的对应关系 yuanlai=20*log10(r1); %对幅值取对数 signal(1:256)=yuanlai(1:256);%取256个点,目的是画图的时候,维数一致 [h1,f1]=freqz([1,-0.98],[1],256,4000);%高通滤波器 pha=angle(h1); %高通滤波器的相位 H1=abs(h1); %高通滤波器的幅值 r2(1:256)=r(1:256); u=r2.*h1'; % 将信号频域与高通滤波器频域相乘 相当于在时域的卷积 u2=abs(u) ; %取幅度绝对值 u3=20*log10(u2); %对幅值取对数 % un=filter([1,-0.98],[1],ee); %un为经过高频提升后的时域信号 figure(1);subplot(211); plot(f1,H1);title('高通滤波器的幅频响应'); xlabel('频率/Hz'); ylabel('幅度'); subplot(212);plot(pha);title('高通滤波器的相位响应'); xlabel('频率/Hz'); ylabel('角度/radians'); figure(2);subplot(211);plot(pinlv,signal);title('原始语音信号频谱'); xlabel('频率/Hz'); ylabel('幅度/dB'); subplot(212);plot(pinlv,u3);title('经高通滤波后的语音信号频谱'); xlabel('频率/Hz'); ylabel('幅度/dB');</span>
其中高通滤波器和经预加重处理后的图如下:
二 加窗处理
在进行预加重数字滤波处理后,接下来进行加窗分帧处理,语音信号是一种随时间而变化信号,主要分为浊音和清音两大类,由于发音器官的惯性运动,可以认为在一小段时间里(一般为10ms-30ms),语音信号近似不变,即语音信号具有短时平稳性。这样,可以把语音信号分为一些短段来进行处理,语音信号的分帧是采用可移动的有限长度窗口进行加权的办法来实现的,一般每秒的帧数为33-100帧,分帧虽然可以采用连续分段的方法,但一般要采用如图所示交叠分段的方法,为了使帧与帧之间平滑过渡,保持连续性,前一帧与后一帧的交叠部分为帧移,帧移和帧长的比值一般为0-1/2。
一般窗有两种,一种是矩形窗,一种是汉明窗,窗函数如下:
(1) 矩形窗 (2) 汉明窗
矩形窗的时域和频域波形,窗长N=61,matlab代码如下:
<span style="font-size:14px;">% 程序3.2:juxing.m x=linspace(0,100,10001); %在0~100的横坐标间取10001个值 h=zeros(10001,1); %为矩阵h赋0值 h(1:2001)=0; %前2000个值取为0值 h(2002:8003)=1; %窗长 ,窗内值取为1 h(8004:10001)=0; %后2000个值取为0值 figure(1); %定义图号 subplot(1,2,1) %画第一个子图 plot(x,h,'k'); %画波形,横坐标为x,纵坐标为h,k表示黑色 title('矩形窗时域波形'); %图标题 xlabel('样点数'); %横坐标名称 ylabel('幅度'); %纵坐标名称 axis([0,100,-0.5,1.5]) %限定横、纵坐标范围 line([0,100],[0,0]) %画出x轴 w1=linspace(0,61,61); %取窗长内的61个点 w1(1:61)=1; %赋值1,相当于矩形窗 w2=fft(w1,1024); %对时域信号进行1024点的傅立叶变换 w3=w2/w2(1) %幅度归一化 w4=20*log10(abs(w3)); %对归一化幅度取对数 w=2*[0:1023]/1024; %频率归一化 subplot(1,2,2); %画第二个子图 plot(w,w4,'k') %画幅度特性图 axis([0,1,-100,0]) %限定横、纵坐标范围 title('矩形窗幅度特性'); %图标题 xlabel('归一化频率 f/fs'); %横坐标名称 ylabel('幅度/dB'); %纵坐标名称 </span>
汉明窗matlab代码如下:
<span style="font-size:14px;">x=linspace(20,80,61); %在20~80的横坐标间取61个值作为横坐标点 h=hamming(61); %取61个点的哈明窗值为纵坐标值 figure(1); %画图 subplot(1,2,1); %第一个子图 plot(x,h,'k'); %横坐标为x,纵坐标为h,k表示黑色 title('Hamming窗时域波形'); %图标题 xlabel('样点数'); %横坐标名称 ylabel('幅度'); %纵坐标名称 w1=linspace(0,61,61); %取窗长内的61个点 w1(1:61)=hamming(61); %加哈明窗 w2=fft(w1,1024); %对时域信号进行1024点傅立叶变换 w3=w2/w2(1); %幅度归一化 w4=20*log10(abs(w3)) %对归一化幅度取对数 w=2*[0:1023]/1024; %频率归一化 subplot(1,2,2) %画第二个子图 plot(w,w4,'k') %画幅度特性图 axis([0,1,-100,0]) %限定横、纵坐标范围 title('Hamming窗幅度特性'); %图标题 xlabel('归一化频率 f/fs'); %横坐标名称 ylabel('幅度/dB'); %纵坐标名称</span>
(1) 矩形窗 (2) 汉明窗
通过图可以看出汉明窗具有更平滑的低通特性,能够在较高的程度上反映短时信号的频率特性。
下图说明了加窗方法,其中窗序列沿着语音样点值逐帧从左到右移动,窗w(n)长度为N。在确定窗函数后,对语音信号的分帧处理实际上就是对各帧进行某种变换或运算,设这种变换用T[]表示,x(n)为输入语音信号,w(n)为窗序列,h(n)是与w(n)有关的滤波器,则各帧经处理后输出可表示为
语音信号短时域分析之预处理(三)