快速傅里叶变换(FFT)算法学习

article/2025/10/19 1:08:13

前言

人生如逆旅,我亦是行人。


一、介绍

算法的世界多么广大,我们可以将算法大致分为两类:

  • 第一类是较为有用的算法:比如一些经典的图算法,像 DFS 和 BFS(深度 / 广度优先算法),这些算法应用在很多方面,他们非常高效,
    在这里插入图片描述

  • 第二类算法是那些极具美感的算法:例如当我们第一次看到汉诺塔的递归实现算法时的状态,你肯定会觉得这个算法贼牛逼,甚至会被它的美感所震撼到,但这些算法或许并没有那么有用或者高效,不过我们还是会研究它,就像没事干了我们还是会看小说;
    在这里插入图片描述

这些伟大而精妙的算法会激发我们的灵感,促使我们发散性思考,下面介绍一种同时属于以上两类的算法:快速傅里叶变换(FFT)。

FFT 算法毫无疑问是上个世纪发明的最伟大的算法之一。很多我们现代生活所依赖的科技,比如无线通讯和 GPS ,以至于任何和信号处理有关的算法,都依赖于 FFT 的深刻洞见。

人们常常不能感知 FFT 的美感,因为它常常有很长很长的前置知识要求, 比如离散傅里叶变换、时域/频域转换、甚至更多。

yysy(有一说一),想要真正搞清 FFT 的应用,你也不得不把这些前置要求都学好。

快速傅里叶变换 ( fast Fourier transform ), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称 FFT


二、学习

  • 简单的问题:给定两个多项式,计算二者的乘积。
  • 我们的任务就是设计高效的算法解决这个问题。
    在这里插入图片描述
  1. 数学上,这个问题可以直接通过重复使用乘法分配律解决。
    在这里插入图片描述
    但是在计算机中,首先需要解决的问题是,如何存储一个多项式?
  • 显然,最自然的做法就是储存多项式的系数。我们只需要把系数映射到一个数组中。

系数应该按如下图所示的顺序储存。

因为这样一来数组的第 k 个数字正好对应多项式的 k 阶项系数。

这种表示方法为多项式的系数表示方法。

在这里插入图片描述

一般情况下,给定两个 d 阶多项式,二者乘积应为 2d 阶多项式。

并且这一算法,如果用 naive 的乘法分配律来算,时间复杂度为 O(d ^ 2) 。因为多项式 A 的每一项都会跟多项式 B 的每一项相乘。

如何改进这个算法?

在这里插入图片描述


例子

我们以最简单的多项式,即一阶多项式/线性函数为例。

在这里插入图片描述

我们可以用两个系数来表示线性函数,即截距(0阶系数)和斜率(1阶系数)(注:一对系数一对一决定了唯一的一条直线),还有没有别的直线的表示也可以唯一确定一个直线呢?

表示其实很多,我们这里使用直线的两点表示。

  • 美丽的几何学告诉我们:两点确定一条直线。

  • 事实上:高阶多项式也有类似的性质。 (即:任意 d 阶多项式都由 d+1 个点唯一确定的

在这里插入图片描述

例如下图中的三个点确定了左边这个二次函数:

在这里插入图片描述
如果图中有四个点,那么我们就能确定左边这个唯一的三次函数:

在这里插入图片描述
接下来证明一下这个结论:

  • 假设我们有 p(x) 这个 d 阶多项式,通过了给定的 d+1 个点,我们需要证明:系数是唯一
  • 因此,我们将这 d+1 个点带入多项式的方程,得到 d+1 个方程。线性方程组当然可以写作 矩阵-向量 表示。
    在这里插入图片描述
  • 矩阵 M 可逆,只要这些 点 x_0、… 、x_d 不重复(即两两都不同(下面为 范德蒙德矩阵)),只需证明 M 的行列式不为零(范德蒙德行列式
    在这里插入图片描述
    从而我们知道系数p_0、… 、p_d 是被 d+1 个点唯一确定的,从而多项式也是唯一的。

我们现在有两种表示多项式的方法:

  • 第一种是系数表示法;
  • 第二种是 d+1 个点表示法,称为值表示法;(利用值表示法,多项式乘法变得不能再简单了)

在这里插入图片描述


回到之前的问题

在这里插入图片描述
乘出来的多项式 C(x)必然为 4 阶,所以需要 5 个点表示。我们现在只需要挑出五个点并计算已有的两个多项式的值,然后把对应每个点的两个值相乘,得到 C 在每个点的函数值。

在这里插入图片描述

根据我们前面的学习,五个点可以确定唯一的多项式,

在这里插入图片描述

这个多项式的系数表示我们也算出来了,利用值表示法,我们计算多项式乘法的时间一下子从 O(d^2)缩短到了 O(d)。

接下来开始快速的多项式乘法算法了。


问:

  • 给定两个系数表示的 d 阶多项式,我们已经知道了值表示法计算多项式乘法更快,所以我们可以先计算两个多项式在 2d + 1 个点上的值,然后将函数值一对对地乘起来,从而得到乘出来的多项式的值表示,最后,将值表示转换回系数表示。

在这里插入图片描述

  • 主要的方法我们大致已经清楚,现在的问题在于还有些步骤我们没搞清楚,
  • 事实上我们缺的就是:如何将系数转换成值表示,以及反过来,如何将值表示转换成系数?
  • 这一过程,实际上就是 FFT 重要之处。

四、求值(evaluation)

让我们先关注一个方向:从系数表示到值表示。这个问题称为求值(evaluation)。

给定 d 阶多项式和 n 个点,我们想计算多项式在这 n 个点上的值(n >= d+1)

  • 我们可以采取粗暴的方式:直接在 x 轴上挑取 n 个点,一个一个计算函数值,但是如果这样计算的话,将会变得十分麻烦。 即每个点的计算都是 O(d),加起来还是 O(nd) >= O(d^2)。这样问题又变得像最初那样复杂,现在的问题是能不能整点更快的?

在这里插入图片描述

  • 将问题简化一下:考虑一个简单的多项式,比如:P(x) = x ^ 2,在 n=8 个点进行求值。
  • 那么问题又来了,我们选那八个点更具有代表性呢?
  • 有没有这样的一对点:当你知道一个点的函数值时,另一个点的也可以立刻知道?
  • 答案是:互为相反数的数对。(前提是:函数 P 是一个偶函数)

在这里插入图片描述

  • 如果是 P(x) = x^3 咋办,?
  • 事实上这个技巧依旧是对的,不过我们要在 -x 的函数值前面加个负号,

在这里插入图片描述

  • 所以在这两个偶/奇函数的情形中,我们只需要计算一半数量的点就好了,因为剩下一半从奇偶性中就可以的得到了。

再来看看奇偶这个点子对一般的多项式还适不适用,将多项式分成奇/偶函数两个部分,把奇函数部分的 x 提出来一个,那么两个括号里都是两个偶多项式函数。

在这里插入图片描述

这样的分解使得我们对于一对相反数计算函数值时,只需要计算其中一个,同时我们可以把两部分都看作 x^2 的函数,你可以看到两个子函数的阶数都降到了 2,比原来的 5 阶不知道高到哪去了。

在这里插入图片描述

  • 推广这一想法,如果我们有一个 n-1 阶多项式,我们想计算它在 n 个点的函数值,我们可以将多项式分为 奇 / 偶两部分,每部分都只有 n/2 - 1 阶
  • 对于这两个只有一半阶的多项式,我们怎么计算他们在对应点的值呢? 这又是一个求值问题,不过这次我们需要计算我们所给的点的平方的函数值。因为我们一开始取了一对对相反数,所以平方之后正好只剩 n/2 个点了,有没有一点像递归算法。
  • 总结:计算多项式 P 在 n 个点上的值,这 n 个点是一对对的相反数。我们把多项式分成(如上所述)的两个部分,从而我们有两个阶为 n/2 - 1 的多项式,每个多项式也只需要求 n/2 个点的值。我们只需要递归地求这两个小多项式的值,利用下方这两个公式带回去,就可以得到原多项式的 n 个的值。最后我们就得到了原多项式的值的表达。

在这里插入图片描述

如果上述的一切都行得通,那么我们的时间复杂度仅为 O(nlogn) ,因为两个子问题都是原问题规模的一半,而且我们只需要线性时间来计算原多项式的值。

  • (一个问题)在递归步骤:我们假设了每个多项式我们都使用相反数来对其进行求值。注意对子问题而言,每个求值点都是平方数,所以都是正的,递归不成立。
  • 如何将新的求值点也搞成相反数对?
  • 唯一的方法:就是将这些点都取成复数。这也正是 FFT 算法最奇思妙想的地方。

我们需要专门挑一些复数,使得它们平方之后,依旧是正负成对出现的。

现在又有一个问题来了:该怎么取这些复数呢?


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 我们可以通过一个逆向工程来得到答案。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/83B5U7ao.shtml

相关文章

FFT算法讲解——麻麻我终于会FFT了!

FFT——快速傅里叶变换 这块不写东西空荡荡的,我决定还是把FFT的定义给贴上吧 FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性&…

怎么计算网站流量?

如何计算网站的流量呢?在这华仔给大家分享一个如何计算流量的算法: 举个栗子:1G1024M,10G就是101024M10240M. 一个1M的文件被下载1000次的流量约为1G;被下载10000次的流量约为10G. 假如你每月的网站流量为10G,那10G的流…

CDN流量是什么,怎么计算?

CDN流量通俗来讲就是使用CDN加速时,网络加速会产生一个数据使用量,到达某一个时段,统计出这个时段使用的量,也就是CDN流量,和网站流量的使用很像。 随着互联网的发展,用户在使用网络时对网站的浏览速度和…

流量计算器

为所做的工作处于初始开发的阶段,所以数据一直在变化,导致1s的流量大小一直也在变化。每次都需要手动根据新的参数进行计算,真的好烦。 所以呢,作为一个程序员,能让程序做的事情,自己就不要动手了呀&#x…

Flink1.14相关-3.数据流量计算

1. 前言 使用环境 Flink1.14.6Centos7.9Java8 Flink1.14.6安装部署测试参考:参考链接 2 .数据采集 2.1 信号监听 需要监听文件夹下的新文件产生,并且数据库中的值未更新时才发送消息通知后续模块开始采集数据。【后面需要重新搭建监听部分和判断部分…

适应多场景的客流量统计-人流量统计算法

在商场、展厅、景区等受人流量影响较大的场所,流量统计算法可以快速获取流量数据和动态趋势,辅助评估店铺和部分活动的效果,帮助商业决策。另外,在地铁站、火车站、机场等公共场所。实时检测人数可以及时预警高密度人群&#xff0…

网站的服务器带宽计算,服务器带宽和流量计算方式

服务器带宽和流量计算方式。网站流量和带宽该怎么计算,给一些参照数据信息,由于不清楚流量和带宽是怎么计算的,因此不清楚用多宽的带宽更有效、更节省资产! 网站服务器上最好是安装流量统计手机软件(强烈推荐应用DUMeter),假如流量…

博途1200/1500PLC累计流量计算FB(SCL算法详解+优化)

在编写这篇博客之前其实已经写过一篇SMART S7-200PLC的流量累计的应用文章,由于很多朋友咨询博途PLC下的流量累计实现算法。今天我们以博途PLC的开发环境为例详细讲解算法的实现原理和注意事项同时给出算法的优化方法。受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢…

阿里云轻量应用服务器流量计算方法

阿里云轻量应用服务器套餐有峰值带宽限制每月流量的,还有固定带宽的,阿里云轻量应用服务器流量是怎么计算的?阿里云轻量应用服务器来说说不同套餐下轻量服务器流量计算方法: 轻量应用服务器带宽套餐和流量套餐 阿里云轻量应用服…

物联网GPRS模块流量计算

物联网GPRS模块流量计算 MQTT(消息队列遥测传输) 是ISO 标准下一个基于TCP/IP的消息发布/订阅传输协议。 一、TCP消耗流量计算 以太网数据包结构: 以太网首部 IP首部 TCP首部 APPL首部 用户数据 以太网尾部 以太网首部为14个字节 IP首部为20个字节 TCP首部…

恒容容器放气的瞬时流量的计算

有时候,你会遇到一个问题,该问题的描述如下: 你有一个已知体积的容器,设容器体积为,里面装有一定压力(初始压力)的气体,如空气或氢气等,设初始压力为,容器出口连接着一个阀门开关&am…

阿里云服务器公网带宽流量是怎么计算的?

阿里云服务器流量如何计算?云服务器出流量和入流量都要计算吗?不是,只计算云服务器公网出方向流量,阿里云服务器内网流量和公网出方向流量都是免费的,护云盾来详细说下阿里云服务器流量计算及流量收费说明:…

计算机网络-流量强度

若R链路带宽(链路宽度),L分组长度(一个分组的大小),a分组到达队列的平均速率(分组数量),流量强度公式 :I La/R 举例理解: 当汽车排队从关卡上桥…

腾讯云服务器带宽计费模式按流量内网、外网出入流量计算说明

腾讯云服务器公网带宽计费模式按使用流量计费,云服务器对内或对外产生的流量如何计算?云服务器出方向(下行流量)和入方向(上行流量)怎么计算?腾讯云百科来详细说下腾讯云服务器按使用流量计算说…

计算视频流量

码率也可以叫比特率,就是一种音乐每秒播放的数据量,单位用bit表示,也就是二进制位。 bps就是比特率。b就是比特(bit),s就是秒(second),p就是每(per&#xff0…

电缆载流量计算对照表

10.6/1KV聚氯乙烯绝缘电力电缆载流量 常用型号VV22、VLV22聚氯乙烯绝缘钢带铠装聚氯乙烯护套电力电缆载流量 注:以上电缆载流量计算条件 1. 线芯长期工作温度:70℃; 2. 环境温度:25℃ ; 3. 埋地深度:10…

明渠如何快速估算水流量(明渠流量计算)

明渠流量估算一般采用速度面积法估算,如果你有流速仪可以测量渠道的流速,如果没有,可以通过漂浮物与秒表来估算,漂浮物容易受到风速影响,风大了是不行的,比如通过一个漂浮物,在时间t内漂浮的距离…

IPCam网络摄像头

文章目录 软件安装及编译环境搭建及代码获取1、于VirtualBoxVM安装Ubuntu2、Ubuntu开机设定3、MobaXterm安装及开发板连接4、套件安装以及SDK编译5、 如何获取代码6、如何更新代码 IPCam网络摄像头7、如何编译IPcam8、配置板端资源以及环境9、参数配置及运行效果9.1参数配置文件…

如何低成本化实时网络摄像头监控直播?

大众直播时代,处处有直播,直播已经在方方面面改变着人们的生活和工作。随着网络直播应用生态的越发完善,你会发现,很多传统监控升级为互联网直播的应用越来越多。那么,如何将常规监控摄像头转为互联网直播?…

【解决方案】5G时代浪潮来袭,EasyNVR助力5G厂区视频监控安防采集可视化展示

智慧工厂被认为是5G技术的重要应用场景之一,利用5G网络将生产设备无缝连接,并进一步打通设计、采购、仓储、物流等环节,满足工业环境下设备互联和远程交互应用需求。TSINGSEE青犀视频面向工厂智能化升级需求,推出5G智慧工厂方案&a…