快速入门 FFT
本文适合不想完全了解 FFT 原理不过想实现 FFT 算法的人
FFT 简介
FFT 也就是常说的快速傅里叶变换,其实本质上和傅里叶变换没有什么不同,也就是通过算法减少了一些乘法和加法的运算;DFT 的时间复杂度是 N² 级别的,而 FFT 的却是对数级别的复杂度,从而在 FFT 在数据量大的时候运算时间并不会高太多,这就使得 FFT 具有了在工程上的使用价值
FFT 算法简介

上面这张图是来自维基的介绍,简单来说的话,FFT 将数据按照索引地址按奇数和偶数分为两半,这两半数据还可以继续抽取,直到最后分解为单独的数据;然后利用了单位根的一些特性,减少了一些乘加步骤
但是顺序输入的数据,最后得到的结果是乱序的;为了得到顺序的输出,一般我们会将输入数据提前进行整理;因为 FFT 的输出索引地址会位反转,可以利用这个特性提前整理好输入数据,例如:输入 [1 2 3 4 5 6 7 8] 就整理为 [1 5 3 7 2 6 4 8]
FFT 第一个版本实现
最开始我为了能弄懂 FFT ,我就通过手算来了解 FFT 的过程,也就是通过上面那张图中的公式,一级级计算 FFT 的结果
最后根据手算的步骤实现了下面这个版本,其中单位根的复指数计算就直接手动计算完存表表了,在实现后发现只能够适用 4 个数的输入
import cmath
table = [1+0j,2+0j,3+0j,4+0j]
rotate_table = [1+0j,0-1j,-1+0j,0+1j]
result = []
N = 4
k = 0
r = 0
tmp = 0
while k < len(table):
while r < len(table)/2

本文为快速傅里叶变换(FFT)的入门教程,适用于希望实现FFT但不深入研究原理的读者。FFT是数字信号处理中的关键算法,通过特定方法减少了计算复杂度,由DFT的N²级别降低到对数级别。文中介绍了FFT的基本思想,包括数据的奇偶拆分和单位根特性,并展示了两个版本的Python实现,包括对输入数据的预处理以确保正确的输出顺序。尽管存在精度问题,但该实现为理解和应用FFT提供了一个起点。
最低0.47元/天 解锁文章
2166

被折叠的 条评论
为什么被折叠?



