音频算法入门-傅里叶变换
我直接说结论,傅里叶级数公式包含了傅里叶变换和傅里叶逆变换(不严谨的说就是这么回事)。
先简单说下具体关系,法国数学家傅里叶发现,任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示,这种表示方式就是傅里叶级数。假如有个波形比较复杂的周期函数,那么找出能用来构成这个周期函数的正弦函数和余弦函数的频率的方法就叫做傅里叶变换,用这些频率的正弦函数和余弦函数叠加起来表示这个周期函数的方法就叫做傅里叶逆变换。
再从公式中看下他们的关系,首先介绍傅里叶级数到底是什么,首先级数是指将数列的项依次用加号连接起来的函数。这么说可能大家还不理解,举个例子:e^x=1+x/1!+x^2/2!+...x^n/n!....,等号左边是指数函数,等号右边就是级数。傅里叶级数公式如下:
我们主要看这个指数形式的傅里叶级数公式,把求和符号去掉,展开一下就是f(t)=Fa*e^jaω0t+Fb*e^jbω0t+Fc*e^jcω0t+Fd*e^jdω0.....。现在看下面的周期函数叠加效果图,图中显示的是3个周期函数分别在坐标轴(横轴时间,纵轴幅度)的图像,写成傅里叶级数形式就是f(t)=fa(t)+fb(t)+0+0....,这就是傅里叶级数公式要描述的现象。其中Fa*e^jaω0t=fa(t),Fb*e^jbω0t=fb(t),Fc*e^jcω0t=0....。
看下图的傅里叶变换和逆变换公式,你会发现傅里叶逆变换公式和傅里叶级数公式极其相似,而傅里叶级数系数公式Fn又和傅里叶变换公式极其相似。所以对一个周期函数进行傅里叶级数展开的过程可以认为是先做傅里叶变换再做傅里叶逆变换的过程。
上图就是傅里叶变换公式也叫连续傅里叶变换公式,有个很重要的事情,就是傅里叶变换公式和逆变换公式一定要一起给出,不然就会让人误解,你们在网上会看到各种各样的写法,但这些写法都是对的,常见的如下图所示。
为了方便后面的讲解我把角频率ω换成2πf,如上图所示,ω是希腊字母读作Omega,大写是Ω,小写是ω,以后这两个字母会经常看到,都是等于2πf。不要和电学中的电阻单位搞混了,要明白字母只不过是一个符号而已,在不同学科领域都是混着用的,只要不和自己公式中其他字母冲突就行,例如上图傅里叶变换公式中的j其实就是虚数单位i,一般时候我们会把虚数单位写成i,但因为傅立叶变换经常用于电学解决一些问题,为了不和电流符号i混淆,所以公式就把i写成j 。
要想了解傅里叶变换公式,首先要了解欧拉公式e^ix=cosx+isinx在图像中的含义。以实部的值cosx作为横坐标值,虚部sinx的值作为纵坐标值,x的取值从负无穷到正无穷,画出所有的e^ix点后,你会发现这些点会形成一个周期为2π的圆。如下图1所示(如果不理解,建议看3Blue1Brown的视频,视频连接:https://www.bilibili.com/video/BV1pW411J7s8)
所以欧拉公式e^ix其实就是随着x的增大而在坐标系上逆时针画圆的过程,那么e^-ix就表示顺时针画圆,e^-i2πx就表示画圆的速度提高2π倍,也就是说x从0到1的过程就是顺时针画出一个完整圆的过程(当然x从1到2或者2到3等等,都能画出一个完整的圆),把x换成t后,e^-i2πt表示每秒都会顺时针画出一个圆。e^-i2πft表示每秒都会顺时针画出f个圆。f(t)表示t时刻的振幅,f(t)函数画出来就是时域波形图。f(t)*e^-i2πft表示每经过1秒会顺时针画出f个圆,并在画圆的同时,t时刻的圆半径要乘上t时刻的振幅,其实就是以每秒的音频振幅数据绕f圈的速度进行旋转缠绕(为了方便理解,没有用复杂的音频数据,用的是一个频率为3的正弦波音频做的实验,请看下图2,图的上半部分是时域波形图,图的左下角是f等于0.4的时候,用公式f(t)*e^-i2πft在实部和虚部构成的坐标系画的图,图的右下角是频谱图,频谱图的横坐标是频率,纵坐标是振幅,振幅的值就是左下角图中数据形成的图案的质心(图中的红点)到坐标系原点的距离的2倍)。当改变f的值,你会发现数据大多数时候是和我们想的一样,以坐标系原点为圆心环绕着,也就是振幅一直都是0,但是当f的值,也就每秒的圈数等于该音频数据的频率时,你会发现一个神奇的现象,那就是所有的数据会在实部或虚部坐标轴的一侧形成一个圆(如下图3所示,如此一来就知道这段音频数据包含了一个频率为3振幅为0.5的正弦波)。所以将多个正弦波叠加的音频数据用傅里叶公式,f从负无穷到正无穷遍历一遍,就可以把这个音频数据里包含的正弦波都一一找出来。(如果不理解,建议看3Blue1Brown的视频,视频连接:https://www.bilibili.com/video/BV1pW411J7s8)
平时我们说的对音频进行傅里叶变换处理,其实说的是短时离散傅里叶变换。短时离散傅里叶变换的公式(也可以直接叫做离散傅里叶变换公式)如下。
下面将教大家如何理解这个公式。上面说的连续傅里叶变换公式中有两个原因导致我们无法使用,第一点要求是音频数据的时间从负无穷到正无穷,第二点要求是任意时间t都要有幅度值x(t)才能代入公式进行计算。所以为了解决这两个问题,把公式变为短时且离散的傅里叶变换公式,这个公式可以把一段时间(时间假设为Ts秒)的离散音频数据(有N个采样数据)进行傅里叶变换。你可以把离散傅里叶变换公式理解成连续傅里叶变换的变形,最重要的一点是连续傅里叶变换公式的f和离散傅里叶变换公式的k不是一个意思,他们的关系是k=f*Ts。所以离散傅里叶变换公式也可以写成F(f)=1/n*∑f(t)*e^-j2πf*Ts*n/N,其中的Ts*n/N对应的就是连续傅里叶变换公式的t,只不过这个t没办法取任意时间了,t的取值也就随着n的取值成为了离散的时间点,所以前面的系数由1/2π变为1/N。这样这两个公式就对应起来了。下面将进一步详细介绍这个公式。
上一段说了k=f*Ts,这段我来解释下为什么,其实离散傅里叶变换公式中k表示的是这段Ts秒的音频数据环绕坐标系原点的圈数,所以k并不是连续傅里叶变换公式里的频率f,而频率f指的是1秒钟震荡的次数,在这个公式中频率f也对应着1秒的音频数据环绕的圈数,所以真正的频率f=k/Ts。
有人可能会好奇,那为什么不把离散傅里叶变换公式的自变量k换成f呢,这样不是更好理解吗?是会更好理解,但是没有必要,用f的话还要做一次无用的换算。因为采样点只有N个的原因,k的取值范围就被限制住了,k的取值范围只能是0~N-1的整数,这也是为什么用k来做自变量而不是用f的原因。
还有人可能会好奇,傅里叶逆变换到底是怎么把频域的信息还原回时域的,其实公式计算出来的F(k)是一个复数,这个复数包含了这个频率的周期函数的振幅和相位的信息,假设F(k)=a+ib,,F(k)的模|F(k)|=(a^2+b^2)^1/2,频率f=k/Ts时的振幅为|F(k)|*2(因为求出来的值相当于圆心,但实际上振幅是圆离圆心最远点到坐标原点的距离,所以要乘2),频率f=k/Ts时的相位为arctan(b/a)。所以如果你知道一个周期函数包含了哪些频率的周期函数,并且你这到这些周期函数的振幅和相位,你就可以像下图一样把fa(t)和fb(t)叠加在一起还原回f(t)。傅里叶逆变换的做法略有不同,但意思就是这么个意思,理解了离散傅里叶变换公式的计算,逆变换其实也是差不多代入数值计算就是了。(如果不理解怎么用离散傅里叶变换公式计算,建议看视频,视频里有离散傅里叶变换完整的计算过程,视频连接:https://www.zhihu.com/zvideo/1276595628009377792)
快速傅里叶变换推荐看下面两个视频
https://www.bilibili.com/video/BV1za411F76U
https://www.bilibili.com/video/BV1Jh411d7CN
下面是我用java实现的离散傅里叶变换及逆变换和快速傅里叶变换及逆变换,从他们的运行时间就可以看出来快速傅里叶变换快得多。(学完快速傅里叶变换再想想频谱为何Y轴对称?为何N/2对称?)
音频算法入门-傅里叶变换
傅里叶逆变换的做法略有不同,但意思就是这么个意思,理解了离散傅里叶变换公式的计算,逆变换其实也是差不多代入数值计算就是了。(如果不理解怎么用离散傅里叶变换公式计算,建议看视频,视频里有离散傅里叶变换完整的计算过程,视频连接:https:\/\/www.zhihu.com\/zvideo\/1276595628009377792) 快速傅里叶变换推荐看下面...
如何用傅里叶变换计算电感的频率?
频谱就是以2*fs为周期的,分辨率依然是1。若是先把F(w)里的w变量换成 t, 得到F(t)再对F(t)进行傅里叶变换。这时,我们可以将图片第二行的等式两边的 t 换成-w, 原来的w换成 t. 得到结果为2πf(-w)。
傅里叶变换怎么求?
符号函数不是绝对可积的函数,不存在常义下的傅里叶变换。在考虑广义函数的条件下是可求的,但不能用定义式F(jw)=∫f(t)e^{-jwt}dt来求。可以在已知u(t)的情况下,通过共轭对称性求得。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。最初傅立...
为什么要用傅里叶变换?FFT你不知道的细节
傅里叶变换,作为数字信号处理领域的重要算法,主要功能是将信号从时域变换到频域。其原理表明,任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。根据信号类型的不同,傅立叶变换可以分为四种类别:非周期性连续信号傅里叶变换、周期性连续信号傅里叶级数、非周期性离散信号离散时域...
傅里叶变换原理
傅里叶变换原理:傅立叶变换是数字信号处理领域一种很重要的算法,要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中...
什么是傅里叶变换?
傅里叶变换,从定义上讲,表示能将满足一定条件的某个函数表示成三角函数或者它们的积分的线性组合。简单来说,它贯穿了时域与频域,能够将任何形式的周期性信号无限拆解,分为多个有规律的简单正弦波信号。(正弦波是一个圆周运动在一条直线上的投影,所以频域的基本单元也可以理解为一个始终在旋转的圆。
傅立叶变换的计算公式是什么?
u(t)=1\/jw+pai*冲激函数(w),仔秋频域微风,时域*-jt,最后等式两段*j就可以了。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。最初傅立叶分析是作为热过程的解析分析的工具被提出的。傅立叶变换可分析信号的成分,也可用这些成分合成信号。许多...
快速傅里叶变换简要介绍
快速傅里叶变换(FFT),是一种高效计算离散傅里叶变换(DFT)的算法,它在1965年由Cooley和Tukey提出,显著减少了计算量。原本,DFT对N项有限长序列进行频域分析,需要进行N次复数乘法和N-1次复数加法,这在处理大规模数据时显得效率低下。FFT利用了傅里叶变换的奇偶性和对称性,通过分解和组合子序列...
傅里叶变换的定义?
如果两个函数满足条件:则称这两个函数相互正交。量子力学表明:属于同一厄米算符的不同本征值的本征函数互相正交。这种性质称为本征函数的正交性。这属于正弦波四个性质之一:任何两个频率不同的正弦波都是正交的。如果将两个正弦波相乘并在整个时间轴上求积分,则积分值为零。这说明可以将不同的频率分量...
傅里叶系数的确定方法
确定傅里叶系数的一种常见方法是使用傅里叶级数展开公式和积分计算。下面是确定傅里叶系数的基本步骤:1. 确定函数的周期:首先确定要分析的函数的周期,这是函数在一个周期内重复的距离或时间间隔。2. 将周期函数表示为级数:使用傅里叶级数展开公式,将周期函数表示为一系列正弦和余弦函数的叠加。对于...
萧封伏格: 傅立叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号.许多波形可作为信号的成分,比如正弦波、方波、锯齿波等,傅立叶变换用正弦波作为信号的成分. f(t)是t的周期函数,如果t满足狄里赫莱条件:在一个以2T为...
杨凌区18827312952: 如何理解傅立叶变换 - ?
萧封伏格: 傅里叶变换是一种解决问题的方法,一种工具,一种看待问题的角度. 理解的关键是:一个连续的信号可以看作是一个个小信号的叠加,从时域叠加与从频域叠加都可以组成原来的信号,将信号这么分解后有助于处理. 我们原来对一个信号其...
杨凌区18827312952: 如何理解傅里叶变换公式 - ?
萧封伏格: 首先讲一下傅里叶变换的由来和作用: 信号是有很多不同频率的波叠加在一起的,信号越简单叠加的波的频率就越少.如果我们要使用那些信号关键就是怎么对这些信号进行处理.在时域中我们看到有些信号波形非常复杂,根本无从下手.这时...
杨凌区18827312952: 傅里叶变换,拉氏变换的物理意义是什么 - ?
萧封伏格: 1. 傅式变换的目的是求解时域信号的频域组成成分. 2. 拉式变换其目的是为了快速求解常系数微分方程. 3. 离散傅立叶变换为傅立叶变换的特殊形式,就是要分析的时域信 号是离散的.z变换就是对离散系统的数学模型——差分方程转化为简单的代数方程,使求解简单化. 前两个针对连续的,后两个针对离散的. 4. 傅式是时频域变换,拉式是求解方程.
杨凌区18827312952: 语音信号的傅里叶变换(FFT)目的是什么 - ?
萧封伏格: 语音无非就是声波的一种,属于机械波,而机械波的两个重要的属性就是振幅和频率,对应声波的音长和音调;而傅里叶变换的主要目的就是分析频谱,由此可见语音信号的傅里叶变换...
杨凌区18827312952: 简介一下傅立叶变换! - ?
萧封伏格: 一种线性的积分变换,常在将信号在时域(或空域)和频域之间变换时使用,在物理学和工程学中有许多应用.因其基本思想首先由法国学者约瑟夫·傅里叶系统地提出,所以以其名字来命名以示纪念.
杨凌区18827312952: 傅里叶变换 - ?
萧封伏格: 您对于傅里叶变换恐怕并不十分理解 傅里叶变换的实质是将一个信号分离为无穷多多正弦/复指数信号的加成,也就是说,把信号变成正弦信号相加的形式——既然是无穷多个信号相加,那对于非周期信号来说,每个信号的加权应该都是零——...
杨凌区18827312952: 实现傅里叶变换算法后怎么用来分析音频 - ?
萧封伏格: (1)同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名. (2)在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾. AnyName *.do AnyName /action/*
杨凌区18827312952: 傅里叶变换是用来做什么的,具体举例一下应用? - ?
萧封伏格: 计算机上的声音和图像信号、工程上的任何波动信息、数学上的解微分方程、天文学上对遥远星体的观测,到处都要用到傅里叶变换.你用手机播放MP3音乐、看图片、语音识别,这些都是傅里叶变换的日常应用. 本质上讲,傅里叶变换,是...
杨凌区18827312952: 用单片机处理音频信息为什么要进行傅里叶变换? - ?
萧封伏格: 这个真不是一句两句说清楚的,简单来说就是把时域信号变为频域信号,为了看到音频的频谱,必须要对其信号做FFT,之后便可以看到信号的频率,谐波灯等相关信息.建议看一下相关的书籍,那样会更明白的.