语音识别中的傅里叶变化

本文介绍了在语音识别中,如何使用快速傅里叶变换(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=0na

### Flink 大数据处理优化技巧与最佳实践 #### 调优原则与方法概述 对于Flink SQL作业中的大状态导致的反压问题,调优的核心在于减少状态大小以及提高状态访问效率。通过合理配置参数和调整逻辑设计可以有效缓解此类瓶颈[^1]。 #### 参数设置建议 针对不同版本下的具体特性差异,在实施任何性能改进措施前应当充分理解当前使用的Flink版本特点及其局限性;同时也要考虑特定应用场景的需求特征来定制化解决方案。这包括但不限于并行度设定、内存分配策略等方面的选择[^2]。 #### 数据流模式优化 采用广播变量机制可作为一种有效的手段用于降低主数据流转过程中所需维护的状态量级。当存在一对多关系的数据集间需频繁交互时,将较小规模的一方作为广播状态保存下来供另一方查询匹配使用不失为明智之举。此方式特别适用于维表Join操作中,其中一方变动相对较少但又必须保持最新记录的情况[^3]。 ```sql -- 创建临时视图以支持后续JOIN操作 CREATE TEMPORARY VIEW dim_table AS SELECT * FROM kafka_source; -- 定义Temporal Table Function以便获取指定时间点上的历史快照 CREATE FUNCTION hist_dim_table AS 'com.example.HistoricalDimTableFunction'; -- 执行带有时态条件约束的JOIN语句 SELECT o.order_id, d.product_name FROM orders o LEFT JOIN LATERAL TABLE(hist_dim_table(o.event_time)) AS d ON o.product_id = d.id; ``` 上述代码片段展示了如何利用Flink SQL实现基于时间戳的历史维度表连接功能,从而确保每次都能准确捕捉到事件发生瞬间对应的最恰当的产品名称信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值