作者:桂。
时间:2017-05-05 21:45:07
链接:http://www.cnblogs.com/xingshansi/p/6815217.html
前言
主要总结一下常用的音频特征,并给出具体的理论分析及代码。
一、过零率
过零率的表达式为:
其中N为一帧的长度,n为对应的帧数,按帧处理。
理论分析:过零率体现的是信号过零点的次数,体现的是频率特性。因为需要过零点,所以信号处理之前需要中心化处理。
code(zcr1即为过零率):
for i=1:fn
z=X(:,i); % 取得一帧数据
for j=1: (wlen- 1) ; % 在一帧内寻找过零点
if z(j)* z(j+1)< 0 % 判断是否为过零点
zcr1(i)=zcr1(i)+1; % 是过零点,记录1次
end
end
end
二、短时能量
短时能量的表达式为:
理论分析:短时能量体现的是信号在不同时刻的强弱程度。
code:
for i=1 : fn
u=X(:,i); % 取出一帧
u2=u.*u; % 求出能量
En(i)=sum(u2); % 对一帧累加求和
end
三、短时自相关函数
短时自相关函数定义式为:
理论分析:学过信号处理的都应该知道,信号A与信号B翻转的卷积,就是二者的相关函数。其中是因为分帧的时候,加了窗函数截断,w代表窗函数。
code:假设一帧截断的信号
r = xcorr(signal);
这与直接利用卷积的方式等价:
给出卷积的实现:
function output_signal=my_direct_convolution(input_signal,impulse_response)
% Input:
% input_signal: the input signal
% impulse_response: the impulse response
% Output:
% output_signal:the convolution result
N=length(input_signal);%define length of signal
K=length(impulse_response);%define length of impulse response
output_signal=zeros(N+K-1,1);%initializing the output vector
xp=[zeros(K-1,1);input_signal;zeros(K-1,1)];
for i=1:N+K-1
output_signal(i)=xp(i+K-1:-1:i)'*impulse_response;
end
卷积也可以借助FFT快速实现。
调用卷积的函数:
r1 = my_direct_convolution(signal,signal(end:-1:1));
图中可以看出r与r1完全等价:
四、短时平均幅度差
假设x是加窗截断后的信号,短时平均幅度差定义:
理论分析:音频具有周期特性,平稳噪声情况下利用短时平均幅度差可以更好地观察周期