安徽财经大学管理科学与工程学院本科毕业论文
end
p=Rm(10:n); %防止误判,去掉前边10个数值较大的
点
[Rmax,N(m)]=max(p); %读取第一个自相关函数的最大点
end %补回前边去掉的10个点 N=N+10;
T=N/8; %算出对应的周期
figure(2);stem(T,'.');axis([0 length(T) 0 10]);
xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');
得到结果如下:
图3-3 a1基音轨迹图
3.3.2 短时平均幅度差函数法检测基音周期
对每一帧信号进行平均幅度差运算程序如下:
x=wavread('a1.wav');%读取声音文件
12
安徽财经大学管理科学与工程学院本科毕业论文
b1=x(11001:22000);
figure(1);
stem(b1,'.'); %显示声音信号的波形
N=200;%窗长 A=[];
for k=1:200%延迟长度 sum=0; for m=1:N
sum=sum+abs(b1(m)-b1(m+k-1)); end A(k)=sum; end
s=x(11001:22000); figure(2) subplot(211); plot(s); subplot(212); plot(A); 得到结果如下:
13
安徽财经大学管理科学与工程学院本科毕业论文
图3-4 a1平均幅度差运算
3.4 基音周期检测的后处理
无论采用哪一种基音周期检测算法都可能产生基音检测的错误,使求得的基音周期轨迹中一个或几个基音周期估计值偏离了正常的估计(通常是偏离到正常值的两倍或1/2),并称这种偏离点为基音轨迹的“野点”。此时为了去除这些野点,可以采用各种平滑算法,其中最常用的是中值平滑算法和线性平滑算法。
这里采用中值平滑处理,中值平滑处理的基本原理是:设x(n)为输入信号,y(n)为中值滤波器的输出,采用一个滑动窗,输出值就是将窗外的中心移到n处时窗口输入样点的中值,及n点的左右各取L个样点。连同被平滑点中心共同构成一组信号采样点(共2L+1个样值),然后将这(2L+1)个样点按大小序列排成一排,此序列中中间着作为平滑器的输出。L值一般为1或2,即中值平滑起的“窗口”一般套住3个火5个样点。中值平滑的有点是既可以有效的除去少量的野点,又不会破坏基因周期轨迹中两个平滑段之间的阶跃性变化。
得到基音轨迹图后,在matlab中运行:
T1= medfilt1(T,5); %去除野点,中值平滑
14
安徽财经大学管理科学与工程学院本科毕业论文
figure(3);stem(T1,'.');axis([0 length(T1) 0 10]);
xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');
得到结果如下:
图3-6 处理后的a1基音轨迹图
3.5 滤波后的基音周期检测
对采样信号进行滤波处理,这里用截至频率为500Hz的低通滤波器,阻带衰减20dB,过度带宽0.1π。
打开matlab,运行如下程序: [x,fs,bits]=wavread('a1.wav'); x1=x(11001:22000); figure(1);
plot(x1);%做原始语音信号的时域图形 title('原始语音信号'); fc1=500;
15
安徽财经大学管理科学与工程学院本科毕业论文
N1=2*pi*0.9/(0.1*pi) wc1=2*pi*fc1/fs; if rem(N1,2)==0 end
Window= boxcar (N1+1); %长度为N1的矩形窗Window b1=fir1(N1,wc1/pi,Window); figure(2); freqz(b1,1,512);
title('低通滤波器的频率响应'); y= filter(b1,1,x1);%对信号进行低通滤波 figure(3); plot(y);
title('信号经过低通滤波器(时域)'); 得到结果如下:
N1=N1+1;
16