短时能量和短时平均幅度
设语音波形时域信号为 x(n) 、加窗函数 w(n) 分帧处理后得到的第 i 帧语音信号为 y_i (n), 则 y_i (n) 满足:
y
i
(
n
)
=
w
(
n
)
∗
x
(
(
i
−
1
)
∗
i
n
c
+
n
)
y_i (n)=w(n)*x((i-1)*inc+n)
yi(n)=w(n)∗x((i−1)∗inc+n)
式中, w(n) 为窗函数, 一般为矩形窗或汉明窗; y_i (n) 是一帧的数值, n=1,2,⋯,L,i=1, 2,⋯,fn,L 为帧长; inc 为帧移长度; fn 为分帧后的总帧数。
计算第 i 帧语音信号 y_i (n) 的短时能量公式为
E
(
i
)
=
∑
(
n
=
0
)
(
L
−
1
)
y
i
2
(
n
)
,
1
⩽
i
⩽
f
n
E(i)=∑^{(L-1)}_{(n=0)}y_i^2 (n),1⩽i⩽fn
E(i)=(n=0)∑(L−1)yi2(n),1⩽i⩽fn
短时平均过零率
如果输人信号中包含漂移, 即信号在通往 AD 转换器前就有一个直流分量, 使 AD 转换后继续带有这个直流分量。直流分量的存在影响了短时平均过零率的正确估算, 所以建议在语音信号处理前先消除直流分量;短时平均过零率即离散信号相邻的取样值改变符号, 那它们的乘积一定为负数
y
i
(
n
)
y
i
(
n
+
1
)
<
0
y_i (n)y_i (n+1)<0
yi(n)yi(n+1)<0
Z
(
i
)
=
1
/
2
∑
n
=
0
(
L
−
1
)
∣
s
g
n
[
y
i
(
n
)
]
−
s
g
n
[
y
i
(
n
−
1
)
]
∣
,
1
⩽
i
⩽
f
n
Z(i)=1/2 ∑^{(L-1)}_{n=0} |sgn[y_i (n)]-sgn[y_i (n-1)]|, 1⩽i⩽fn
Z(i)=1/2n=0∑(L−1) ∣sgn[yi(n)]−sgn[yi(n−1)]∣,1⩽i⩽fn
%% audio enframe
clc;
clear all;
close all;
[audiodata,fs]=audioread("test.wav");
audiodata=audiodata-mean(audiodata);%elimate dc
% we can divided into fn enframe:fn=(N-overlap)/inc
% startIndex= 1, inc, 2*inc....
audiolen=length(audiodata);
audiot=audiolen/fs;
time= (0:audiolen-1)/fs;
wlen=fs*0.05;%there should be 0.05 but for figure
inc=0.5*wlen;
fn=floor((audiolen-(wlen-inc))/inc);
enframeaudio=zeros(wlen,fn);
energy=zeros(fn);
energytime=zeros(fn);
zcr=zeros(fn);
for i=1:fn
startindex=inc*(i-1)+1;
enframeaudio(:,i)=audiodata(startindex:startindex+wlen-1);
enframetime=(startindex+wlen/2)/fs;
%we get frame audio signal then cal energy
energy(i)= sum(enframeaudio(:,i).*enframeaudio(:,i));
energytime(i)=enframetime;
data=enframeaudio(:,i);
for j=1:wlen-1
if data(j)*data(j+1)<0
zcr(i)=zcr(i)+1;
end
end
end
figure(1);
subplot(211);
plot(time,audiodata);
title("原始音频时域图形");
subplot(212);
plot(energytime,zcr);
title("短时平均过零率")
% plot(energytime,energy);
% title("短时平均能量")