参考:
https://blog.csdn.net/qq_39516859/article/details/80166842
语音分帧与加窗
语音具有时变特性,但在短时间范围内,其特性基本保持不变即相对稳定。所以具有短时平稳性
语音信号分成一段一段来分析,每一段称为一‘帧’,帧长一般取为10~30ms。
前一帧和后一帧的交叠部分称为帧移。
帧移与帧长的比值一般取为0~1/2.
窗函数
分帧用可移动的有限长度窗口进行加权的方法来实现。
窗口长度:
采样周期
T
s
=
1
/
f
s
T_s=1/f_s
Ts=1/fs,窗口长度N和频率
Δ
f
\Delta f
Δf之间的关系
Δ
f
=
1
N
T
s
\Delta f=\frac{1}{NT_s}
Δf=NTs1
三种窗对比
[外链图片转存失败(img-tjgqblFw-1563959674910)(assets/三种窗对比.jpg)]
时域分析
( 都用hamming窗
( 语音都为zj3.wav
帧长为 200
帧移为 100
短时能量
设第n帧语音信号
x
n
(
m
)
x_n(m)
xn(m)的短时能量用
E
n
E_n
En
E
n
=
∑
m
=
0
N
−
1
x
n
2
(
m
)
E_n=\sum^{N-1}_{m=0}x_n^2(m)
En=m=0∑N−1xn2(m)
短时平均幅度
算一帧语音信号能量大小
M
n
=
∑
m
=
0
N
−
1
∣
x
n
(
m
)
∣
M_n=\sum^{N-1}_{m=0}|x_n(m)|
Mn=m=0∑N−1∣xn(m)∣
短时过零率
表示一帧语音中语音信号波形穿过横轴(零电平)的次数。(正负变化的次数
Z
n
=
1
2
∑
m
−
0
N
−
1
∣
s
g
n
[
x
n
(
m
)
]
−
s
g
n
[
x
n
(
m
−
1
)
]
Z_n=\frac{1}{2}\sum^{N-1}_{m-0}|sgn[x_n(m)]-sgn[x_n(m-1)]
Zn=21m−0∑N−1∣sgn[xn(m)]−sgn[xn(m−1)]
s g n [ x ] = { 1 , ( x ) ≥ 0 ) − 1 , ( x < 0 ) sgn[x]=\begin{cases}1,&\text(x)\geq 0) \\ -1,&(x<0) \end{cases} sgn[x]={1,−1,(x)≥0)(x<0)
MATLAB 离散信号相邻的取样值改变符号,其乘积为负
x
i
(
m
)
×
x
i
(
m
+
1
)
<
0
x_i(m)\times x_i(m+1)<0
xi(m)×xi(m+1)<0
代码:
%短时时域分析参数计算并显示
clear all;
clc;
filedir=[];%设置路径
filename='D:\matlab\music\zj3.wav';
file=[filedir filename];
[x,Fs]=audioread(file);
wlen=200;%帧长
inc=100;%帧移
win=hamming(wlen);%海明窗
N=length(x);%信号长度
time=(0:N-1)/Fs;%计算出信号的时间刻度
%这些函数没有
% En1=STEn(x,win,inc);%短时能量
% Mn1=STMn(x,win,inc);%短时平均幅度
% Zcr1=STZcr(x,win,inc);%短时过零率
%返回的不是向量而是矩阵,因为一帧信号得到的不是一个数值
X=enframe(x,win,inc)'; %分帧,一列是一帧
fn=size(X,2);%帧数
frameTime=frame2time(fn,wlen,inc,Fs); %求出每帧对应的时间
%这个公式得再看一下
%短时能量
for i=1:fn
y=X(:,i);%每一帧数据
b=0;
for m=1:1:200
b=b+y(m).^2;
end
E(i)=b;
end
%短时平均幅度
for i=1:fn
y=X(:,i);%每一帧数据
b=0;
for m=1:1:200
b=b+abs(y(m));
end
M(i)=b;
end
%短时过零率
Z=zeros(1,fn); % 初始化
for i=1:fn
y=X(:,i);%每一帧数据
b=0;
for m=1:1:199
if y(m)*y(m+1)<0;
b=b+1;
end
Z(i)=b;
end
end
%短时自相关
d=time*Fs; %采样点数=时间乘上采样频率
for k=2:fn
y=X(:,k);%每一帧数据
ru=xcorr(y);
R(k)=max(ru);
end
%短时平均幅度差
for i=1:fn
y=X(:,i);%每一帧数据
for k=1:wlen
f(k)=sum(abs(y(k:end)-y(1:end-k+1)));
end
F(i)=max(f)
end
% %画图-短时能量
% figure(2)
% subplot(211)
% plot(time,x)
% title('原始语音')
% ylabel('幅值'); xlabel(['时间/s' 10 '(a)']);
% subplot(212)
% plot(frameTime,E);
% title('短时能量');
% ylabel('幅值'); xlabel(['时间/s' 10 '(b)']);
% % 画图-短时平均幅度
% figure(3)
% subplot(211)
% plot(time,x)
% title('原始语音')
% ylabel('幅值'); xlabel(['时间/s' 10 '(a)']);
% subplot(212)
% plot(frameTime,M);
% title('短时平均幅度');
% ylabel('幅值'); xlabel(['时间/s' 10 '(b)']);
% % 画图-短时过零率
% figure(4)
% subplot(211)
% plot(time,x)
% title('原始语音')
% ylabel('幅值'); xlabel(['时间/s' 10 '(a)']);
% subplot(212)
% plot(frameTime,Z);
% title('短时过零率');
% ylabel('次数'); xlabel(['时间/s' 10 '(b)']);
% % 画图-短时自相关-还不行
% figure(5)
% subplot(211)
% plot(time,x)
% title('原始语音')
% ylabel('幅值'); xlabel(['时间/s' 10 '(a)']);
% subplot(212)
% plot(time,R);
% title('短时自相关');
% ylabel('复制'); xlabel(['点数' 10 '(b)']);
短时自相关
对于浊音语音可以用自相关函数求出语音波形序列的基音周期。
线性预测分析时,也用到自相关函数。
语音信号x(m),自相关函数R(k)
K是最大延迟点数
R
n
(
k
)
=
∑
m
=
0
N
−
1
−
K
x
n
(
m
)
x
n
(
m
+
k
)
(
0
≤
k
≤
K
)
R_n(k)=\sum^{N-1-K}_{m=0}x_n(m)x_n(m+k) \quad (0\leq k\leq K)
Rn(k)=m=0∑N−1−Kxn(m)xn(m+k)(0≤k≤K)
短时平均幅度差
跟自相关函数有类似作用的参量
F
n
(
k
)
=
∑
m
=
0
N
−
1
−
k
∣
x
n
(
m
)
−
x
n
(
m
+
k
)
F_n(k)=\sum^{N-1-k}_{m=0}|x_n(m)-x_n(m+k)
Fn(k)=m=0∑N−1−k∣xn(m)−xn(m+k)