特征提取(Feature Exaction)
对于音频信号,按时间分辨率、按局部or全局的观念、持续时间长短,或者爱怎么讲怎么讲,特征可分为长期(long-term)、中期(mid-term)、短期(short-term),也可以叫短时特征。
短时能量、功率是有点瞬时功率的概念,但又没有那么“瞬时”。大概是按帧在做计算。
短时功率在计算的时候,把每一帧的能量还要处理该帧的长度,量纲上等于[Watt]。
短时过零率(short-term zero corss rate,st-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:短时能量(横坐标是帧序号)
- % 版本说明:计算短时能量。
- % 如果分帧时,不能整除,则抛弃最后一帧,不予以计算
- % 时间: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:短时过零率(横坐标是帧序号)
- % 版本说明:计算短时过零率。
- % 如果分帧时,不能整除,则抛弃最后一帧,不予以计算
- % 时间: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