语音信号特征处理--FbankMFCC
Posted 栋次大次
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语音信号特征处理--FbankMFCC相关的知识,希望对你有一定的参考价值。
目录
代码地址:https://gitee.com/liangcd/speech_learning/tree/master/feature_extraction
数字信号处理基础
模拟信号转化为数字信号(ADC)
现实生活中遇到的大多数信号都是连续信号,而计算机只能处理离散信号,因此需要通过采样量化转化为数字信号。
以正弦波为例, x ( t ) = s i n ( 2 π f 0 t ) x(t)=sin(2\\pi f_0t) x(t)=sin(2πf0t),其中 f 0 f_0 f0是信号本身的频率,单位Hz。若我们对其每间隔 t s t_s ts秒进行一次采样,并使用一定范围的离散数值表示采样值,则得到采样后信号 x ( n ) = s i n ( 2 π f 0 n t s ) x(n)=sin(2\\pi f_0nt_s) x(n)=sin(2πf0nts), t s t_s ts为采样周期, f s = 1 / t s f_s=1/t_s fs=1/ts采样频率, n = 0 , 1... n=0,1... n=0,1...为离散整数序列。
问题:如果给定一个正弦波采样后的序列,可以唯一恢复出一个连续的正弦波吗?
频率混叠
不同频率的正弦波,经采样后,完全有可能出现相同的离散信号,为什么?
x
(
n
)
=
sin
(
2
π
f
0
n
t
s
)
=
sin
(
2
π
f
0
n
t
s
+
2
π
m
)
=
sin
(
2
π
(
f
0
+
m
n
t
s
)
n
t
s
)
\\beginaligned & x(n)=\\sin \\left(2 \\pi f_0 n t_s\\right) \\\\ =& \\sin \\left(2 \\pi f_0 n t_s+2 \\pi m\\right) \\\\ =& \\sin \\left(2 \\pi\\left(f_0+\\fracmn t_s\\right) n t_s\\right) \\endaligned
==x(n)=sin(2πf0nts)sin(2πf0nts+2πm)sin(2π(f0+ntsm)nts)
如果
m
=
k
n
m=kn
m=kn,k为整数(一般为常数),因为n为整数,m也是整数,若m=kn满足,则k必须为整数。替换以上公式为:
x
(
n
)
=
sin
(
2
π
(
f
0
+
k
f
s
)
n
t
s
)
\\mathrmx(\\mathrmn)=\\sin \\left(2 \\pi\\left(\\mathrmf_0+\\mathrmkf_\\mathrms\\right) \\mathrmnt_\\mathrms\\right)
x(n)=sin(2π(f0+kfs)nts)
从公式可以看出原始频率 f 0 f_0 f0和 f 0 + k f s f_0+kf_s f0+kfs两个信号对应的离散信号是相同的。这种现象是频率混叠,也解释了上述的问题。如何避免频率混叠?
奈奎斯特采样定理
采样频率大于信号中最大频率的两倍, f s / 2 ≥ f m a x f_s / 2 \\geq f_max fs/2≥fmax,即原始信号的一个周期内,至少要采样两个点,才能有效杜绝频率混叠问题。
问题:对一个采样率为16k的离散信号进行下采样,下采样到8k,为什么需要首先进行低通滤波?
根据奈奎斯特定律,采样率为16k的离散信号中可能存在频率不超过8k的信号,下采样到8k,音频中只允许存在最大频率不超过4kHz的信号,所以需要首先进行低通滤波,过滤掉超过4kHz的信号。
离散傅里叶变换
DFT将时域信号变换到频域,分析信号中频率成分,时域离散且周期的吸纳后可以进行DFT,非周期离散信号需要进行周期延拓。
DFT定义:给定一个长度为N的时域离散信号x(n),对应的离散频域序列X(m)为: X ( m ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π n m / N , m = 0 , 1 , 2 , … N − 1 \\mathrmX(\\mathrmm)=\\sum_\\mathrmn=0^\\mathrmN-1 \\mathrmx(\\mathrmn) \\mathrme^-\\mathrmj 2 \\pi \\mathrmnm / \\mathrmN, \\quad \\mathrmm=0,1,2, \\ldots N-1 X(m)=∑n=0N−1x(n)e−j2πnm/N,m=0,1,2,…N−1。其中, m = 0 , 1 , 2... N − 1 m=0,1,2...N-1 m=0,1,2...N−1为频率索引,X(m)为DFT的第m个输出。
根据欧拉公式,DFT的公式还可以为:
X
(
m
)
=
∑
n
=
0
N
−
1
x
(
n
)
[
cos
(
2
π
n
m
N
)
−
j
sin
(
2
π
n
m
N
)
]
\\mathrmX(\\mathrmm)=\\sum_\\mathrmn=0^\\mathrmN-1 \\mathrmx(\\mathrmn)\\left[\\cos \\left(\\frac2 \\pi \\mathrmnm\\mathrmN\\right)-\\mathrmj \\sin \\left(\\frac2 \\pi \\mathrmnm\\mathrmN\\right)\\right]
X(m)=n=0∑N−1x(n)[cos(N2πnm)−jsin(N2πnm)]
DFT本质上是一个线性变换:
X
⃗
=
F
x
⃗
\\vecX=\\boldsymbolF \\vecx
X=Fx
[
X
(
0
)
X
(
1
)
X
(
2
)
⋮
X
(
N
−
1
)
]
=
[
1
1
⋯
1
1
e
−
j
2
π
/
N
⋯
e
−
j
2
π
(
N
−
1
)
/
N
1
e
−
j
2
π
⋅
2
/
N
⋯
e
−
j
2
π
⋅
2
(
N
−
1
)
/
N
⋮
⋮
⋮
⋮
1
e
−
j
2
π
⋅
(
N
−
1
)
/
N
⋯
e
−
j
2
π
⋅
(
N
−
1
)
(
N
−
1
)
/
N
]
[
x
(
0
)
x
(
1
)
x
(
2
)
⋮
x
(
N
−
1
)
]
\\left[\\beginarrayc X(0) \\\\ X(1) \\\\ X(2) \\\\ \\vdots \\\\ X(N-1) \\endarray\\right]=\\left[\\beginarraycccc 1 & 1 & \\cdots & 1 \\\\ 1 & e^-j 2 \\pi / N & \\cdots & e^-j 2 \\pi(N-1) / N \\\\ 1 & e^-j 2 \\pi \\cdot 2 / N & \\cdots & e^-j 2 \\pi \\cdot 2(N-1) / N \\\\ \\vdots & \\vdots & \\vdots & \\vdots \\\\ 1 & e^-j 2 \\pi \\cdot(N-1) / N & \\cdots & e^-j 2 \\pi \\cdot(N-1)(N-1) / N \\endarray\\right]\\left[\\beginarrayc x(0) \\\\ x(1) \\\\ x(2) \\\\ \\vdots \\\\ x(N-1) \\endarray\\right]
语音笔记:时域分析