音频信号特征提取(1):短时特征之短时能量、短时功率、短时过零率

特征提取(Feature Exaction)的重要性,就不用多说了。

对于音频信号,按时间分辨率、按局部or全局的观念、持续时间长短,或者爱怎么讲怎么讲,特征可分为长期(long-term)、中期(mid-term)、短期(short-term),也可以叫短时特征。术语翻译不统一,我也不专业。知道英文术语就好。

短时能量、功率是有点瞬时功率的概念,但又没有那么“瞬时”。大概是按帧在做计算。

短时功率在计算的时候,把每一帧的能量还要处理该帧的长度,量纲上等于[Watt]。

有时候,要把线性尺度的短时能量和短时功率换算成对数尺度,分贝(dB),还要对最大值进行归一化,换算成相对强度,让最大值为0dB。

短时过零率(short-term zero corss rate,st-ZCR),大概是从时域上描述信号频率吧,也是按帧计算。声母的ZCR高一些,韵母的要低一些。噪声的话,不太确定了。大概好像要是比韵母高。和声母,我还不太清楚。


大致的代码如下了。


短时能量。

function E = get_st_energy( x,fs,wlen_time,step_time,win_type,energy_unit )
%function zcr = get_st_energy( x,fs,wlen_time,step_time,win_type,energy_unit )
%   获取短时能量(没有除以帧长,所以不是计算的功率)。
%   输入参数
%           x:语音信号 --> 单声道
%           fs:采样速率
%           wlen_time:窗口时间(s)
%           step_time:步进时间(s)
%           win_type:'hamming','hanning',...,默认'hamming'
%           energy_unit:'dB',以归一化的能量显示 (单位:dB)。否则是线性刻度。
%   返回参数
%           E:短时能量(横坐标是帧序号)
% 作者:qcy
% 版本:v1.0
% 版本说明:计算短时能量。
% 如果分帧时,不能整除,则抛弃最后一帧,不予以计算
% 时间:2016年10月31日21:21:23

wlen = round(wlen_time * fs);
nstep = round(step_time * fs);

if nargin < 5
    win = hamming(wlen);
elseif nargin == 5
    if strcmp(win_type, 'hamming')
        win = hamming(wlen);
    elseif strcmp(win_type, 'hanning')
        win = hanning(wlen);
    else
        win = hamming(wlen);
    end
else
    win = hamming(wlen);
end

nFrames = floor((length(x) - wlen)/nstep) + 1; % 总帧数
E = [];

for k = 1:nFrames
    idx = (k-1) * nstep + (1:wlen);
    x_sub = x(idx) .* win;
    E(k) = sum(x_sub.^2); 
end

% 是否需要化成dB
if nargin == 6
    if strcmp(energy_unit, 'dB') 
        E = 10*log10(E/max(E)+eps);
    end
end
end


短时过零率。

function zcr = get_st_zcr( x,fs,wlen_time,step_time,win_type )
%function zcr = get_st_zcr(x,fs,wlen_time,step_time,win_type )
%   获取短时过零率。
%   输入参数
%           x:语音信号 --> 单声道
%           fs:采样速率
%           wlen_time:窗口时间(s)
%           step_time:步进时间(s)
%           win_type:'hamming','hanning',...,默认'hamming'
%   返回参数
%           zcr:短时过零率(横坐标是帧序号)
%
% 作者:qcy
% 版本:v1.0
% 版本说明:计算短时过零率。
% 如果分帧时,不能整除,则抛弃最后一帧,不予以计算
% 时间:2016年10月31日21:08:22

if(min(size(x))>1) % 如果不是单声道
    % ...
end

wlen = round(wlen_time * fs);
nstep = round(step_time * fs);

if nargin < 5
    win = hamming(wlen);
elseif narmin == 5
    if strcmp(win_type, 'hamming')
        win = hamming(wlen);
    elseif strcmp(win_type, 'hanning')
        win = hanning(wlen);
    else
        win = hamming(wlen);
    end
else
    win = hamming(wlen);
end


nFrames = floor((length(x) - wlen)/nstep) + 1; % 总帧数
zcr = [];

for k = 1:nFrames
    idx = (k-1) * nstep + (1:wlen);
    x_sub = x(idx) .* win;
    x_sub1 = x_sub(1:end-1);
    x_sub2 = x_sub(2:end);
    zcr(k) = sum(abs(sign(x_sub1) - sign(x_sub2))) / 2 / length(x_sub1); 
end

end

以后,会把这两个特征用于语音端点检测中。

比如得到下面这张图。


评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qcyfred

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值