基于FPGA的快速傅里叶变换加速(一)

本文详细介绍了快速傅里叶变换(FFT)的基本原理和C++实现,包括递归方法和位逆序置换。通过分治策略,FFT将计算复杂度降低到O(nlogn)。此外,还提供了64点FFT的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项的多项式
源自OI-Wiki
在这里插入图片描述

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
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生如昭诩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值