文章目录
一、目的及原理
人在发音时,根据声带是否震动可以将语音信号分为清音跟浊音两种。浊音又称有声语言,携带者语言中大部分的能量,浊音在时域上呈现出明显的周期性;而清音类似于白噪声,没有明显的周期性。发浊音时,气流通过声门使声带产生张弛震荡式振动,产生准周期的激励脉冲串。这种声带振动的频率称为基音频率,相应的周期就成为基音周期。
基音周期是表征语音信号本质特征的参数,属于语音分析的范畴,只有准确分析并且提取出语音信号的特征参数,才能够利用这些参数进行语音编码、语音合成和语音识别等处理。语音编码的压缩率高低、语音合成的音质好坏及语音识别率的高低,也都依赖于对语音信号分析的准确性和精确性,因此基音周期估值在语音信号处理应用中具有十分重要的作用。
1、短时自相关法
如果X(n)是一个周期为P的信号,则其自相关函数也是周期为P的信号,且在信号周期的整数倍处,自相关函数取最大值。语音的浊音信号具有准周期性,其自相关函数在基音周期的整数倍处取最大值。计算两相邻最大峰值间的距离,就可以估计出基音周期。观察浊音信号的自相关函数图,其中真正反映基音周期的只是其中少数几个峰,而其余大多数峰都是由于声道的共振特性引起的。因此为了突出反映基音周期的信息,同时压缩其他无关信息,减小运算量,有必要对语音信号进行适当预处理后再进行自相关计算以获得基音周期。
由于语音信号与声道特性影响有关,有的情况下即使窗长已选得足够长,第一最大峰值点与基音仍不一致,这就是声道特性的共振峰特性造成的“干扰”。实际上影响从自相关函数中正确提取基音周期的最主要的因素就是声道响应部分。当基音的周期性和共振峰的周期性混叠在一起时,被检测出来的峰值就会偏离原来峰值的真实位置。另外,某些浊音中,第一共振峰频率可能会等于或低于基音频率。此时,如果其幅度很高,它就可能在自相关函数中产生一个峰值,而该峰值又可以同基音频率的峰值相比拟,从而给基音检测带来误差。为了提高基音周期检测的可靠性,采用中心削波法对原始信号进行预处理。
其中削波电平 CL 一般取最大信号幅度的 60%~70%。图1给出了中心削波处理后的结果。中心削波后,再用自相关检测出基音频率,错判为倍频或分频的情况就可以大大减少了。中心削波法实质上是对信号做非线性处理,它消除语音信号的低幅值部分,而保留高振幅的峰值,从而能有利于信号的基音周期估计。
经过中心削波后的信号,削去了大部分与声道响应有关的波动,只保留了超过削波电平的部分。对中心削波后的语音信号计算自相关函数,这样在基音周期位置呈现大而尖的峰值,而其余的次要峰值幅度都很小。
由自相关函数表达式可知,自相关需要大量的乘法运算,算法的运行效率低。结合自相关函数法和中心削波法对信号做基音周期估计,并在不影响基音周期估计准确性的前提下,用两个信号的互相关序列代替自相关序列而避免了大量的乘法运算,有效地提高了算法的运行效率。
显然 x(n)只有-1,0,1 三种可能的取值。自相关中的乘法运算都变成了加减运算,使得算法的效率得到大幅度的提高。
2、倒谱法
语音的倒谱是将语音的短时谱取对数后再进行IDFT得到的,所以浊音信号的周期性激励反映在倒谱上是同样周期的冲激。借此,可从倒谱波形中估计出基音周期。一般把倒谱波形中第二个冲激,认为是对应激励源的基频。下面给出一种倒谱法求基音周期的框图及流程图。先计算倒谱,然后在预期的基音周期附近寻找峰值。如果倒谱的峰值超出了预先规定的门限,则输入语音段定为浊音,而峰的位置就是基音周期的良好估值。如果没有超出门限的峰值,则输入语音段定为清音。如果计算的是一个时变的倒谱,则可估计出激励源模型及基音周期随时间的变化。一般每隔10~20ms计算一次倒谱,这是因为在一般语音中激励参数是缓慢变化的。
浊音语音的复倒谱中存在峰值,其出现时间等于基音周期;而清音语音段的复倒谱则不出现这种峰值。利用这一性质可以进行清/浊音判断并估计浊音的基音周期。这种方法的要点是计算出复倒谱后,进行解卷,提取出声门激励信息,在预期的基音周期附近寻找峰值。如果峰值超过了预先设定的门限,则语音段为浊音,而峰的位置就是基音周期的估计。如果不存在超过门限的峰值,则语音段定为清音。如果计算的是依赖于时间的复倒谱,则可估计出激励源模型及基音周期随时间的变化。
二、两种方法实现
1.短时自相关法
1、程序代码
%读入数据 采样fs=8KHz 采样位数16bit
%% 1.数据的读入
%读入语音文件并测定语音的长度
clc;clear;close all
waveFile='aa.wav ';
[a, fs] = audioread(waveFile);
a=a';
%测定语音的长度
L=length(a);
m=max(a);
%% 2.数据的预处理
%进行数据归一化
for i=1:L
a(i)=a(i)/m;
end
%找到归一化以后数据的最大值和最小值
m=max(a);
n=min(a);
%调整数据的中心位置以保证幅度值与横坐标轴对称
%采用计算公式是n+(m-n)/2,合并为(m+n)/2
ht=(m+n)/2;
for i=1:L; %数据中心下移 保持和横坐标轴对称
a(i)=a(i)-ht;
end
%画出中心削波前的语音波形图
figure(1);
subplot(2,1,1);
plot(a,'k');
%axis([0,1711,-1,1]);
title('中心削波前语音波形');
xlabel('样点数');
ylabel('幅度'