使用python手写FFT算法

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

FFT(Fast Fourier Transform) 是 DFT(Discrete Fourier Transform)的快读实现,它在机理上没有改变DFT的算法,只是在实现上采用的巧妙的实现。 使 O ( N 2 ) O(N^2) O(N2)的实现变成了 O ( N l o g 2 N ) O(Nlog_2N) O(Nlog2N)的实现,优化算法的复杂度。

DFT 公式

DFT的公式我们先简单回忆一下:

DFT公式

DFT的python实现

def dft(x):x = np.asarray(x, dtype=float)N = x.shape[0]n = np.arange(N)k = n.reshape((N, 1))M = np.exp(-2j * np.pi * k * n / N)return np.dot(M, x)x = np.random.random(1024)
np.allclose(dft(x), np.fft.fft(x))

FFT的思想其实分而治之,将整个DFT安装奇偶来分开计算

FFT之奇偶分治

首先根据DFT公式,将x分为odd(奇数),下标用2r+1表示;和even(偶数)下标用2r表示
X k = ∑ n = 0 N − 1 x n e − j 2 π k n N = ∑ n = 0 N 2 − 1 x 2 r + 1 e − j 2 π k ( 2 r + 1 ) N + ∑ n = 0 N 2 − 1 x 2 r e − j 2 π k ( 2 r ) N = ∑ n = 0 N 2 − 1 x 2 r + 1 e − j 4 π k r N e − j 2 π k N + ∑ n = 0 N 2 − 1 x 2 r e − j 4 π k r N = ∑ n = 0 N 2 − 1 x 2 r + 1 e − j 2 π k r N / 2 e − j 2 π k N + ∑ n = 0 N 2 − 1 x 2 r e − j 2 π k r N / 2 = e − j 2 π k N X o d d + X e v e n X_k = \sum_{n=0}^{N-1} x_n e^{\frac{-j2{\pi}kn}{N}} \newline = \sum_{n=0}^{\frac{N}{2}-1} x_{2r+1} e^{\frac{-j2{\pi}k(2r+1)}{N}} + \sum_{n=0}^{\frac{N}{2}-1} x_{2r} e^{\frac{-j2{\pi}k(2r)}{N}} \newline = \sum_{n=0}^{\frac{N}{2}-1} x_{2r+1} e^{\frac{-j4{\pi}kr}{N}} e^{\frac{-j2{\pi}k}{N}} + \sum_{n=0}^{\frac{N}{2}-1} x_{2r} e^{\frac{-j4{\pi}kr}{N}} \newline = \sum_{n=0}^{\frac{N}{2}-1} x_{2r+1} e^{\frac{-j2{\pi}kr}{N/2}} e^{\frac{-j2{\pi}k}{N}} + \sum_{n=0}^{\frac{N}{2}-1} x_{2r} e^{\frac{-j{2\pi}kr}{N/2}} \newline = e^{\frac{-j2{\pi}k}{N}} X_{odd} + X_{even} Xk=n=0N1xneNj2πkn=n=02N1x2r+1eNj2πk(2r+1)+n=02N1x2reNj2πk(2r)=n=02N1x2r+1eNj4πkreNj2πk+n=02N1x2reNj4πkr=n=02N1x2r+1eN/2j2πkreNj2πk+n=02N1x2reN/2j2πkr=eNj2πkXodd+Xeven

python实现

1. 根据奇偶分治和迭代的方式实现

def fft(x):x = np.asarray(x, dtype=float)N = x.shape[0]if N % 2 > 0:raise ValueError("must be a power of 2")elif N <= 2:return dft(x)else:X_even = fft(x[::2])X_odd = fft(x[1::2])terms = np.exp(-2j * np.pi * np.arange(N) / N)return np.concatenate([X_even + terms[:int(N/2)] * X_odd,X_even + terms[int(N/2):] * X_odd])
x = np.random.random(1024)
np.allclose(fft(x), np.fft.fft(x))

2. 使用矩阵运算加速

def fft_v(x):x = np.asarray(x, dtype=float)N = x.shape[0]if np.log2(N) % 1 > 0:raise ValueError("must be a power of 2")N_min = min(N, 2)n = np.arange(N_min)k = n[:, None]M = np.exp(-2j * np.pi * n * k / N_min)X = np.dot(M, x.reshape((N_min, -1)))while X.shape[0] < N:X_even = X[:, :int(X.shape[1] / 2)]X_odd = X[:, int(X.shape[1] / 2):]terms = np.exp(-1j * np.pi * np.arange(X.shape[0])/ X.shape[0])[:, None]X = np.vstack([X_even + terms * X_odd,X_even - terms * X_odd])
return X.ravel()

参考文档 How to implement the Fast Fourier Transform algorithm in Python from scratch


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

相关文章

C语言实现FFT算法

C语言实现FFT算法 fft1d.c和fft1d.h见https://download.csdn.net/download/weixin_43216875/12009644 1 fft1d.h #ifndef FFT1D_H #define FFT1D_H#include "math.h"#define PI 3.1415926535897932384626433832795028841971typedef struct complex //复数类型 {flo…

Matlab实现DITFFT算法

这段时间刚好在学习数字信号处理的快速傅立叶变换&#xff0c;也刚好应着老师布置的作业用matlab实现N点的FFT。 方法也是采用教科书上的DITFFT&#xff0c;当然关键也就是分治的思想&#xff0c;分成奇偶序列&#xff0c;再观察旋转因子和步长的不同来编写算法 该算法首先的部…

FFT算法的C语言实现

FFT算法的C语言实现 &#xff1a;数字信号处理 需要注意的几个点 #mermaid-svg-Q0Cv61uzu3GVxhM0 .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .label text{fill:#333}#mer…

优雅的FFT算法

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

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的开发环境为例详细讲解算法的实现原理和注意事项同时给出算法的优化方法。受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢…