语音信号处理以及特征提取 数字信号处理
模拟信号到数字信号的转化(ADC) 很简单了,就是计算机识别的是数字信号,而语音信号是连续信号,所以需要对连续的语音模拟信号进行采样,量化,转换成数字信号,如下图所示: 基础定义 正弦波的定义是:
x
(
t
)
=
s
i
n
(
2
π
f
0
t
)
\color{black}{x(t) = sin(2\pi f_0 t)}
x(t)=sin(2πf0t) 其中
f
0
f_0
f0代表的是频率,单位时间内周期震动的次数,单位是HZ。 如果我们对此正弦波进行采样,每隔
t
s
t_s
ts 秒进行一次采样,并使用一定范围的离散数值表示采样值,则可以得到采样后的离散信号(b)可以得到:
x
(
n
)
=
s
i
n
(
2
π
f
0
n
t
s
)
\color{black}{x(n) = sin(2\pi f_0 nt_s)}
x(n)=sin(2πf0nts) 注意:
t
s
t_s
ts 是采样周期
f
s
=
1
t
s
\color{black}{f_s = \frac{1}{t_s}}
fs=ts1为采样频率,或采样率,表示1s内采样的点数。 n = 0,1, … … 为离散整数序列 频率混叠 什么是频率混叠呢?也就是说不同频率的正弦波,经过采样后会出现完全相同的离散信号;
图a是采集的数字信号,但是在图b中出现了两个频率不同的连续信号。下面我们用公式解释一下:
x
(
n
)
=
s
i
n
(
2
π
f
0
n
t
s
)
=
s
i
n
(
2
π
f
0
n
t
s
+
2
π
m
)
=
s
i
n
(
2
π
(
f
0
+
m
n
t
s
)
n
t
s
)
\begin{matrix}x(n) = sin(2\pi f_0nt_s)\\ =sin(2\pi f_0 nt_s + 2\pi m)\\ =sin(2\pi (f_0 + \frac {m}{nt_s})nt_s)\end{matrix}
x(n)=sin(2πf0nts)=sin(2πf0nts+2πm)=sin(2π(f0+ntsm)nts) 其中
m
=
k
n
,
n
=
0.1.2...
m=kn,n= 0.1.2...
m=kn,n=0.1.2...离散整数数列,所以上述公式可以写为:
s
i
n
(
2
π
(
f
0
+
k
f
s
)
n
t
s
)
sin(2\pi (f_0 + kf_s)nt_s)
sin(2π(f0+kfs)nts)故,会出现多个不同频率的正弦函数。 怎么解决频率混叠的问题呢?
我们所用的就是奈奎斯特采样定律 采样频率大于信号中最大频率的两倍!
f
s
2
≥
f
m
a
x
\frac{f_s}{2}\geq f_{max}
2fs≥fmax
f
s
f_s
fs是采样频率
f
m
a
x
f_{max}
fmax是原始连续的语音模拟信号: 即,在原始信号的一个周期内,至少要采样两个点,才能有效杜绝频率混叠问题。
傅里叶变换 为什么需要傅里叶变换呢? 将时域信号转换成频域信号,以此来分析信号中频域中的成分; 什么信号可以进行傅里叶变换呢? 时域离散且周期的信号,其中,非周期信号需要进行周期延拓才能进行傅里叶变化; 在傅里叶家族 中,能够被计算机所用到的就是离散傅里叶变换(DFT),只有DFT是在时域和频域上都具有离散和周期的特点,因此,也只有DFT可以用计算机来处理!
点击查看傅里叶频域和时域关系的详细解答 傅里叶变换公式: DFT的性质: 其中
X
∗
X^*
X∗代表的是共轭复数,点击查看共轭复数 性质2:谱密度: 什么是谱密度呢? 傅里叶变换后的X(m)实际上表示的是“谱密度”(spectral density),如果对一个幅度为A实正弦波进行N点DFT,则DFT之后,对应频率上的幅度M和A之间的关系为: 其中
2
/
N
2/N
2/N表示的是一个单位频率下的宽度,如下图所示:
其实表示的就是,在单位频率之下,所拥有的能量是多少,DFT之后的频域序列X(m)的幅值实际上是一个“密度”的概念,通俗讲,即单位带宽上有多少信号存在。 对于谱密度,我们可以用一个例子来进行验证: 像上面的这个公式,
x
(
n
)
x(n)
x(n)是由两个正弦函数组成的,其中第一个正弦函数的A(幅度)是1,第二个正弦函数的幅度A是0.5;如图所示: N是8,则
A
1
N
/
2
=
4
,
A
2
N
/
2
=
2
A_1N/2=4, A_2N/2=2
A1N/2=4,A2N/2=2 谱密度正好对应的就是
x
(
m
)
x(m)
x(m)的值; 性质3:DFT的线性;
什么是DFT的频率轴? 频率分辨率:
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 mn f_s
fanalysis(m)=nmfs 其
f
s
=
1
/
t
s
f_s=1/t_s
fs=1/ts,为采样频率,或采样率,表示1s内采样的 点数, 举个例子: 在上图中,
f
s
=
8000
,
n
=
8
f_s=8000,n=8
fs=8000,n=8则当
m
=
1
m=1
m=1时,即为
f
a
n
a
l
y
s
i
s
=
1000
,
当
m
=
2
时
,
f
a
n
a
l
y
s
i
s
=
2000
f_{analysis}=1000,当m=2时,f_{analysis}=2000
fanalysis=1000,当m=2时,fanalysis=2000分别对应于
x
(
n
)
x(n)
x(n)中的第一和 第二个频率大小; 我们可以理解为X(m)的幅值,体现了原信号中频率成分为
m
n
f
s
\frac mnf_s
nmfsHZ 的信号的强度
为了提高DFT频率轴的分辨率,而不会影响原始信号的频率成分。我们可以将时域长度为N的信号x(n) 补0,增加信号的长度,从而提高频率轴分辨率。 对信号进行补0的操作,不会影响DFT的结果,这在FFT(快速傅里叶变换)中和语音信号分析中非常常见。比如,在语音特征提取阶段,对于16k采样率的信号,一帧语音信号长度为400个采样点,为了进行512点的FFT,通常将400个点补0,得到512个采样点,最后只需要前257个点。 快速傅里叶变换(FFT) 闲的时候再看吧,跟的这个课程没有详细讲解,但是FFT还是非常重要的,以后再补; 接下来就开始进入语音识别的世界吧; Fbank和MFCC特征提取 在进行语音识别的过程中,首先要做的就是对语音信号进行处理。见下图;
后面会分别进行介绍。 进行这样处理是传统的语音识别处理过程,但是在端到端的语音识别处理的过程中,可以直接就会对语音信号波形进行识别和建模,但是效果并没有超过基于频域的语音信号建模;
预加重 预加重的目的? 提高信号高频部分的能量,高频信号在传递过程中,衰减较快,但是高频部分又蕴含很多对语音识别有利的特征,因此,在特征提取部分,需要提高高频部分能量; 预加重滤波器是一个一阶高通滤波器,给定时域输入信号푥[푛],预加重之后的信号为:
y
[
n
]
=
x
[
n
]
−
a
x
[
n
−
1
]
y[n]=x[n]-ax[n-1]
y[n]=x[n]−ax[n−1] 其中
0.9
≤
a
≤
1.0
0.9\leq a\leq 1.0
0.9≤a≤1.0 由公式可以看出: (1)果信号x是低频信号(变化较慢),那么x[n]和 x[n-1] 的值应该很接近,当훼在接近1的时候,푥[푛]−훼푥[푛−1] 接近于0,此信号的幅度将被大大抑制; (2)如果x是高频信号(变化很快),那么x[n] 和x[n-1] 的值将相差很大,푥[푛]−훼푥[푛−1] 的值不会趋近0,此信号的幅度还能保持,可以通过此滤波器;
如上图所示,横轴是频率,纵轴是在此频率下信号的强度,其中红线是预加重之后的,在频率很低的时候,信号强度是低于原始信号的,随着频率的提高,预加重的信号强度是逐渐大于原始信号的;
分帧加窗
为什么要进行分帧呢? •语音信号为非平稳信号,其统计属性是随着时间变化的,以汉语为例,一句话中包含很多声母和韵母,不同的拼音,发音的特点很明显是不一样的; • 但是!语音信号又具有短时平稳的属性,比如汉语里一个声母或者韵母,往往只会持续几十到几百毫秒,在这一个发音单元里,语音信号表现出明显的稳定性,规律性 • 在进行语音识别的时候,对于一句话,识别的过程也是以较小的发音单元(音素、字、字节)为单位进行识别,因此用滑动窗来提取短时片段 如上图所示,就是帧长和帧移的形象化表示; 例如对于采样率为16kHz的信号,帧长、帧移一般为25ms、10ms,即400和160个采样点(16KHZ代表的是一秒钟采集16000个采样点,所以 16000*0.25=400)
分帧加窗过程 其实很简单,就是分帧的过程,在时域上,即用一个窗函数和原始信号进行相乘:
y
[
n
]
=
w
[
n
]
x
[
n
]
y[n]=w[n]x[n]
y[n]=w[n]x[n]
w
[
n
]
w[n]
w[n]称为窗函数,常见的窗函数有: 为什么不直接使用矩形框窗呢? 加窗的过程,实际上是在时域上将信号截断,窗函数与信号在时域相乘,就等于对应的频域表示进行卷积(*),矩形窗主瓣窄,但是旁瓣较大(红色部分),将其与原信号的频域表示进行卷积,就会导致频率泄露。
推荐文章
发表评论