傅立叶级数?变换?FFT?
文章目录
- 总结
- 引言
- 傅立叶级数(FS)
- 傅立叶变换(FT)
- 离散傅里叶级数(DFS)
- 离散时间傅里叶变换(DTFT)
- 离散傅立叶变换(DFT)
- 快速傅立叶变换(FFT)
- 多项式乘法(我猜你想看的FFT)
- 信号处理中的FFT
总结
很魔法,总结写在最前面,因为这是我觉得最关键的内容。
- 傅里叶级数其实是被傅里叶变换囊括的,表现为频谱上的一个个冲激信号。
- 频谱离散的信号,就是可以写出傅里叶级数的信号,特点就是要有周期(非周期在周期延拓也可以),连续就是FS(第二种),离散的就是DFS(第四种)。
- 无论是连续还是非连续的都可以看做傅里叶变换。下面这张图囊括了傅里叶变换的所有形式。里面包含了傅里叶变换的对偶性。
- 另外,傅里叶变换(第一种)条件是绝对可积,由此引出了拉普拉斯变换。离散时间傅里叶(第三种)变换条件则是绝对可和,由此引出了z变换,另一篇博客讲。前面是对于非周期而言的,周期性的不绝对可积也不绝对可和,不能拉普拉斯和z变换。
- 1,3傅里叶变换;2,4傅里叶级数。2,4也可以叫变换,前提是引入冲激函数。
引言
本人专业是自动化,离不开信号与系统这门课,提到信号与系统,自然是离不开大名鼎鼎的傅立叶,傅立叶级数、傅立叶变换都是常用的计算工具。
同时,我也搞搞算法竞赛,众所周知,FFT(快速傅立叶变换)是一种计算多项式乘法的算法。
虽然我都接触过这两个东西,但是快速傅立叶变换和傅立叶变换,有什么关系吗?
当然有,在此之前,你得先知道有个东西叫离散傅立叶变换(DFT),FFT的最早提出其实是为了快速计算出DFT。也就是说,FFT是一种算法,它的命名是因为它最早被用于求解离散傅立叶变换,而同时它也可以解决一些其他问题。
然后我现在总结一下这些东西。
关于拉普拉斯变换和Z变换写在了另一篇博客中。
傅立叶级数(FS)
傅立叶变换是针对周期函数而言的。数学家经常这么想,能不能用一些简单的函数累加去组合出(逼近)一个复杂的函数,其中最有名的肯定是泰勒公式。
傅立叶级数也是类似的想法,周期函数能不能分解成很多简单的函数和。和出来的函数是周期性的,那自然想到组成函数也是周期性的,最简单的周期函数是什么呢?当然是三角函数(简单在容易积分和求导,这个简单还包括正交性,乘积的积分等于0)。
然后就有了傅立叶级数:
推导可以看这个博客,也包括了后面傅立叶变换啥的
然后再增加一点,非周期信号也可以计算傅立叶级数。就是把函数当成:存在定义域的周期函数,即定义域内为整个函数的一个周期。
公式就变成了:
傅立叶变换(FT)
傅立叶级数是针对周期信号的,那如果是定义在整个周期上的非周期信号,就不可以用周期信号去逼近了吗?答案是可以,但是是连续的,既然是连续的,那就不能写成求和的形式,而是积分的形式。公式如下,包括逆变换公式:
谈谈理解,F(w)是频谱,什么是频谱,可以理解为一个个不同频率的周期函数,它们可以组成整个函数,但是这些函数的个数是无穷多的,所以函数的横坐标实际表达的是在某个频率附近函数的密度。如果你学过概率论,知道概率密度函数,应该可以比较轻松的理解。
然后,我们再反过来思考,对于周期信号,傅立叶变换是什么样的?如果你去看书,会发现频谱图是一个个离散的冲激信号(不懂自己查),也就是说这个地方频率密度无限高,换言之就是这个频率。这其实非常符合我们用傅立叶变换去逼近函数,用于逼近的周期函数的频率正好是离散的。
PS:提一个很简单的应用,稍微给大家建立一点实际应用的感觉。两个同时说话,声调不同,我们一开始采集到的声轨是时间关于声音(音量?振动速度?原谅我物理没学好)的函数。我们把它傅立叶变换,由于两个人声带振动频率不同,变换后的函数会在两个不同的频率处有两个峰,我们消除其中一个并拟变换回来,就消除了其中一个人的声音。类似的应用还有很多,比如说消除图片中的高频噪声等等。
离散傅里叶级数(DFS)
离散傅里叶级数是针对周期离散时间信号而言的。
离散序列傅里叶级数(变换)之后是周期性的,这很关键。因为下一个周期又会重复某个(4pi和2pi转起来是一样的),才能抵消掉多余的部分,不然一圈内的频率,肯定组成的原函数是连续的。(一种感觉罢了 )
推出来是这个样子的。
离散时间傅里叶变换(DTFT)
先用单位冲激序列对函数采样,就变成了离散时间序列。然后使用傅里叶变换可以推出来DTFT的公式。(交换积分次序,利用冲激函数的积分求)
离散傅立叶变换(DFT)
对于计算机来说,无穷是无法求解的。就像电脑算积分,其实是把函数分成非常多小条矩形,加起来的面积就是积分值,离散傅立叶变换也是类似的东西。
对于频谱密度函数(频谱F(w)),可以感受一下,如果每隔一小段,用其中某个值代替频率密度,函数就变成离散的了,然后可以用这些频率和其函数值作为系数去组成(累加)原函数,这不就是所谓的离散傅立叶变换吗。
这是DFT的公式:
看傅立叶级数的指数形式:
有没有觉得很像,注意:
标准化的傅立叶变换T趋向于N(隔一个点采一下),傅立叶级数指数形式中括号内就是傅立叶变换,而用离散傅立叶变换代替,T换成N,就变成了傅立叶逆变换。我并没有推过公式,但是这证明的感受是对的。可以说,离散傅立叶变换将傅里叶级数推广到了所有函数。
然后这个公式还可以写成矩阵变换的形式,记住这个 W n t W_n^t Wnt,这是快速傅里叶变换的关键,快速傅里叶变换指的就是快速求出所有的 W n t W_n^t Wnt(nlogn复杂度)。
然后还可以看一下这篇链接,不从傅里叶变换得到离散傅里叶变换,更容易理解也更好记。
快速傅立叶变换(FFT)
多项式乘法(我猜你想看的FFT)
首先是多项式的存储方式,一是系数存储法,那么在做多项式乘法的时候,显然会产生 n 2 n^2 n2的系数,然后再进行合并,那太慢了。二是使用点值存储法,n个点可以确定一个n阶多项式,并且点与点的对应相乘是O(n)的,非常快。要解决的就是如何将系数多项式转变为点值,以及如何将点值多项式转回去。
首先,将系数多项式转为转为点值,就是带n个点进去算,但是计算一个点的n次方是很耗时的,我们需要选择合适的点,加速这个过程。
我们重新来看看 ω n k \omega^k_n ωnk,将复平面单位圆n等分, ω n 0 \omega^0_n ωn0代表点(1,0), ω n k \omega^k_n ωnk代表绕单位元逆时针k号点。
显然 ω n k = ω 2 n 2 k \omega^k_n=\omega^{2k}_{2n} ωnk=ω2n2k, ω n k = − ω n k + n / 2 \omega^k_n=-\omega^{k+n/2}_{n} ωnk=−ωnk+n/2
推导:
含义解读:一个长度为n的序列,A[k]代表带入单位圆k分点对应的函数值,这个A[k]可以根据奇偶分成两部分A1[n/2]和A2[n/2],并且已知A1和A2可以O(n)求出A。并且A1和A2保持了原来的形式,可以递归求解。
优化:递归常数太大,考虑迭代。假设我们知道最后一层每个点的位置,我们就可以一层层地往上迭代了。另外,迭代过程只需要一维数组,因为每次都是两个点刷两个点。
观察得出:
最终每个元素所在位置就是其二进制翻转。
code:
for(int i=0;i<limit;i++)r[i]= ( r[i>>1]>>1 )| ( (i&1)<<(l-1) ) ;
for(int i=0;i<limit;i++) if(i<r[i]) swap(A[i],A[r[i]]);//求出要迭代的序列,i<r[i]保证只换一次
PS:FFT一定要n是2的整数次幂,如果不是,将n增大到2的幂次,高次项系数为0。
然后是逆变换(IFFT),经过一套推算之后,在分治的过程中乘上单位根的共轭复数( ω n k \omega^k_n ωnk的共轭复数),分治完的每一项除以n即为原多项式的每一项系数。
fft和ifft共用一个函数,ifft处理完后所有项要/n,
注意要这么写c[i]=(int)(a[i].real()/n+0.5);因为存在精度问题,1.99999999这种
信号处理中的FFT
本质是一个东西,应该说是多项式乘法被转化为了和DFT相同的形式。
把上面DFT公式用欧拉公式展开,就变了上面的形式,不信你试试看。
傅立叶级数?变换?FFT?相关推荐
- JavaScript实现快速傅立叶变换FFT算法(附完整源码)
JavaScript实现快速傅立叶变换FFT算法(附完整源码) radianToDegree.js完整源代码 ComplexNumber.js完整源代码 bitLength.js完整源代码 fastF ...
- dsp实现快速傅里叶的C语言程序,DSP-快速傅立叶变换(FFT)算法实验
<DSP-快速傅立叶变换(FFT)算法实验>由会员分享,可在线阅读,更多相关<DSP-快速傅立叶变换(FFT)算法实验(10页珍藏版)>请在人人文库网上搜索. 1.中 南 大 ...
- 如何使用计算机实现fft,快速傅立叶变换(FFT)的计算机实现..doc
快速傅立叶变换(FFT)的计算机实现. 信号与系统课程设计 --FFT的计算机实现 快速傅里叶变换(FFT)的计算机实现 赖智鹏 华中科技大学电气与电子工程学院0809班U200811806 Emai ...
- 快速傅立叶变换(FFT)的海面模拟
快速傅立叶变换(FFT)的海面模拟 在这篇文章中,我们将根据Tessendorf的论文[1]中的方程来实现统计波浪模型,以模拟海洋水. 使用快速傅立叶变换,我们将能够实现实时交互的帧速率.以下提供两 ...
- 快速傅立叶变换(FFT)算法(原来这就是蝶形变换)
快速傅立叶变换(FFT)算法(原来这就是蝶形变换) 为了实现FFT的海面模拟,不得不先撸个FFT算法实现. 离散傅立叶变换(DFT) 学习FFT之前,首先要先了解什么是DFT,我们都知道傅立叶变换是将 ...
- 快速傅立叶变换fft_使用快速傅立叶变换fft从气候数据中提取季节性模式
快速傅立叶变换fft Meteorology students hardly experience smooth and expeditious data analysis. When comes t ...
- 神经网络中快速傅立叶变换(FFT)的梯度传递
最近需要在神经网络中构造复数酉矩阵做权重系数,使用了快速傅立叶变换和反变换. 但是FFT不是theano的现成操作模块(有人写过对应的代码,所以应该会很快加进去了),所以想自己去写梯度传递来彻底搞清楚 ...
- matlab算法(二维傅立叶级数变换)
说明 Y = fft2(X) 使用快速傅里叶变换算法返回矩阵的二维傅里叶变换,这等同于计算 fft(fft(X).').'.如果 X 是一个多维数组,fft2 将采用高于 2 的每个维度的二维变换.输 ...
- 图像的变换——fft/ ifft、fftn、fft2、dct2、dict2、dctmtx
文章目录 一.离散傅立叶变换 1.fft/ ifft--快速傅立叶变换/反变换 2.fftn-进行n维快速傅里叶变换 3.fft2-进行2维快速傅里叶变换 二.离散余弦变换 1.dct2 函数 2.d ...
- 第一次邂逅快速傅立叶变换(FFT)
为了毕业设计,我要学习JPEG,还有视频压缩技术,在JPEG的时候,我就被前面的DCT给挡住了,现如今我终于写了一个FFT程序,发了我好长的时间.如果说是因为我的无知,还是什么,我对学习这类有关数学的 ...
最新文章
- 数字IC设计各种仿真波形文件
- 六、继续学习Java的位运算符,发现真的简单
- 目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)
- shell脚本spawn_如何使用child_process.spawn将Python / Ruby / PHP Shell脚本与Node.js集成
- java前台计算date差_js前台计算两个日期的间隔时间
- 22. Python 模块2
- zabbix-server添加了网络设备模板导致boot.log占满根目录不能ssh登陆
- C++设计模式——Composite 组合模式
- day20 python常用模块
- opencv实现阈值分割
- IDEA格式化js代码
- 怎么查python题答案_超星尔雅Python语言应用查题教程
- iconv 判断字符编码_iconv函数文字编码格式转换
- P2345 [USACO04OPEN]MooFest G 【树状数组】
- vue的学习笔记(15)之Promise知识讲解
- Oleg Shilo:基于CS-Script的Notepad++插件
- GFPGAN:老旧照片的面部恢复神器
- Python编程学习第一篇——Python零基础快速入门(三)——10行代码画朵花
- 模拟二进制交叉算子详解
- 2018年12月最新win101809教育版激永久激活密钥和方法