特征提取(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
以后,会把这两个特征用于语音端点检测中。
比如得到下面这张图。