目录

  • 前言
  • 离散傅里叶变换 DFT
  • 快速傅里叶变换 FFT

前言

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

其中N表示傅里叶变换的点数,k表示傅里叶变换的第k个频谱,W称为旋转因子。通过欧拉公式进一步变换我们可以得到:

由于余弦信号也是一种相位移动的正弦信号,因此变换后的第k点的实部和虚部对应的是一个相同频率的正弦信号,只是相位不同。随着k的变换正弦信号的频率也在发生变换,因此DFT将时序信号转化成不同频率的正弦信号的叠加。
DFT也可以用矩阵表示为X=WNxX=W_NxX=WN​x,其中:

快速傅里叶变换 FFT

快速傅里叶变换(Fast Fourier Transform),是利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法,于1965年由J.W.库利和T.W.图基提出。
对于多项式f(x)=∑i=0naixif(x)=\sum_{i=0}^{n}{a_i x^i}f(x)=∑i=0n​ai​xi,f(x)=∑i=0nbixif(x)=\sum_{i=0}^{n}{b_i x^i}f(x)=∑i=0n​bi​xi,定义其乘积fgfgfg如下:

显然,上式可以O(n2)O(n^{2})O(n2)的复杂度来计算乘积每一项的系数,但FFT可以O(nlog⁡n)O(n\log{n})O(nlogn)的时间复杂度来计算这个乘积。

对于任意n次多项式f(x)=∑i=0naixif(x)=\sum_{i=0}^{n}{a_i x^i}f(x)=∑i=0n​ai​xi,除去这种最常见的表示方法,我们也可以根据其系数的有序排列(a0,a1,a2,⋯,an)(a_0,a_1,a_2,⋯,a_n)(a0​,a1​,a2​,⋯,an​)来唯一确定f(x)f(x)f(x),这就是多项式的系数表示。同时,由代数基本定理,n次多项式上n+1个不同的点能唯一确定一个多项式,因此f(x)f(x)f(x)还可以被写作{(x0,f(x0)),(x1,f(x1)),⋯,(xn,f(n))}\left \{ (x_0,f(x_0)),(x_1,f(x_1)),⋯,(x_n,f(_n)) \right \}{(x0​,f(x0​)),(x1​,f(x1​)),⋯,(xn​,f(n​))},这就是多项式的点值表示。在x0,x1,⋯,xnx_0,x_1,⋯,x_nx0​,x1​,⋯,xn​确定时,将f的点值表示记为τ(f)τ(f)τ(f)。
如果两个多项式f(x)f(x)f(x),g(x)g(x)g(x)的点值表示法分别为:

则二者乘积的点值表示法为:

由上式可知,多项式的乘法在点值表示法下可以O(n)O(n)O(n)的复杂度计算,所以如果能够在较低的时间复杂度内将系数表示转化为点值表示,再将点值表示转回系数表示,就能以较低的时间复杂度计算多项式的乘法。这也正是快速傅里叶变换的基本思路。

对于多项式f(x)=∑i=0n−1aixi∈Xn−1f(x)=\sum_{i=0}^{n-1}{a_i x^i}∈X_{n-1}f(x)=∑i=0n−1​ai​xi∈Xn−1​,不失一般性地,设n=2sn=2^sn=2s,s∈Ns∈\mathbb{N}s∈N(可以将一个多项式等价地看作是次数更高的高次项系数均为零的多项式,故可以将n看作第一个等于或大于它的2的整数次幂)我们将n次单位根ωn=cos⁡2πn+isin⁡2πnω_n=\cos \frac{2π}{n}+i\sin \frac{2π}{n}ωn​=cosn2π​+isinn2π​的000 ~ n−1n-1n−1次幂分别代入f(x)f(x)f(x),便得到其点值向量{(ωn0,f(ωn0)),(ωn1,f(ωn1)),⋯,(ωnn−1,f(ωnn−1))}\left \{ (ω_n^0,f(ω_n^0)),(ω_n^1,f(ω_n^1)),⋯,(ω_n^n-1,f(ω_n^{n-1})) \right \}{(ωn0​,f(ωn0​)),(ωn1​,f(ωn1​)),⋯,(ωnn​−1,f(ωnn−1​))}。
可以看到如果进行朴素代入,算法的时间复杂度依然是O(n2)O(n^{2})O(n2)。但利用单位根如下两条性质,我们可以将算法进一步简化。

按下标的奇偶性将f(x)f(x)f(x)分为两组,并令:

则有f(x)=f1(x2)+xf2(x2)f(x)=f_1(x^2)+xf_2(x^2)f(x)=f1​(x2)+xf2​(x2)。设0<k<n20<k<\frac{n}{2}0<k<2n​,k∈Zk∈\mathbb{Z}k∈Z,分别将x=ωnkx=ω_n^kx=ωnk​与x=ωnk+n2x=ω_n^{k+\frac{n}{2}}x=ωnk+2n​​代入f(x)f(x)f(x)可得:

kkk与k+n2k+\frac{n}{2}k+2n​取遍了[0,n−1][0,n-1][0,n−1]上所有的n个整数。观察上述两式的结构,我们只需要求出f1(ωn2k)f_1(ω_{\frac{n}{2}}^k)f1​(ω2n​k​)与f2(ωn2k)f_2(ω_{\frac{n}{2}}^k)f2​(ω2n​k​)即可在O(n)O(n)O(n)的时间复杂度内求出f(x)f(x)f(x)的值,两者的规模都是原问题一半。因此可以采取递归求解,将问题转化为求出f1(ωn4k)f_1(ω_{\frac{n}{4}}^k)f1​(ω4n​k​)与f2(ωn4k)f_2(ω_{\frac{n}{4}}^k)f2​(ω4n​k​),直至最后转化为求f1(ω1k)=f2(ω1k)=1f_1(ω_1^k)=f_2(ω_1^k)=1f1​(ω1k​)=f2​(ω1k​)=1。时间复杂度为T(n)=T(n2)+O(n)=O(nlog⁡⁡n)T(n) = T(\frac{n}{2})+O(n) = O(n\log⁡n)T(n)=T(2n​)+O(n)=O(nlog⁡n)。

Reference:
语音识别特征提取方法
从头到尾彻底理解傅里叶变换算法
离散傅里叶变换 - 维基百科
傅里叶变换 ~ 离散傅里叶变换(DFT)
一小时学会快速傅里叶变换(Fast Fourier Transform)
快速傅里叶变换(FFT)超详解

语音识别中的傅里叶变化相关推荐

  1. python pytorch fft_PyTorch 中的傅里叶卷积实现示例

    卷积 卷积在数据分析中无处不在.几十年来,它们一直被用于信号和图像处理.最近,它们成为现代神经网络的重要组成部分.如果你处理数据的话,你可能会遇到错综复杂的问题. 数学上,卷积表示为: 尽管离散卷积在 ...

  2. 图像处理:二维傅里叶变化的平移性_matlab实现

    傅里叶变化的平移性: matlab代码验证过程实现: %% 研究傅里叶变化 的 平移特性 %空间域 乘以exp ,频率域移动clc;clear I = imread('rice.jpg'); I = ...

  3. 傅里叶变化的本质:复数的实部和虚部的对应关系

    之前做计算光学成像,需要用到图像的相位信息.但是设计到傅里叶变化的实部和虚部的问题的时候,发现教科书上一般来讲,只会介绍一句: 如果f(x,y)是实函数,则它的傅里叶变化就是关于原点共轭对称的: F( ...

  4. 复数卷积 tensorflow_PyTorch 中的傅里叶卷积

    欢迎关注 "小白玩转Python",发现更多 "有趣" 注意: 在这个 Github repo 中提供了1D.2D 和3D Fourier 卷积的完整方法.我还 ...

  5. 谁给讲讲语音识别中的CTC方法的基本原理?

    以下是经论智编译的原文: />CTC识别效果示意图CTC识别效果示意图 简介 谈及语音识别,如果这里有一个剪辑音频的数据集和对应的转录,而我们不知道怎么把转录中的字符和音频中的音素对齐,这会大大 ...

  6. 傅里叶变化,短时傅里叶分析,小波变换

    作者:咚懂咚懂咚 链接:https://www.zhihu.com/question/22864189/answer/40772083 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 从傅里叶 ...

  7. 傅里叶变化(一)—— 复数

    [参考资料] 1.万门大学:傅立叶变换.拉普拉斯变换与小波变换 [傅里叶变换系列博客] 1.傅里叶变化(一)-- 复数 2.傅里叶变换(二)-- 卷积 复数的定义: z=a+ib(a,b∈R)z=a+ ...

  8. 卷积神经网络(CNN)在语音识别中的应用

    前言 总结目前语音识别的发展现状,dnn.rnn/lstm和cnn算是语音识别中几个比较主流的方向.2012年,微软邓力和俞栋老师将前馈神经网络FFDNN(Feed Forward Deep Neur ...

  9. matlab 傅里叶平移,图像处理:二维傅里叶变化的平移性_matlab实现

    傅里叶变化的平移性: matlab代码验证过程实现: %% 研究傅里叶变化 的 平移特性 %空间域 乘以exp ,频率域移动 clc;clear I = imread('rice.jpg'); I = ...

最新文章

  1. 线程池 java 新建方式_Java线程池的四种创建方式
  2. tomcat(2)一个简单的servlet容器
  3. jquery在选择器中使用变量及innerText问题(转载)
  4. Mysql索引示例_MYSQL索引实例
  5. 一个女程序员的创业人生:胆识也是一种能力 作者:秋镇菜
  6. 格科半导体成功引入ASML先进ArF光刻机
  7. python盒中取球_在Python中找到占据给定球的盒子的位置
  8. document.addEventListener的使用介绍
  9. Nginx作为web服务器的安装配置
  10. centos启动提示unexpected inconsistency RUN fsck MANUALLY
  11. java实践_java基础实践
  12. [C++]踩坑日记:内存别名
  13. 路由器ipv4和ipv6转发原理
  14. linux服务器测网速,linux服务器如何测试网速?
  15. android svc编解码,SVC(可分层视频编解码)技术详解
  16. Visio绘制网络模型
  17. vue3 watch 监听多值以及深度监听用法
  18. 读美妆论文AN AUTOMATIC FRAMEWORK FOR EXAMPLE-BASED VIRTUAL MAKEUP
  19. 色彩搭配的原理与避讳
  20. 2018.12.31 NOIP训练 czy的后宫6(线性dp)

热门文章

  1. Windows Server 2022 英文版、简体中文版下载 (updated Oct 2021)
  2. 电路中电容怎么计算?
  3. DOCSIS CM上线流程
  4. 佐糖推出图片变清晰API,图像清晰度增强接口API
  5. 百信银行架构解密:如何构建全云系统
  6. 微型计算机哈弗结构,冯·诺伊曼结构和哈弗结构,RISC和CISC-控制器/处理器-与非网...
  7. PCIE地址空间理解
  8. mysql回表什么意思_什么是Mysql的回表查询?聊一聊
  9. Simotion应用与组网之十六同步与热备
  10. matlab实现指数积分算法