是减少共振峰的干扰。在文献中作者选用了500Hz作为滤波器的上限频率,并指出选择截止频率高不利于减少噪声和共振峰的影响。所以在本书的基音检测中的预滤波器选择的带宽为60~500Hz,高频截止频率选择500Hz,是因为基频区间的高端就在这个区域中,低频截止频率选择60Hz是为了减少工频和低频噪声的干扰。
我们选用IIR滤波器中的椭圆滤波器,因为IIR滤波器的运算量比FIR少,当然IIR滤波器会带来延迟,也就是相位的变化,但语音信号是对相位不敏感的信号;又选用椭圆滤波器,因为它在经典滤波器设计中相同过渡带和带宽条件下,需要的阶数比较小。在阶数相同的条件下,椭圆滤波器相比于其他类型的滤波器,能获得更窄的过渡带宽和较小的阻带波动, 就这点而言, 椭圆滤波器是最优的。
滤波器的要求为采样频率8000Hz,通带是60~500Hz,通带波纹为1dB,阻带分别
为30Hz和2000Hz,阻带衰减为40dB。
3.2.2代码编写
%
% pr8_1_1
clear all; clc; close all;
fs=8000; fs2=fs/2; % 采样频率 Wp=[60 500]/fs2; % 滤波器通带 Ws=[20 2000]/fs2; % 滤波器阻带
Rp=1; Rs=40; % 通带的波纹和阻带的衰减 [n,Wn]=ellipord(Wp,Ws,Rp,Rs); % 计算滤波器的阶数 [b,a]=ellip(n,Rp,Rs,Wn); % 计算滤波器的系数
fprintf('b=%5.6f %5.6f %5.6f %5.6f %5.6f %5.6f %5.6f\\n',b) fprintf('a=%5.6f %5.6f %5.6f %5.6f %5.6f %5.6f %5.6f\\n',a) [db, mag, pha, grd,w]=freqz_m(b,a); % 求取频率响应曲线 plot(w/pi*fs/2,db,'k'); % 作图 grid; ylim([-90 10]);
xlabel('频率/Hz'); ylabel('幅值/dB'); title('椭圆6阶带通滤波器频率响应曲线'); 3.2.3实验结果
由程序计算出滤波器系数为:
b=0.012280 -0.039508 0.042177 0.000000 -0.042177 0.039508 -0.012280
a=1.000000 -5.527146 12.854342 -16.110307 11.479789 -4.410179 0.713507
实验结果图:
图3 滤波前和后的语音信号
3.2.4结果分析
带通滤波器使原始信号变得更加平整,滤去了杂音,为基音检测减少干扰,使检测更加顺利进行。 3.3总结
通过这次课程实践,我深刻体会到自己在课程理论方面的不足,MATLAB的应用也相当生疏。在设计过程中,看不懂的东西很多,但是学会了通过上网搜查资料和自主从书本寻找知识。实践中遇到许多问题,但是和同学分工合作与讨论让我学会了很多平常学不到的知识。这次实践让我明白知识就像大海一样宽广,我们要像海绵吸水一样吸取有用的知识。
4.模块三(短时自相关函数法做基音检测) 4.1主要负责工作
在前面两个步骤之后用自相关函数法去实现基音周期的检测
4.2具体实现方法 4.2.1算法
设语音信号的时间序列x(n),它的自相关函数定义为:
R(k)=Σx(n)x(n-k),
K是时间的延迟量。
短时自相关函数有以下重要性质:
① 如果信号x(n))具有周期性,周期是P,那么它的自相关函数R(k) 也具有周期性,而且周期与信号x(n)的周期性相同。
② 当k=0时,短时自相关函数具有最大值,即在延迟量为0,±P,±2P,,,时,
周期信号的自相关函数也达到最大值。 ③ 短时自相关函数是偶函数,即R(k) =R(-k)。
短时自相关函数基因检测的主要原理大都是利用它的这些性质,通过比较原始信号和它的延迟后的信号之间的类似性质来确定基音周期。如果延迟量等于基音周期,那么两个信号具有最大类似性,或是直接找出短时自相关函数的两个最大值间的距离,即为基音周期的初估值。
在用短时自相关函数检测基音是,常用归一化的短时自相关函数,表达式为 r(k)= R(k)/ R(0)
以上性质②中已指出,k=0,R(0)为最大值。所以r(k)的模值永远小于或等于1。 已知基音频率范围为60Hz~500Hz之间,采样率为fs时,则基音周期(样点值)范围在fs/500~fs/60之间,然后在这个范围之间寻找归一化相关函数的最大值,对应的延迟量就是基音周期。 4.2.2代码编写步骤
① 根据前面步骤所得分帧后的语音数组,对它进行处理,把它转换为每一列数据表示
一阵语音信号,行数为总的帧长。
② 对每一帧语音信号的基音周期进行初始化,让其为零保证清音段无基音周期。 ③ 利用前面端点检测后所得的有话段和有话段段数,对每一段的有话段的每一帧数据
计算归一化自相关函数。
④ 最后对每一帧所得的归一化自相关函数取正延迟量的部分,然后在基音频率
范围内得最大值,从而可得最大值对应的样点数,利用函数循环计算,最后可以得出每段有话段内每一帧的基音周期。
4.2.3代码编写
用短时自相关函数法的程序:
function period=ACF_corr(y,fn,vseg,vsl,lmax,lmin) pn=size(y,2);
if pn~=fn, y=y'; end % 把y转换为每列数据表示一帧语音信号 wlen=size(y,1); % 取得帧长 period=zeros(1,fn); % 初始化
for i=1 : vsl % 只对有话段数据处理 ixb=vseg(i).begin; ixe=vseg(i).end;
ixd=ixe-ixb+1; % 求取一段有话段的帧数
for k=1 : ixd % 对该段有话段数据处理 u=y(:,k+ixb-1); % 取来一帧数据 ru= xcorr(u, 'coeff'); % 计算归一化自相关函数 ru = ru(wlen:end); % 取延迟量为正值的部分
[tmax,tloc]=max(ru(lmin:lmax)); % 在基音频率范围内寻找最大值 period(k+ixb-1)=lmin+tloc-1; % 给出对应最大值的延迟量 end end 4.2.4实验结果
图4端点检测的语音信号
图5有话段的基音周期
相关推荐: