优雅的FFT算法

article/2025/10/18 22:49:13

简 介: 利用FFT算法实现快速傅里叶变换, 在理论、工程中具有非常广泛的应用。 除了能够在合适的计算平台完成FFT算法,同时还需要注意到它在频谱分析中可能带来的频率混叠以及频率泄露等问题。

关键词 FFT算法实现

Python算法
目 录
Contents
FFT算法代码
FFT 算法测试
其它语言FFT
Fortran FFT算法
C语言FFT算法
总 结

 

§01 Python算法


  天下午的信号与系统, 给同学们介绍了离散傅里叶变换的基本应用, 并且介绍了快速傅里叶变换(FFT)的主要思想与算法。 FFT算法因其优异的性能和广泛的应用, 堪称信息处理领域的原子武器。 实现FFT编程语言很多, 比较来比较去, 利用Python语音所描述的该算法最为简明和优雅。

1.1 FFT算法代码

  下面的代码是在 The Fast Fourier Transform (FFT): Most Ingenious Algorithm Ever? 视频中给出的 FFT 递归算法形式, 最大精度反映了FFT算法核心。

  这个代码实现了DIF(时域抽取快速傅里叶变换), 利用递归定义,将FFT核心算法中的分而治之体现的淋漓尽致, 突出了递归核心中的核心思想。

def FFT(P):n = len(P)if n == 1: return Pye = FFT(P[0::2])yo = FFT(P[1::2])y = [0]*nw = exp(-1j*2*pi/n)for j in range(n//2):yow = w**j * array(yo)y[j] = ye[j] + yow[j]y[j+n//2] = ye[j] - yow[j]return y

  利用Python语音中对于数组切片操作语法, 还可以将上面FFT算法中的循环部分都替换成关于数组的操作, 使得实际运算速度得到提高。

def FFT1(P):n = len(P)if n == 1: return Pye = FFT(P[0::2])yo = FFT(P[1::2])w = exp(-1j*2*pi/n)**array(list(range(n//2)))yow = w*yoy = [0]*ny[:n//2] = ye + yowy[n//2:] = ye - yowreturn y

1.2 FFT 算法测试

  为了测试算法的有效性, 下面对于一个方波信号计算对应的FFT结果。

  测试算法代码如下:

LEN = 1024
oneLEN=10
p1 = [1]*oneLEN+[0]*(LEN-oneLEN)y = FFT(p1)
plt.plot(abs(array(y)), label='abs(FFT)')
plt.plot(p1, label='Data')plt.xlabel("y")
plt.ylabel("abs(FFT(y))")
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()

  下面是测试利用Python语言实现的FFT算法计算结果。

▲ 图1.2.1 利用Python语音实现的FFT算法测试结果

▲ 图1.2.1 利用Python语音实现的FFT算法测试结果

 

§02 它语言FFT


  FFT算法贵在计算效率,前面使用Python实现FFT,虽然形式上优雅,但实际执行效率不高。 提高执行效率,还是需要使用编译语言。

2.1 Fortran FFT算法

  在我上大学期间所学的编程语言为Fortran, 估计现在没有多少同学学习这个算法语言。 下面给出了利用Fortran语言实现的FFT算法程序。

  算法整体上包括有两个阶段:

  • 第一个阶段实现了对输入数据进行倒读顺序排列;
  • 第二阶段利用三重循环实现了分组蝶形运算。

  当然了,时过三十年再看Fortran感觉十分酸爽, 但它简练语言和执行高效还是让我们回忆起当年编程时所感觉到的快乐。

▲ 图 Fortran 语言实现的FFT算法

▲ 图 Fortran 语言实现的FFT算法

2.2 C语言FFT算法

  下面是在网络上博文 C++ Program to Compute Discrete Fourier Transform using Fast Fourier Transform Approach 给出的FFT算法, 没有对其功能进行测试。 相比于前面利用Python,Fortran来看, C语言实现FFT就显得非常啰嗦了。

#include <iostream>
#include <complex>
#include <cmath>
#include <iterator>
using namespace std;
unsigned int bitReverse(unsigned int x, int log2n) {int n = 0;int mask = 0x1;for (int i = 0; i < log2n; i++) {n <<= 1;n |= (x & 1);x >>= 1;}return n;
}
const double PI = 3.1415926536;
template<class Iter_T>
void fft(Iter_T a, Iter_T b, int log2n) {typedef typename iterator_traits<iter_t>::value_type complex;const complex J(0, 1);int n = 1 << log2n;for (unsigned int i = 0; i < n; ++i) {b[bitReverse(i, log2n)] = a[i];}for (int s = 1; s <= log2n; ++s)  {int m = 1 << s;int m2 = m >> 1;complex w(1, 0);complex wm = exp(-J * (PI / m2));for (int j = 0; j < m2; ++j) {for (int k = j; k < n; k += m) {complex t = w * b[k + m2];complex u = b[k];b[k] = u + t;b[k + m2] = u - t;}w *= wm;}}
}

 

 结 ※


  用FFT算法实现快速傅里叶变换, 在理论、工程中具有非常广泛的应用。 除了能够在合适的计算平台完成FFT算法,同时还需要注意到它在频谱分析中可能带来的频率混叠以及频率泄露等问题。


■ 相关文献链接:

  • The Fast Fourier Transform (FFT): Most Ingenious Algorithm Ever?
  • C++ Program to Compute Discrete Fourier Transform using Fast Fourier Transform Approach

● 相关图表链接:

  • 图1.2.1 利用Python语音实现的FFT算法测试结果
  • 图 Fortran 语言实现的FFT算法

http://chatgpt.dhexx.cn/article/eR1LpMxS.shtml

相关文章

STM32 FFT算法实现

DSP 库运行环境搭建 在 MDK 里面搭建 STM32F4 的 DSP 运行环境(使用.lib 方式)是很简单的&#xff0c;分为 3 个步骤&#xff1a; 1&#xff0c; 添加文件。 首先&#xff0c;我们在例程工程目录下新建&#xff1a;DSP_LIB 文件夹&#xff0c;存放我们将要添加的文件&#xff…

FFT算法解析

问题描述 两个n次多项式相乘,其时间复杂度为 O(n2) ,通过FFT来减小其问题的复杂度。 分析过程 FFT的基本思路是:我知道一个多项式表达式可以根据其表达式算出结果,同理我们也可以根据其结果算出表达式。对于A,B两个n次多项式,一共所有又2n+1个参数需要求解,我们至少需要…

FFT算法再学以及终于理解

前言 人生如逆旅&#xff0c;我亦是行人。 一、FFT FFT&#xff08;Fast Fourier Transformation&#xff09;&#xff0c;中文名快速傅里叶变换&#xff0c;用来 加速多项式乘法 &#xff0c;就是用来降低算法的时间复杂度的&#xff0c;将时间复杂度由原来的 O(n^2) 变为了O…

十分简明易懂的FFT(快速傅里叶变换)

FFT前言 快速傅里叶变换 (fast Fourier transform),即利用计算机计算离散傅里叶变换&#xff08;DFT)的高效、快速计算方法的统称&#xff0c;简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少&…

第四章快速傅里叶变换FFT

一、基2FFT算法 1.直接计算DFT的特点 对于N点DFT的乘法和加法运算次数均为N^2(运算量较大)减少运算量的基本途径&#xff1a;将N点DFT分解成多个较短的DFT旋转因子具有 周期性&#xff1a; 对称性&#xff1a;或又或者 2.时域抽取法基2FFT基本原理 分类&#xff1a;基2FFT分…

数学专题小结:FFT算法

快速傅里叶变换(FFT,Fast Fourier Transform)是信号处理的常用手段,可以把时域信号变成频域信号,时域的卷积运算对应于频域就成了简单的乘法运算。由于两个多项式的乘积,其系数的运算实际上也是一种卷积运算,因此可以用FFT来计算多项式的乘法。网上关于FFT算法的讲解大多…

转:fft算法(快速傅里叶变换算法)

FFT (Fast Fourier Transform) 是一种快速傅里叶变换算法。它是用来将一个信号从时域转换到频域的算法。这个算法通过分治策略&#xff0c;将一个长度为 N 的复数序列分解成 N/2 个长度为 2 的复数序列&#xff0c;然后对这些小的序列分别进行 FFT 计算。 最简单的 FFT 算法是暴…

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

前言 人生如逆旅&#xff0c;我亦是行人。 一、介绍 算法的世界多么广大&#xff0c;我们可以将算法大致分为两类&#xff1a; 第一类是较为有用的算法&#xff1a;比如一些经典的图算法&#xff0c;像 DFS 和 BFS&#xff08;深度 / 广度优先算法&#xff09;&#xff0c;这些…

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

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

怎么计算网站流量?

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

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

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

流量计算器

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

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

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

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

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

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

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

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

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

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

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

物联网GPRS模块流量计算

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

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

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

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

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