背景
傅里叶变换能将信号的时域变换到频域。在频域中,系统响应等于信号与系统传递函数的乘积,相比直接在时域做卷积,先进行傅里叶变换再相乘最后逆变换的步骤虽看似复杂,但在工程技术上更易实现。
传统的傅里叶变换针对连续时间信号,而工程上无法对信号进行连续采样,因此诞生了离散傅里叶变换(DFT)。由于 DFT 算法时间复杂度为 O(n^2),优化后的快速傅里叶变换(FFT)将其降至 O(nlogn)。
本文主要介绍在 FPGA 中利用 IP 核实现 FFT 的方法,包括原理简述、IP 配置、实例化及数据处理。
一、原理与目的
1. 傅里叶变换
傅里叶变换将任意信号通过多种不同频率的正弦信号叠加而成。不同频率对应不同的幅值,通过频率与幅值的一一对应,得到任意信号的幅频特性曲线。
2. 快速傅里叶变换
在傅里叶变换基础上加入离散时间信号应用即为离散傅里叶变换;对其算法优化得到快速傅里叶变换(FFT)。FFT 的核心是蝶形运算和旋转因子。以基 2 的 N 点 FFT 为例,需注意时域抽取和频域抽取的关系,重点关注二进制逆序排列的操作。

3. 目的
学会配置 FFT 模块,获取频谱数据,并利用频谱数据进行后续操作。
二、配置 FFT
在 IP Catalog 中搜索 FFT,双击选项进行命名。FFT 的 IP 配置界面相对整洁,从上到下解读每个选项:
1. Transform
- Length(长度):即 N 点 FFT。N 的大小与采样频率 Fs 和频率分辨率 dF 的关系为 dF = Fs / N。N 越大,频率分辨率越高,但占用资源也越大。根据 FPGA 资源情况,此处选用 1024 点 FFT。
- Direction(方向):指运算方向,包括正向 FFT(Forward)、逆向 FFT(Reverse)和双向变换(Bi-directional)。此处选择双向变换。
2. I/O
- Data Flow(数据流):代表芯片的数据输入方式。包括 Streaming(流水线)、Burst(爆发)、Variable Streaming 和 Buffered Burst。Streaming 输入方式占用较高资源但运算速度快,输入一个周期数据后下一个周期即可输出。此处选择 Streaming 模式。
- Input Order/Output Order:选择 Nature(自然数)。
3. Data and Twiddle
- Representation(表示):Fixed Point(固定点)、Single Floating Point(单浮点)、Block Floating Point(块浮点)。Fixed Point 资源消耗最低但有溢出风险;Single Floating Point 资源占用较多;Block Floating Point 介于两者之间,是大部分 FFT 模块的配置选择。
- Data Input Width/Twiddle Width:位宽越宽,精度越高。
三、实例化
生成 HDL 工作并确认引脚。实例化分为前期数据准备、芯片接入、后期数据处理三个步骤。
1. 芯片接入
- clk/reset_n:时钟信号和低电平复位信号。
- inverse:0 代表 FFT 正变换,1 代表逆变换。
- sink_valid:直接输入 1。
- sink_ready:芯片给外部发出可以输入信号的'准备好了'信号。
- sink_error:直接输入 2'b00。高电平代表引脚功能生效(数据错误),不进行运算。


