音訊訊號特徵提取(1):短時特徵之短時能量、短時功率、短時過零率
阿新 • • 發佈:2019-02-05
特徵提取(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
以後,會把這兩個特徵用於語音端點檢測中。
比如得到下面這張圖。