1. 程式人生 > >音訊訊號特徵提取(1):短時特徵之短時能量、短時功率、短時過零率

音訊訊號特徵提取(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

以後,會把這兩個特徵用於語音端點檢測中。

比如得到下面這張圖。