语音信号的谱分析

一、 目的及原理

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 对典型信号进行频谱分析的方法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值