语音识别中的傅里叶变化

本文介绍了在语音识别中,如何使用快速傅里叶变换(FFT)对时域信号进行处理,以提取梅尔倒谱系数MFCC。离散傅里叶变换(DFT)是FFT的基础,它将声音信号转换为频谱,便于分析。FFT通过递归算法,将DFT的时间复杂度降低到O(nlogn),从而提高了计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在语音识别和话者识别中,需要将声音编码为数字信息,提取其中的特征进行处理,而最常用的语音特征便是梅尔倒谱系数MFCC。为了将频谱的包络与细节分离开来,以便分析声道共振特征和基音周期,需要把这种非线性问题转化为线性问题。MFCC预处理之后的第一步便是通过快速傅里叶变换(Fast Fourier Transform)将时域信号转变为信号频谱。而快速傅里叶变换是离散傅里叶变换(Discrete Fourier Transform)的改进算法,将其时间复杂度从 O ( n 2 ) O(n^{2}) O(n2)改进为 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)

离散傅里叶变换 DFT

傅里叶变换能将满足一定条件的函数表示成正弦和/或余弦函数或它们的积分的线性组合。根据函数在时域的特性分别有如下几种变换:

变换 时域 频域
连续傅里叶变换 连续,非周期性 连续,非周期性
傅里叶级数 连续,周期性 离散,非周期性
离散时间傅里叶变换 离散,非周期性 连续,周期性
离散傅里叶变换 离散,周期性 离散,周期性

这四种傅立叶变换都是针对长度为无穷大的信号,但这对于计算机处理来说是不可能的。那么有没有针对长度有限的傅立叶变换呢?很遗憾没有,因为正余弦波被定义成从负无穷大到正无穷大,我们无法把一个长度无限的信号组合成长度有限的信号。
面对这种困难,解决方法是把长度有限的信号表示成长度无限的信号。例如,可以把信号无限地从左右进行延伸,延伸的部分用零来表示,这样这个信号就可以被看成是非周期性离散信号,我们可以用到离散时域傅立叶变换(DTFT)的方法。也可以把信号用复制的方法进行延伸,这样信号就变成了周期性离散信号,这时我们就可以用离散傅立叶变换方法(DFT)进行变换。
但是对于非周期性的信号,我们需要用无穷多不同频率的正弦曲线来表示,这对于计算机来说是不可能实现的。所以对于离散信号的变换只有离散傅立叶变换(DFT)才能被适用,对于计算机来说只有离散的和有限长度的数据才能被处理,其它的变换类型只有在数学演算中才能用到。

对于N点序列 { x [ n ] } 0 ≤ n ≤ N \left \{ x[n] \right \}_{0≤n≤N} { x[n]}0nN,它的离散傅里叶变换为:
图片描述
其中N表示傅里叶变换的点数,k表示傅里叶变换的第k个频谱,W称为旋转因子。通过欧拉公式进一步变换我们可以得到:
图片描述
由于余弦信号也是一种相位移动的正弦信号,因此变换后的第k点的实部和虚部对应的是一个相同频率的正弦信号,只是相位不同。随着k的变换正弦信号的频率也在发生变换,因此DFT将时序信号转化成不同频率的正弦信号的叠加。
DFT也可以用矩阵表示为 X = W N x X=W_Nx X=WNx,其中:
图片描述

快速傅里叶变换 FFT

快速傅里叶变换(Fast Fourier Transform),是利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法,于1965年由J.W.库利和T.W.图基提出。
对于多项式 f ( x ) = ∑ i = 0 n a i x i f(x)=\sum_{i=0}^{n}{a_i x^i} f(x)=i=0naixi f ( x ) = ∑ i = 0 n b i x i f(x)=\sum_{i=0}^{n}{b_i x^i} f(x)=i=0nbixi,定义其乘积 f g fg fg如下:
图片描述
显然,上式可以 O ( n 2 ) O(n^{2}) O(n2)的复杂度来计算乘积每一项的系数,但FFT可以 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)的时间复杂度来计算这个乘积。

对于任意n次多项式 f ( x ) = ∑ i = 0 n a i x i f(x)=\sum_{i=0}^{n}{a_i x^i} f(x)=i=0naix

### 傅里叶变换语音识别中的应用 傅里叶变换语音识别领域扮演着至关重要的角色,主要体现在将复杂的时域信号转换成更易解析的频域表示上[^1]。这一转变使得能够更加直观地观察和分析声音的本质特征。 #### 从时域到频域 原始音频是以随时间变化的压力波动形式存在的模拟信号,在计算机中则表现为离散的时间序列数据。为了便于进一步处理,这些样本会先被分割成短帧(通常每帧持续约20-30毫秒),接着利用窗口函数加权以减少相邻帧之间的不连续性影响。之后,通过对每一帧执行快速傅里叶变换(FFT),可以有效地将其映射至频域内,从而获得该时间段内的频率组成情况。 ```python import numpy as np from scipy.fft import fft, fftfreq def compute_fft(signal, sample_rate): N = len(signal) yf = fft(signal) xf = fftfreq(N, 1 / sample_rate)[:N//2] return xf, np.abs(yf[:N//2]) ``` 此代码片段展示了如何基于给定的声音片段及其采样率计算其对应的幅度谱图。这一步骤对于揭示隐藏于复杂波形背后的简单结构至关重要,因为人类听觉系统本质上也是按照这种方式工作的—即感知特定范围内的各种音调组合而非单纯的一维振动模式。 #### 提取声学特征 一旦获得了频域表达式的表示方法,则可从中抽取多种有用的参数作为机器学习模型训练的基础输入向量之一。梅尔频率倒谱系数(MFCCs)便是最常用的技术手段之一;它模仿了人耳对不同频率敏感程度不同的特点,并通过一系列线性和非线性的滤波器组以及离散余弦变换(DCT)操作最终形成紧凑而具有代表性的描述子集合。 ```python from python_speech_features import mfcc sample_rate = 16000 # Example sampling rate signal = ... # Preprocessed audio signal array here mfcc_features = mfcc(signal, samplerate=sample_rate, winlen=0.025, winstep=0.01, numcep=13, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97) print(mfcc_features.shape) # Output shape (number of frames, number of coefficients per frame) ``` 上述Python脚本说明了怎样借助第三方库`python_speech_features`轻松获取一段录音材料经过预加重、分帧、汉明窗化等一系列前处理步骤后的MFCC矩阵。这种多维度的数据集不仅保留了原初话语的主要属性而且大大降低了冗余信息的比例,有利于提高分类准确性并加快收敛速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值