文章目录
一、 目的及原理
1、目的
①了解复倒谱、倒谱以及同态分析的概念。
②掌握用Matlab编程进行倒谱分析的方法。
③加深对语音信号数字模型的了解。
④了解LPC谱的定义。
⑤了解LPC谱与信号谱之间的区别。
2、谱分析原理与方法
1)倒谱分析
序列x(n)的倒谱c(n)为该序列的z变换的模的对数的逆z变换。定义式为:
或表示成傅里叶变换形式
在具体实现时,用DFT代替傅里叶变换。类似地,这样得到的将是真实倒谱的混叠形式C(n),它是真实倒谱的逼近。
对倒谱进行滤波,取出低时间部分(流程图中称为倒谱窗)进行逆特征系统处理,可以得到一个平滑的对数谱函数,这个对数谱函数显示了输入语音段的共振峰结构,同时谱的峰值对应于共振峰频率。通过此对数谱进行峰值检测,就可以估计出前几个共振峰的频率和强度。对于浊音的声道特性,可以采用前三个共振峰来描述;清音不具备共振峰特点。
2)LPC谱分析
当给定了一组预测器系数后,将频率响应代入H(z),就得到语音产生模型的频率响应,即
画出其频率响应特性,可以预料在共振峰频率上会出现峰值。
如果利用P个取样值来进行预测,则称为P阶线性预测。可以证明:如果信号 s(n)是一个P阶的AR模型,则
P越大,LPC谱越能反映出语音短时谱的细节部分,但LPC谱的光滑度随之下降。由于我们的目的只是用LPC谱反映声道综合效应的谱的表示式,而具体的谐波形状是通过激励谱来控制的,因此LPC谱只要能够体现出语音的共振峰的结构和谱包络就可以,因此从计算复杂性的角度分析,预测阶数P应该适中。根据LPC谱定义的原理画出LPC谱分析的Matlab编程的流程图。
二、 两种方法实现
1.LPC法
1、程序代码
%% 1.数据读入以及分帧
clear all; clc; close all;
fle='aa.wav'; % 指定文件名
[x,fs]=wavread(fle); % 读入一帧语音信号
x=fra(256,110,x); %分帧,每帧30ms,即0.03*8000=240点
ee=x(100,:); %取其中的一帧
%对原始信号进行频谱分析
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个点,目的是画图的时候,维数一致
%% 2.数据预处理(预加重)
%定义高通滤波器
[h1,f1]=freqz([1,-0.98],[1],256,4000);%高通滤波器
pha=angle(h1); H1=abs(h1); %高通滤波器的相位、幅值
figure(1);
subplot(211);plot(f1,H1);title('高通滤波器的幅频响应');xlabel('频率/Hz');ylabel('幅度');
subplot(212);plot(pha);title('高通滤波器的相位响应');xlabel('频率/Hz');ylabel('角度/radians');
%对原始信号进行高通滤波
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(2);
subplot(211);plot(ee);
title('原始语音信号');xlabel('样点数');ylabel('幅度');
subplot(212);plot(real(un));
title('经高通滤波后的语音信号');xlabel('样点数');ylabel('幅度');
figure(3);
subplot(211);plot(pinlv,signal);
title('原始语音信号频谱');xlabel('频率/Hz');ylabel('幅度/dB');
subplot(212);plot(pinlv,u3);
title('经高通滤波后的语音信号频谱');xlabel('频率/Hz');ylabel('幅度/dB');
%% LPC
[ar,g] = lpcauto(un,100);
lpc_mag = abs(fft(ar,1024));
u_lpc=20*log10((sqrt(g)./lpc_mag(1:256)));
fft_mag = abs(fft(un,1024));
u_fft=20*log10(fft_mag(1:256));
figure(4);
plot(pinlv,u_lpc,'--r');hold on;
plot(pinlv,u_fft);hold off;
legend('LPC spectrum','STFT');
%% 分帧函数
function f=fra(len,inc,x)
fh=fix(((size(x,1)-len)/inc)+1)
f=zeros(fh,len);
i=1;n=1;
while i<=fh
j=1;
while j<=len
f(i,j)=x(n);
j=j+1;n=n+1;
end
n=n-len+inc;
i=i+1;
end
2、运行结果
①浊音仿真结果:
将自己录制的4秒钟长度,采样频率为8000的“a”,通过LPC法,并观察得到的LPC谱,得到的第一共振峰频率为380HZ,第二共振峰的频率为720HZ,第三共振峰为1800HZ。同时可以观察到,LPC谱对于高幅度处拟合效果好,随着P阶数的不断增大,对曲线的拟合效果逐渐增强。
②清音仿真结果:
2.倒谱法
1、程序代码
clc;clear;close all;
%% 倒谱法
waveFile='ppp.wav ';
[y, fs, nbits] = wavread(waveFile);
time=(1:length(y))/fs;
frameSize=floor(40*fs/1000); % 帧长
startIndex=round(10000); % 起始序号
% startIndex=round(20000); % 起始序号
% endIndex=startIndex+frameSize-1; % 结束序号
endIndex=startIndex+frameSize-1; % 结束序号
frame = y(startIndex:endIndex); % 取出该帧
frameSize=length(frame);
frame2=frame.*hamming(length(frame)); % 加 hamming window
rwy= rceps(frame2); % 求倒谱
%ylen=length(rwy);
ylen=max(size(rwy)) ;
cepstrum=rwy(1:floor(ylen/2));
%基音检测
LF=floor(fs/500);
HF=floor(fs/70);
cn=cepstrum(LF:HF);
[mx_cep ind]=max(cn);
%共振峰检测核心代码:
% 找到最大的突起的位置
NN=ind+LF;
han= hamming (NN);
cep=cepstrum(1:NN);
ceps=cep.*han; % hamming window
formant1=20*log(abs(fft(ceps)));
formant(1:2)=formant1(1:2);
for t=3:NN
%--do some median filtering
z=formant1(t-2:t);
md=median(z);
formant2(t)=md;
end
for t=1:NN-1
if t<=2
formant(t)=formant1(t);
else
formant(t)=formant2(t-1)*0.25+formant2(t)*0.5+formant2(t+1)*0.25;
end
end
subplot(3,1,1);
plot(cepstrum);
title('倒谱');
xlabel('样点数');
ylabel('幅度')
axis([0,140,-0.5,0.5])
spectral=20*log10(abs(fft(frame2)));
subplot(3,1,2);
xj=(1:length(spectral)/2)*fs/length(spectral);
plot(xj,spectral(1:length(spectral)/2));
title('频谱');
xlabel('频率/Hz');
ylabel('幅度/dB')
axis([0,3500,-50,50])
subplot(3,1,3);
xi=(1:NN/2)*fs/NN;
plot(xi,formant(1:floor(NN/2)));
title('平滑对数幅度谱');
xlabel('频率/Hz');
ylabel('幅度/dB')
axis([0,3500,-40,0])
2、仿真结果
①浊音仿真结果:
将自己录制的4秒钟长度,采样频率为8000的“a”,通过倒谱法得到的第一共振峰频率为400HZ,第二共振峰的频率为750HZ,第三共振峰为1800HZ。
②清音仿真结果:
三、分析对比
1.LPC法运行结果
2.倒谱法运行结果
3.对比分析:
通过LPC法得到的第一共振峰频率为380HZ,第二共振峰的频率为720HZ,第三共振峰为1800HZ。P越大,LPC谱越能反映出语音短时谱的细节部分,但LPC谱的光滑度随之下降。由于LPC谱反映声道综合效应的谱的表示式,而具体的谐波形状是通过激励谱来控制的,因此LPC谱只要能够体现出语音的共振峰的结构和谱包络就可以,因此在本题当中将P取40就能很好地反应共振峰特性。
对倒谱进行滤波,通过低时窗取出低时间部分进行逆特征系统处理,之后通过平滑得到对数谱函数,对数谱函数显示了输入语音段的共振峰结构,同时谱的峰值对应于共振峰频率,通过此对数谱进行峰值检测,可以估计出前几个共振峰的频率和强度,对于浊音的声道特性,可以采用前三个共振峰来描述,我们可以观察到第一共振峰频率为400HZ,第二共振峰的频率为750HZ,第三共振峰为1800HZ。将浊音换成清音可以发现对数谱过于平滑,故清音不具备共振峰特点。
倒谱法与LPC法得到的结果一致,并且符合人语音的共振峰频率范围,故得到的结果正确。对比倒谱法和LPC法,在本次分析当中,LPC法通过对曲线的拟合达到的效果比倒谱法更好,更容易得到数据结果。
四、总结
在本次语音信号谱分析当中,通过LPC法和倒谱法进行共振峰参数提取并进行编程实现,我们学习了语音信号处理的一些基本知识,了解了共振峰的相关概念和现有的共振峰估计方法。在LPC谱分析当中,P越大,LPC谱越能反映出语音短时谱的细节部分,但LPC谱的光滑度随之下降。由于LPC谱反映声道综合效应的谱的表示式,而具体的谐波形状是通过激励谱来控制的,因此LPC谱只要能够体现出语音的共振峰的结构和谱包络就可以。在倒谱分析中,对倒谱进行滤波,通过低时窗取出低时间部分进行逆特征系统处理,之后通过平滑得到对数谱函数,对数谱函数显示了输入语音段的共振峰结构,同时谱的峰值对应于共振峰频率,通过此对数谱进行峰值检测,可以估计出前几个共振峰的频率和强度,对于浊音的声道特性,可以采用前三个共振峰来描述。
五、收获与建议
在这次仿真作业当中,我了解基音的基本概念以及清音与浊音的区别,掌握了基本的基音提取方法、语音频谱的分析方法以及自相关法、倒谱法和LPC法进行基音提取、谱分析的 Matlab 编程,同时进一步熟练了应用 FFT 对典型信号进行频谱分析的方法。