基于MATLAB的语音信号的时域特性分析(一)——分帧、窗函数

  语音信号是一个非稳态的。时变的信号。但在“短时间”范围内可以认为语音信号是稳态的、时不变的。这个短时间一般值10~30ms。由于有这个特性,故常把语音信号称为“准稳态”的信号。这个“准稳态”的特性构成了语音信号的“短时分析技术”。
   在短时分析中,将语音信号分为一段一段地来分析其特征参数,其中每一段称为一“帧”,帧长一般取10~30ms。这样,对于整体的语音信号来讲,每一帧特征参数组成了特征参数时间序列。
   不论分析什么参数以及蚕蛹什么分析方法,在按帧进行语音分析、提取语音参数之前,必须进行预处理,如语音信号的数字化、预加重、加窗和分帧等。

1、 MATLAB中的语音信号分帧

   在分帧中,往往设置在相邻两帧之间有一部分重叠。其原因是:语音信号是时变的,在短时范围内特征变化较小,所以作为稳态来处理;但超出这短时范围语音信号就有变化了。在相邻两帧之间基因发生了变化,如正好是两音节之间,或正好是声母向韵母过渡,等等,这时,其特征参数有可能变化较大,但为了使特征参数平滑地变化,在两个不重叠的帧之间插一些帧开提取特征参数,这就形成了相邻帧之间有重叠部分,如图所示。
这里写图片描述
   设读入语音文件的数据存放在y中,y长为N,采样频率为fs,取每帧长为wlen。在图中给出的语音段正发生在两个音节间过渡区,基因发生着变化。如果相邻两帧不重叠,给出的基因可能有一个跳变。为了使其平稳过渡,在两帧之间再插一帧或几帧,这样在相邻两帧之间就有重叠了。后一帧对前一帧的位移量(简称帧移)用inc表示,,相邻两帧之间的重叠部分为overlap=wlen-inc.
  对于长为N的语音信号按下式分帧:
(89) f n = ( N o v e r l a p ) / i n c = ( N w l e n + i n c ) / i n c   = ( N w l e n ) / i n c + 1  
数据将被分为fn帧,每一帧在数据y中开始的位置为
s t a r t i n d e x = ( 0 : ( n f 1 ) ) i n c + 1
这样就可以进行分帧了。
   在MATLAB中有分帧函数 enframe,segment,buffer2,frame等,enframe是voicebox中的函数,应用比较多,现介绍如下。

%名称:enframe
%功能:把语音信号按帧长和帧移进行分帧。
%调用格式:f=enframe(x,win,inc)

function f=enframe(x,win,inc)

nx=length(x(:));            % 取数据长度
nwin=length(win);           % 取窗长
if (nwin == 1)              % 判断窗长是否为1,若为1,即表示没有设窗函数
   len = win;               % 是,帧长=win
else
   len = nwin;              % 否,帧长=窗长
end
if (nargin < 3)             % 如果只有两个参数,设帧inc=帧长
   inc = len;
end
nf = fix((nx-len+inc)/inc); % 计算帧数
f=zeros(nf,len);            % 初始化
indf= inc*(0:(nf-1)).';     % 设置每帧在x中的位移量位置
inds = (1:len);             % 每帧数据对应1:len
f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));   % 对数据分帧
if (nwin > 1)               % 若参数中包括窗函数,把每帧乘以窗函数
    w = win(:)';            % 把win转成行数据
    f = f .* w(ones(nf,1),:);  % 乘窗函数
end

   说明:输入参数x是语音信号;win是帧长或窗函数,若为窗函数,帧长便取传函数长;inc是帧移。输出参数f是分帧后的数组,将为帧数x帧长。

2、语音分析中的窗函数

   在语音分析中常用的窗函数有矩形窗、海宁(Hanning)窗和汉明(Hamming)窗。
这里写图片描述
表中 Δ ω 是谱分析时的角频率分辨率。从表中可以看出,矩形窗主瓣的宽度最窄,但第一旁瓣的衰落最小。也就是说,它的频谱泄露要比另外两种窗函数大。在语音分析中,可根据不同情况选择不同的窗函数。

猜你喜欢

转载自blog.csdn.net/qq_39516859/article/details/80163385