文章目录

  • 总结
  • 引言
  • 傅立叶级数(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?相关推荐

  1. JavaScript实现快速傅立叶变换FFT算法(附完整源码)

    JavaScript实现快速傅立叶变换FFT算法(附完整源码) radianToDegree.js完整源代码 ComplexNumber.js完整源代码 bitLength.js完整源代码 fastF ...

  2. dsp实现快速傅里叶的C语言程序,DSP-快速傅立叶变换(FFT)算法实验

    <DSP-快速傅立叶变换(FFT)算法实验>由会员分享,可在线阅读,更多相关<DSP-快速傅立叶变换(FFT)算法实验(10页珍藏版)>请在人人文库网上搜索. 1.中 南 大 ...

  3. 如何使用计算机实现fft,快速傅立叶变换(FFT)的计算机实现..doc

    快速傅立叶变换(FFT)的计算机实现. 信号与系统课程设计 --FFT的计算机实现 快速傅里叶变换(FFT)的计算机实现 赖智鹏 华中科技大学电气与电子工程学院0809班U200811806 Emai ...

  4. 快速傅立叶变换(FFT)的海面模拟

    快速傅立叶变换(FFT)的海面模拟 在这篇文章中,我们将根据Tessendorf的论文[1]中的方程来实现统计波浪模型,以模拟海洋水.  使用快速傅立叶变换,我们将能够实现实时交互的帧速率.以下提供两 ...

  5. 快速傅立叶变换(FFT)算法(原来这就是蝶形变换)

    快速傅立叶变换(FFT)算法(原来这就是蝶形变换) 为了实现FFT的海面模拟,不得不先撸个FFT算法实现. 离散傅立叶变换(DFT) 学习FFT之前,首先要先了解什么是DFT,我们都知道傅立叶变换是将 ...

  6. 快速傅立叶变换fft_使用快速傅立叶变换fft从气候数据中提取季节性模式

    快速傅立叶变换fft Meteorology students hardly experience smooth and expeditious data analysis. When comes t ...

  7. 神经网络中快速傅立叶变换(FFT)的梯度传递

    最近需要在神经网络中构造复数酉矩阵做权重系数,使用了快速傅立叶变换和反变换. 但是FFT不是theano的现成操作模块(有人写过对应的代码,所以应该会很快加进去了),所以想自己去写梯度传递来彻底搞清楚 ...

  8. matlab算法(二维傅立叶级数变换)

    说明 Y = fft2(X) 使用快速傅里叶变换算法返回矩阵的二维傅里叶变换,这等同于计算 fft(fft(X).').'.如果 X 是一个多维数组,fft2 将采用高于 2 的每个维度的二维变换.输 ...

  9. 图像的变换——fft/ ifft、fftn、fft2、dct2、dict2、dctmtx

    文章目录 一.离散傅立叶变换 1.fft/ ifft--快速傅立叶变换/反变换 2.fftn-进行n维快速傅里叶变换 3.fft2-进行2维快速傅里叶变换 二.离散余弦变换 1.dct2 函数 2.d ...

  10. 第一次邂逅快速傅立叶变换(FFT)

    为了毕业设计,我要学习JPEG,还有视频压缩技术,在JPEG的时候,我就被前面的DCT给挡住了,现如今我终于写了一个FFT程序,发了我好长的时间.如果说是因为我的无知,还是什么,我对学习这类有关数学的 ...

最新文章

  1. 数字IC设计各种仿真波形文件
  2. 六、继续学习Java的位运算符,发现真的简单
  3. 目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)
  4. shell脚本spawn_如何使用child_process.spawn将Python / Ruby / PHP Shell脚本与Node.js集成
  5. java前台计算date差_js前台计算两个日期的间隔时间
  6. 22. Python 模块2
  7. zabbix-server添加了网络设备模板导致boot.log占满根目录不能ssh登陆
  8. C++设计模式——Composite 组合模式
  9. day20 python常用模块
  10. opencv实现阈值分割
  11. IDEA格式化js代码
  12. 怎么查python题答案_超星尔雅Python语言应用查题教程
  13. iconv 判断字符编码_iconv函数文字编码格式转换
  14. P2345 [USACO04OPEN]MooFest G 【树状数组】
  15. vue的学习笔记(15)之Promise知识讲解
  16. Oleg Shilo:基于CS-Script的Notepad++插件
  17. GFPGAN:老旧照片的面部恢复神器
  18. Python编程学习第一篇——Python零基础快速入门(三)——10行代码画朵花
  19. 模拟二进制交叉算子详解
  20. 2018年12月最新win101809教育版激永久激活密钥和方法

热门文章

  1. 辛弃疾《丑奴儿·书博山道中壁》赏析 (转载自网络)
  2. java编写简易计算器_java实现简易计算器功能
  3. 2.3 定点乘法运算
  4. 【翻译】Mining Algorithm Roadmap in Scientific Publications
  5. 苹果签名证书多少钱一个月?
  6. 计算机更改家庭组密码,Windows7中为家庭组设置密码后如何修改
  7. Android 模仿QQ登录界面解决软键盘遮挡问题
  8. 选择Moonbeam平台开发的十大理由2.0版
  9. 软件测试工程师-CSS
  10. 各大企业2023年年终奖统计