【特征提取】基于matlab共振峰估计【含Matlab源码 550期】

217 阅读6分钟

一、简介

共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰不但是音质的决定因素,而且反映了声道(共振腔)的物理特征。

元音和响辅音声谱包络曲线上的峰巅位置。共振峰的本义是指声腔的共鸣频率。在元音和响辅音的产生中,声源谱经过声腔的调制,原来谐波振幅不再随频率的升高而依次递减,而是有的加强,有的减弱,形成有起伏的新的包络曲线,曲线峰巅位置的频率值和声腔共鸣频率是一致的。就元音来说,头三个共振峰对其音色有质的规定性;其中头两个共振峰对舌位的高低前后特别敏感,声学元音图就是根据这两个共振峰的频率值绘制的。共振峰三维语图上表现为能量集中的横杠 。

共振峰是反映声道谐振特性的重要特征,它代表了发音信息的最直接的来源,而且人在语音感知中利用了共振峰信息。所以共振峰是语音信号处理中非常重要的特征参数,已经广泛地用作语音识别的主要特征和语音编码传输的基本信息。共振峰信息包含在频率包络之中,因此共振峰参数提取的关键是估计自然语音频谱包络,一般认为谱包络中的最大值就是共振峰。

共振峰产生的原理及其在音质上的体现

共振峰的分布位置是建立在声音产生媒介的共鸣物理结构基础上的(Resonant Physical Structure)。

无论是人声还是乐器,它们的声音特性都源自两个因素,一个是发声系统,如人的声带或乐器的振动簧片,另一个是共鸣系统。乐器不同的共鸣系统使其在一定频域中的分音的振幅得以突出,这样,这些区域就产生了这个乐器所特有的共振峰值,这些共振峰值同共鸣体的大小、形状的材料密切相关。由于一件乐器的结构是稳定的,因此在一件乐器发出的所有音调中,不论基频如何,都会表现出相同的共振峰值,只不过其显著性有强有弱罢了。这就可以帮助我们解释为什么在很多的乐器中,同一乐器所发出的不同音调具有相同的音质。

在语音声学中,人声也同样受自身生理如鼻孔、咽腔、口腔大小的影响有自身的共振峰区 。通过利用这些共鸣空间的形状和大小不同的变化(例如改变咽喉、嘴形),我们就能改变声音的共振峰。我们之所以能够区分不同的人声、元音,主要也是依靠它们的共振峰分布的位置。

1 什么是共振峰及共振峰的作用
前面讲过语音的激励模型,当声门周期脉冲激励信号通过声道时,会在声道内引起共振作用(这个过程在语音产生模型中叫做声道模型),从而产生一组共振频率,这组共振频率就被称为共振峰(频率),通常认为,语音谱包络中的几个极大值就是共振峰频率。准确的检测共振峰频率和带宽,有利于区分不同韵母,从于提高对语音语义的识别度。

2 共振峰估计的困难
(1)虚假共振峰的存在。
(2)相邻共振峰频率离的比较近时难以区分
(3)高音调语音的提取有一定困难。
总之,跟基音周期估计一样,目前尚没有一个完全准确的估计方法。

3 共振峰估计预处理
(1)预加重。目的是为了对去除口唇辐射的影响,便于对声道响应进行分析。
(2)端点检测。目的跟基音周期估计一样,不需要对静音段的语音做分析。

4 共振峰估计的方法
(1)倒谱法。
对语音做倒谱处理可以把激励信号与声道响应分离出来,然后去掉激励信号,之后再做傅里叶变换,就可以得到声道响应的包络线,对包络上寻找极大值,就是相应的共振峰频率。
(2)LPC法
由于通过线性预测我们可以求出一组预测系数,根据这组系数和全极点声道响应模型进行FFT变换,就可以得到声道传递函数的功率谱,再通过计算得到相应的极大值,就可以得到对应的共振峰频率
(3)HHT法
这个方法还没有细看,具体步骤还不详,主要是通过经验模态分解(EMD)和希尔伯特变换来求信号的幅值,频率、相位。

二、源代码

%实倒谱法共振峰估计
clear all; clc; close all;

waveFile='C4_3_y.wav';               % 设置文件名
[x, fs, nbits]=wavread(waveFile);                 % 读入一帧数据
u=filter([1 -.99],1,x);                                   % 预加重
wlen=length(u);                                          % 帧长
cepstL=6;                                                   % 倒频率上窗函数的宽度
wlen2=wlen/2;               
freq=(0:wlen2-1)*fs/wlen;                          % 计算频域的频率刻度
u2=u.*hamming(wlen);		                      % 信号加窗函数
U=fft(u2);                                                 % 按式(4-26)计算
U_abs=log(abs(U(1:wlen2)));                     % 按式(4-27)计算
 [Val,Loc,spect]=Formant_Cepst(u2,cepstL);       % 计算出共振峰频率
FRMNT=freq(Loc);                                 % 计算出共振峰频率
subplot(211)
plot(freq,U_abs,'k'); 
xlabel('频率/Hz'); ylabel('幅值/dB');
title('(a)信号对数谱X\_i(k)')
axis([0 4000 -6 2]); grid;
subplot(212)
plot(freq,spect,'k','linewidth',2); 
%LPC内插法的共振峰估计
clear all; clc; close all;

fle='C4_3_y.wav';                            % 指定文件名
[x,fs]=wavread(fle);                        % 读入一帧语音信号 
u=filter([1 -.99],1,x);                     % 预加重
wlen=length(u);                             % 帧长
p=12;                                       % LPC阶数
freq=(0:256)*fs/512;                        % 频率刻度

[F,Bw,pp,U]=Formant_Interpolation(u,p,fs);          %LPC内插法求共振峰
plot(freq,U,'k');
title('声道传递函数功率谱曲线');
xlabel('频率/Hz'); ylabel('幅值');
ll=length(F);                             % 共振峰个数
for k=1 : ll
    line([F(k) F(k)],[0 pp(k)],'color','k','linestyle','-.');    
end
% LPC求根法的共振峰估计
 clc; close all;

fle='C4_3_y.wav';                            % 指定文件名
[xx,fs]=audioread(fle);                       % 读入一帧语音信号

u=filter([1 -.99],1,xx);                    % 预加重
wlen=length(u);                             % 帧长
p=12;                                       % LPC阶数
n_frmnt=4;                                  % 取四个共振峰
freq=(0:256)*fs/512;                        % 频率刻度
df=fs/512;                                  % 频率分辨率

[F,Bw,U]=Formant_Root(u,p,fs,n_frmnt);
plot(freq,U,'k');
title('声道传递函数功率谱曲线');
xlabel('频率/Hz'); ylabel('幅值/dB');
p1=length(F);                              % 在共振峰处画线
m=floor(F/df);
pp=U(m);                                    %共振峰幅度
for k=1 : p1
    line([F(k) F(k)],[-5 pp(k)],'color','k','linestyle','-.');
end

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a