基于FPGA的快速傅里叶变换加速(一) 基本原理介绍及C++代码实现
基本原理介绍及C++代码实现)
1. FFT的基本原理
1.1 离散傅里叶变换
介绍FFT之前需要首先介绍DFT(Discrete Fourier Transform),即离散傅里叶变换,是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其 DTFT 的频域采样。
1.2 快速傅里叶变换
1.2.1 概念
FFT(Fast Fourier Transform),是一种高效实现 DFT 的算法,它对傅里叶变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。快速数论变换 (NTT) 是快速傅里叶变换(FFT)在数论基础上的实现。
在 1965 年,Cooley 和 Tukey 发表了快速傅里叶变换算法。事实上 FFT 早在这之前就被发现过了,但是在当时现代计算机并未问世,人们没有意识到 FFT 的重要性。一些调查者认为 FFT 是由 Runge 和 König 在 1924 年发现的。但事实上高斯早在 1805 年就发明了这个算法,但一直没有发表。
1.2.2 基本思想
FFT 算法的基本思想是分治。就 DFT 来说,它分治地来求当 的时候 的值。他的分治思想体现在将多项式分为奇次项和偶次项处理。
举个例子,对于一共8项的多项式


2 两种C++代码实现
2.1 递归实现
代码实现方面,STL 提供了复数的模板,当然也可以手动实现。两者区别在于,使用 STL 的 complex 可以调用 exp 函数求出Wn。但事实上使用欧拉公式得到的虚数来求 Wn也是等价的。
#include <cmath>
#include <complex>
#define M_PI 3.14159265358979323846
// M_PI是C++自带宏,如果报错则加上上面一行即可
typedef std::complex<double> Comp; // STL complex
const Comp I(0, 1); // i
const int MAX_N = 1 << 20;
Comp tmp[MAX_N];
//这里是封装好的DFT函数,需要自行在main函数中调用
void DFT(Comp* f, int n, int rev)
{
// rev=1,DFT; rev=-1,IDFT
if (n == 1) return;
for (int i = 0; i < n; ++i)
tmp[i] = f[i];
for (int i = 0; i < n; ++i)
{ // 偶数放左边,奇数放右边
if (i & 1)
f[n / 2 + i / 2] = tmp[i];
else
f[i / 2] = tmp[i

本文详细介绍了快速傅里叶变换(FFT)的基本原理和C++实现,包括递归方法和位逆序置换。通过分治策略,FFT将计算复杂度降低到O(nlogn)。此外,还提供了64点FFT的C++代码实例,展示了如何进行分层蝶形运算。
最低0.47元/天 解锁文章
1483





