内容提要
1.数字信号处理基础
- 基础知识
- 傅里叶分析
2.常用特征提取
- 特征提取流程
- Fbank
- MfCC
3.课后实践
1.数字信号处理基础
1.1模拟信号到数字信号的转化(ADC)—— 采样和量化
- 以正弦波为例(图a)
-
对于一个正弦波
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) -
公式(2)即为离散信号的定义
- 其中, t s t_s ts为采样周期
- f s = 1 t s f_s = \frac{1}{t_s} fs=ts1,为采样频率,或者采样密度,表示一秒之内采样的点数, t s t_s ts为采样周期
- n = 0,1,…为离散整数序列
-
对图(a)进行采样得到图(b)
Q1:那么给定一个正弦波采样后的序列,如图(b),如何恢复出一个连续的正弦波?
1.2频率混叠现象
- 首先,给出如下的离散序列如图(a),要求画出其对应的连续正弦波
- 对于该离散序列,可给出如图(b)不同的正弦波,也就是说,不同频率的正弦波,经过采样后出现了完全相同的离散信号, w h y ? \textcolor{red}{why?} why?
-
可作如下解释,对于离散信号的定义可做变形,其中m为任意整数
KaTeX parse error: Expected 'EOF', got '&' at position 8: x(n) =&̲ sin(2\pi f_0nt… -
再做如下替换,令 m = kn,所以 m n t s = k t s = k f s \frac{m}{nt_s} = \frac{k}{t_s} = kf_s ntsm=tsk=kfs,其中 f s = 1 t s f_s = \frac{1}{t_s} fs=ts1,k为整数,因为n也为整数,所以m必为整数,
x ( n ) = s i n ( 2 π ( f 0 + k f s ) n t s ) x(n) = sin(2\pi(f_0 + kf_s)nt_s) x(n)=sin(2π(f0+kfs)nts) -
对比公式( 2 )和( 4 ),发现初始频率为 f 0 的正弦波和初始频率为 f 0 + k f s 的正弦波,在经过采样周期为 t s 的采样后,两者的离散信号相同 \textcolor{red}{对比公式(2)和(4),发现初始频率为f_0的正弦波和初始频率为f_0 + kf_s的正弦波,在经过采样周期为t_s的采样后,两者的离散信号相同} 对比公式(2)和(4),发现初始频率为f0的正弦波和初始频率为f0+kfs的正弦波,在经过采样周期为ts的采样后,两者的离散信号相同
Q2:为什么会出现频率混叠这种现象呢?
答:肯定存在一个正弦波采样不满足奈奎斯特定理
1.3奈奎斯特定理
-
采样频率大于信号最大频率的两倍
f s ≥ 2 f m a x 或 f s / 2 ≥ f m a x f_s \geq 2f_{max} 或 f_s/2 \geq f_{max} fs≥2fmax或fs/2≥fmax -
即,在原始信号的一个周期内,至少要采样两个点,才能有效地杜绝频率混叠问题
频率混叠中的图(b)显然不满足奈奎斯特定理,故产生了频率混叠
1.4离散傅里叶变换(DFT)
-
为什么要进行DFT?
DFT将时域信号变换到频域,分析信号中的频率成分
理解:对于刚刚的正弦波,很明显只有一种频率,而对于语音而言,通常是各种频率的正弦波相互叠加,这时候如果横轴还是为 t 的话就不好分析这个信号,而将横轴变换为频率 f 后,这些叠加的正弦波就会在 f = f 0 , f 1 , . . . , f n f = f_0,f_1,...,f_n f=f0,f1,...,fn上显示出n个峰值,即代表一共有n种不同的频率,横看成岭侧成峰,如下图
-
什么信号可以进行DFT?
时域离散且周期的信号
-
非周期离散信号可以进行DFT吗?
需要进行周期延拓【也就是将当前信号作为整个信号的一个周期,然后使用这一个周期的信号去进行DFT】
-
傅里叶家族
1.4.1DFT的定义
给定一个长度为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
X(m) = \Sigma_{n=0}^{N-1}x(n)e^{-j2\pi nm/N},m = 0,1,2,...,N-1
X(m)=Σn=0N−1x(n)e−j2πnm/N,m=0,1,2,...,N−1
-
其中, j = − 1 j = \sqrt{-1} j=−1
-
e为自然对数底
-
m = 0,1,2,…,N-1,频率索引
-
X(m)为DFT的第m个输出
-
根据欧拉公式,DFT的公式还可以变换为:
X ( m ) = Σ n = 0 N − 1 x ( n ) [ c o s ( 2 π n m N ) − j s i n ( 2 π n m N ) ] X(m) = \Sigma_{n=0}^{N-1}x(n)[cos(\frac{2\pi nm}{N}) - jsin(\frac{2\pi nm}{N})] X(m)=Σn=0N−1x(n)[cos(N2πnm)−jsin(N2πnm)] -
DFT本质上是一个线性变换
1.4.2DFT的性质
-
性质一:对称性,对于实数信号,有
X ( m ) = X ∗ ( N − m ) X(m) = X^*(N-m) X(m)=X∗(N−m)
证明: X ( N − m ) = Σ n = 0 N − 1 x ( n ) e − j 2 π n ( N − m ) / N X(N-m) = \Sigma_{n=0}^{N-1}x(n)e^{-j2\pi n(N-m)/N} X(N−m)=Σn=0N−1x(n)e−j2πn(N−m)/N= X ( N − m ) = Σ n = 0 N − 1 x ( n ) e − j 2 π n N / N e j 2 π n m / N = X ( N − m ) = Σ n = 0 N − 1 x ( n ) e − j 2 π n e j 2 π n m / N =X(N-m) = \Sigma_{n=0}^{N-1}x(n)e^{-j2\pi nN/N}e^{j2\pi nm/N} = X(N-m) = \Sigma_{n=0}^{N-1}x(n)e^{-j2\pi n}e^{j2\pi nm/N} =X(N−m)=Σn=0N−1x(n)e−j2πnN/Nej2πnm/N=X(N−m)=Σn=0N−1x(n)e−j2πnej2πnm/N
因为 e j 2 π n = c o s n ( 2 π n ) − j s i n ( 2 π n ) e^{j2\pi n} = cosn(2\pi n) - jsin(2\pi n) ej2πn=cosn(2πn)−jsin(2πn) = 1
所以 X ( N − m ) = X ( N − m ) = Σ n = 0 N − 1 x ( n ) e j 2 π n m / N = X ∗ ( m ) X(N-m) = X(N-m) = \Sigma_{n=0}^{N-1}x(n)e^{j2\pi nm/N} = X^*(m) X(N−m)=X(N−m)=Σn=0N−1x(n)ej2πnm/N=X∗(m)
如上图所示,DFT之后的离散频率序列的幅度具有对称性,因此在进行N点的DFT特征提取后,只需要保留N/2+1个点。语音信号特征提取时,一般使用512点DFT,由于对称性,我们只需要保留257个有效点。
-
性质2:X(m)实际上表示的是“谱密度”,如果对一个幅度为A实正弦波进行N点DFT,则DFT之后,对应频率上的幅度M和A之间的关系为:
M = A 2 N = A N 2 M = \frac{A}{\frac{2}{N}} = \frac{AN}{2} M=N2A=2AN
DFT之后的频域序列X(m)的幅值实际上是一个“密度”的概念,通俗讲,即单位带宽上有多少信号存在
-
性质3:DFT的线性
如果 x s u m ( n ) = x 1 ( n ) + x 2 ( n ) x_{sum}(n) = x_1(n)+x_2(n) xsum(n)=x1(n)+x2(n),则对应的频域上有: X s u m ( n ) = X 1 ( n ) + X 2 ( n ) X_{sum}(n) = X_1(n)+X_2(n) Xsum(n)=X1(n)+X2(n)
-
性质4:时移性
对x(n)左移k个采样点,得到
x
s
h
i
f
t
(
n
)
=
x
(
n
−
k
)
x_{shift}(n) =x(n-k)
xshift(n)=x(n−k),对
x
s
h
i
f
t
(
n
)
x_{shift}(n)
xshift(n)进行DFT,有
X
s
h
i
f
t
(
m
)
=
e
j
2
π
k
m
N
X
(
m
)
X_{shift}(m) = e^ \frac{j2\pi km}{N} X(m)
Xshift(m)=eNj2πkmX(m)
1.4.3DFT的频率轴
- 频率分辨率:
f
s
/
N
f_s/N
fs/N,表示最小的频率间隔。N越大,频率分辨率越高,在频域上,第m个点所表示的分析频率(原始频率)为:
f a n a l y s i s ( m ) = m N f s f_{analysis}(m) = \frac{m}{N}f_s fanalysis(m)=Nmfs
从这个角度也可以理解X(m)的幅值,体现了原信号中频率为 m N f s \frac{m}{N}f_s Nmfs的信号强度
对于上图 m = 1时, 1 / 8 ∗ f s 1/8* f_s 1/8∗fs = 1000,m = 2 时间, 2 / 8 ∗ f s 2/8* f_s 2/8∗fs = 2000
为了提高DFT频率轴的分辨率,而不会影响原始信号的频率成分。我们可以将时域长度为N的信号x(n) 补0,增加信号的长度,从而提高频率轴分辨率。对信号进行补0的操作,不会影响DFT的结果,这在FFT(快速傅里叶变换)中和语音信号分析中非常常见。比如,在语音特征提取阶段,对于16k采样率的信号,一帧语音信号长度为400个采样点,为了进行512点的FFT,通常将400个点补0,得到512个采样点,最后只需要前257个点。
2.Fbank和MFCC特征提取
Inverse Fourier transform of logarithm of spectrum 对数谱的逆傅里叶变换
2.1 Step1 预加重
-
为什么需要预加重?
提高信号高频部分的能量,高频信号在传递过程中,衰减较快,但是高频部分又蕴含很多对语音识别有利的特征,因此,在特征提取部分,需要提高高频部分能量
-
预加重滤波器就是一个一阶高通滤波器,给定时域输入信号 x [ n ] x[n] x[n],预加重之后的信号为
y [ n ] = x [ n ] − α x [ n − 1 ] , 其中 0.9 ≤ α ≤ 1 y[n] = x[n]-\alpha x[n-1],其中0.9 \leq \alpha \leq 1 y[n]=x[n]−αx[n−1],其中0.9≤α≤1
公式解读:直观解释: 预加重是一个高通滤波器,因此,低频信号(即时域上信号变换慢的信号)将被抑制;从公式(13)中,我们知道-
如果信号x是低频信号(变化较慢),那么x[n] 和 x[n-1] 的值应该很接近,当𝛼在接近1的时候,𝑥[𝑛]−𝛼𝑥[𝑛−1] 接近于0,此信号的幅度将被大大抑制;
-
如果x是高频信号(变化很快),那么x[n] 和x[n-1] 的值将相差很大,𝑥[𝑛]−𝛼𝑥[𝑛−1] 的值不会趋近0,此信号的幅度还能保持,可以通过此滤波器
-
2.2 Step2 加窗分帧
-
为什么需要加窗?
- 语音信号为非平稳信号,其统计属性是随着时间变化的,以汉语为例,一句话中包含很多声母和韵母,不同的拼音,发音的特点很明显是不一样的;
- 但是!语音信号又具有短时平稳的属性,比如汉语里一个声母或者韵母,往往只会持续几十到几百毫秒,在这一个发音单元里,语音信号表现出明显的稳定性,规律性,也就是在很短的时间里呈现出稳定性
- 在进行语音识别的时候,对于一句话,识别的过程也是以较小的发音单元(音素、字、字节)为单位进行识别,因此用滑动窗来提取短时片段,
-
帧长、帧移、窗函数的概念,对于采样率为16kHz的信号,帧长、帧移一般为25ms、10ms,即400和160个采样点
-
分帧的过程,在时域上,即用一个窗函数和原始信号函数进行相乘:
y [ n ] = w [ n ] x [ n ] y[n] = w[n]x[n] y[n]=w[n]x[n]
w[n]称为窗函数,常用的窗函数有:矩形窗:
w [ n ] = { 1 , 0 ≤ n ≤ L − 1 0 , o t h e r w i s e w[n] = \begin{cases} 1,0 \leq n \leq L-1 \\ 0,otherwise \end{cases} w[n]={1,0≤n≤L−10,otherwise
汉明(Hamming)窗:
w [ n ] = { 0.54 − 0.46 c o s ( 2 π n L ) , 0 ≤ n ≤ L − 1 0 , o t h e r w i s e w[n] = \begin{cases} 0.54 - 0.46cos(\frac{2\pi n}{L}), & 0 \leq n \leq L-1 \\ 0,&otherwise \end{cases} w[n]={0.54−0.46cos(L2πn),0,0≤n≤L−1otherwise -
为什么不直接使用矩形窗?
加窗的过程,实际上是在时域上将信号截断,窗函数与信号在时域相乘,就等于对应的频域示进行卷积(*),矩形窗主瓣窄,但是旁瓣较大(红色部分),将其与原信号的频域表示进行卷积,就会导致频率泄露。
2.3 Step3 DFT
在经过上一步的加窗分帧后,会将原语音信号分割成很多个小段的语音信号,但这个小段语音信号并不是在时域上离散周期的,因此需要周期延拓,把这400个采样点认为是某个语音信号的一个周期来进行DFT
-
DFT的作用:将上一步分帧之后的语音帧,由时域变换到频域,取DFT系数的模,得到谱特征
上图展示了语谱图的生成过程:
- 加窗分帧
- 将每一帧信号进行DFT(FFT),如第t帧信号,DFT系数为 X t ( m ) , m = 0 , 1 , . . . N X_t(m),m = 0,1,...N Xt(m),m=0,1,...N
- 将每一帧DFT系数按照时间顺序排列起来,得到一个矩阵 Y ϵ C T ∗ N , 且 Y [ t , m ] = X t ( m ) Y \epsilon C^{T*N},且Y[t,m] = X_t(m) YϵCT∗N,且Y[t,m]=Xt(m)
- 语谱图是一个三维图,横轴表示时间(t),纵轴表示频率,颜色的深浅表示当前时频点上幅度的大小|Y[t,m]|
2.4Step4 梅尔滤波器组和对数操作
-
DFT得到了每个频带上信号的能量,但是人耳对于频率的感知不是等间隔的,而是近似于对数的
-
将线性频率转换为梅尔频率,梅尔频率与线性频率的转换公式为:
m e l ( f ) = 2595 l o g 10 ( 1 + f 700 ) mel(f) = 2595log_{10}(1+ \frac{f}{700}) mel(f)=2595log10(1+700f) -
梅尔三角滤波器组:根据起始频率、中间频率和截止频率,确定各滤波器的系数
f i l t e r b a n k m ( k ) = { k − f ( m − 1 ) f ( m ) − f ( m − 1 ) , f ( m − 1 ) ≤ k < f ( m ) f ( m + 1 ) − k f ( m + 1 ) − f ( m ) , f ( m ) < k ≤ f ( m + 1 ) filter_bank_m(k) = \begin{cases}\frac{k-f(m-1)}{f(m)-f(m-1)},f(m-1) \leq k < f(m)\\ \frac{f(m+1) - k}{f(m+1) - f(m)},f(m) < k \leq f(m+1) \end{cases} filterbankm(k)={f(m)−f(m−1)k−f(m−1),f(m−1)≤k<f(m)f(m+1)−f(m)f(m+1)−k,f(m)<k≤f(m+1) -
梅尔滤波器组设计
- 确定滤波器组数目P
- 根据采样频率 f s f_s fs,DFT点数N,滤波器个数P,在梅尔域上等间隔的产生每个滤波器的起始频率、中间频率和截至频率,注意:上一个滤波器的中间频率是下一个滤波器的起始频率
- 将梅尔域上每个三角滤波器的起始、中间和截止频率转换线性频率域,并对DFT之后的谱特征进行滤波,得到P个滤波器组能量,进行log 操作,得到Fbank特征
-
MFCC在Fbank特征基础上继续进行IDFT变换等操作
上图中,左边的倒谱明显是有两种正弦波复合而成,红线所示的正弦波与比较尖锐的正弦波(即高频和低频),低频的称为谱包络,高频的称之为谱细节,而谱包络的峰值称为共振峰,频域信号可以分解成谱包络(Envelope)和谱细节的乘积,不同音素的谱包络和共振峰具有区分性,为了提取谱包络,进行对数操作,即右边的变换
对 X [ m ] = H [ m ] E [ m ] X[m] = H[m]E[m] X[m]=H[m]E[m]进行对数操作后,可变换为 l o g ∣ X [ m ] ∣ = l o g ∣ H [ m ] ∣ + l o g ∣ E [ m ] ∣ log|X[m]| = log|H[m]| + log|E[m]| log∣X[m]∣=log∣H[m]∣+log∣E[m]∣,此时谱包络和谱细节都将被提取到
Step5 IDFT
Step6 动态特征计算
-
一阶差分(Delta,Δ),类比于速度,简单计算方法
Δ ( t ) = c ( t + 1 ) − c ( t − 1 ) 2 Δ_(t) = \frac{c(t+1)-c(t-1)}{2} Δ(t)=2c(t+1)−c(t−1) -
二阶差分(Delta delta,ΔΔ),类比加速度,简单计算方法
Δ Δ ( t ) = Δ ( t + 1 ) − Δ ( t − 1 ) 2 ΔΔ(t) = \frac{Δ(t+1)-Δ(t-1)}{2} ΔΔ(t)=2Δ(t+1)−Δ(t−1)
Step7 能量计算
e = Σ x 2 [ n ] e = \Sigma x^2[n] e=Σx2[n]