语音信号特征处理--FbankMFCC

Posted 栋次大次

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语音信号特征处理--FbankMFCC相关的知识,希望对你有一定的参考价值。

代码地址:(6.1号发布)

数字信号处理基础

模拟信号转化为数字信号(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 ) \\begin{aligned} & 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}+\\frac{m}{n t_{s}}\\right) n t_{s}\\right) \\end{aligned} ==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 ) \\mathrm{x}(\\mathrm{n})=\\sin \\left(2 \\pi\\left(\\mathrm{f}_{0}+\\mathrm{kf}_{\\mathrm{s}}\\right) \\mathrm{nt}_{\\mathrm{s}}\\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/2fmax,即原始信号的一个周期内,至少要采样两个点,才能有效杜绝频率混叠问题。

问题:对一个采样率为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 \\mathrm{X}(\\mathrm{m})=\\sum_{\\mathrm{n}=0}^{\\mathrm{N}-1} \\mathrm{x}(\\mathrm{n}) \\mathrm{e}^{-\\mathrm{j} 2 \\pi \\mathrm{nm} / \\mathrm{N}}, \\quad \\mathrm{m}=0,1,2, \\ldots N-1 X(m)=n=0N1x(n)ej2πnm/N,m=0,1,2,N1。其中, m = 0 , 1 , 2... N − 1 m=0,1,2...N-1 m=0,1,2...N1为频率索引,X(m)为DFT的第m个输出。

根据欧拉公式,DFT的公式还可以为:
X ( m ) = ∑ n = 0 N − 1 x ( n ) [ cos ⁡ ( 2 π n m N ) − j sin ⁡ ( 2 π n m N ) ] \\mathrm{X}(\\mathrm{m})=\\sum_{\\mathrm{n}=0}^{\\mathrm{N}-1} \\mathrm{x}(\\mathrm{n})\\left[\\cos \\left(\\frac{2 \\pi \\mathrm{nm}}{\\mathrm{N}}\\right)-\\mathrm{j} \\sin \\left(\\frac{2 \\pi \\mathrm{nm}}{\\mathrm{N}}\\right)\\right] X(m)=n=0N1x(n)[cos(N2πnm)jsin(N2πnm)]
DFT本质上是一个线性变换: X ⃗ = F x ⃗ \\vec{X}=\\boldsymbol{F} \\vec{x} 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[\\begin{array}{c} X(0) \\\\ X(1) \\\\ X(2) \\\\ \\vdots \\\\ X(N-1) \\end{array}\\right]=\\left[\\begin{array}{cccc} 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} \\end{array}\\right]\\left[\\begin{array}{c} x(0) \\\\ x(1) \\\\ x(2) \\\\ \\vdots \\\\ x(N-1) \\end{array}\\

以上是关于语音信号特征处理--FbankMFCC的主要内容,如果未能解决你的问题,请参考以下文章

(超详细)语音信号处理之特征提取

语音识别基于matlab BP神经网络语音特征信号分类含Matlab源码 2338期

语音笔记:时域分析

matlab中的特定人语音识别算法DTW算法的应用例程

语音信号处理1---基本概念

改进的基于长时谱能量差异和基音比例的语音检测方法_爱学术