天天看点

matlab处理语音信号(1)-短时处理

语音信号是一个非稳态的、时变的信号。

短时,是指10ms-30ms,在短时分析中,将语音信号分为一段一段地来分析其特征参数,其中每一段称为一"帧",帧长一般取10~30 ms。这样,对于整体的语音信号来讲,每一帧特征参数组成了特征参数时间序列。

1、读入wav数据

matlab处理语音信号(1)-短时处理

输入参数wavFilename是指以.wav为扩展名的音频文件名称。

输出参数:y是数字化的音频信号;fs是采样频率;nbits是每个样点在编码时的二进制位数(比特数)

matlab处理语音信号(1)-短时处理
matlab处理语音信号(1)-短时处理
function frameTime=frame2time(frameNum,framelen,inc,fs)
% 分帧后计算每帧对应的时间
frameTime=(((1:frameNum)-1)*inc+framelen/2)/fs;
           

2、分幁

产生重叠:在两个不重叠的帧之间插一些帧来提取特征参数,这就形成了相邻帧之间有重叠部分, 

设读入语音文件的数据存放在y中,y长为N,采样频率为f,取每帧长为wlen,后一帧对前一帧的位移量(简称为帧移)用inc表示

matlab处理语音信号(1)-短时处理
matlab处理语音信号(1)-短时处理
matlab处理语音信号(1)-短时处理
matlab处理语音信号(1)-短时处理

输入参数: x是语音信号;win是帧长或窗函数,若为窗函数,帧长便取窗函数长;inc是帧移。

输出参数:f是分帧后的数组,将为帧数×帧长。f x L

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
           

常用三种窗函数

matlab处理语音信号(1)-短时处理
matlab处理语音信号(1)-短时处理

3、时域分析

能量:

matlab处理语音信号(1)-短时处理

 应用:

平均幅度

matlab处理语音信号(1)-短时处理

 应用:

平均过零率

短时平均过零率表示一帧语音中语音信号波形穿过横轴(零电平)的次数

matlab处理语音信号(1)-短时处理

 应用:

在实际计算短时平均过零率参数时,需要十分注意的一个问题是,如果输入信号中包含漂移,即信号在通往AD转换器前就有一个直流分量,使AD转换后继续带有这个直流分量。因为直流分量的存在影响了短时平均过零率的正确估算,所以建议在语音信号处理前先消除直

流分量。

matlab处理语音信号(1)-短时处理

频域:

stft 短时傅里叶变换

function d=stftms(x,win,nfft,inc)
if length(win)==1          % 判断有否设置窗函数
    wlen=win;              % 否,设帧长
    win=hanning(wlen);     % 设置窗函数
else
    wlen=length(win);      % 设帧长
end
x=x(:); win=win(:);        % 把x和win都变为列数组
s = length(x);             % 计算x的长度

c = 1;
d = zeros((1+nfft/2),1+fix((s-wlen)/inc));   % 初始化输出数组
 
for b = 0:inc:(s-wlen)           % 设置循环
  u = win.*x((b+1):(b+wlen));    % 取来一帧数据加窗
  t = fft(u,nfft);               % 进行傅里叶变换
  d(:,c) = t(1:(1+nfft/2));      % 取1到1+nfft/2之间的谱值
  c = c+1;                       % 改变帧数,求取下一帧
end;
           
matlab处理语音信号(1)-短时处理

短时功率谱密度 

function [Pxx] = pwelch_2(x, nwind, noverlap, w_nwind, w_noverlap, nfft)
% 计算短时功率谱密度函数
% x是信号,nwind是每帧长度,noverlap是每帧重叠的样点数
% w_nwind是每段的窗函数,或相应的段长,
% w_noverlap是每段之间的重叠的样点数,nfft是FFT的长度

x=x(:);
inc=nwind-noverlap;       % 计算帧移
X=enframe(x,nwind,inc)';  % 分帧
frameNum=size(X,2);       % 计算帧数
%用pwelch函数对每帧计算功率谱密度函数
for k=1 : frameNum
    Pxx(:,k)=pwelch(X(:,k),w_nwind,w_noverlap,nfft);
end
           
matlab处理语音信号(1)-短时处理

继续阅读