前言
傅里叶变换能将信号从时域转换到频域。在频域中,系统响应等于信号与系统传递函数的乘积,这比直接在时域进行卷积运算更容易实现。传统的傅里叶变换针对连续时间信号,而工程实践中只能对离散信号采样,因此诞生了离散傅里叶变换(DFT)。由于 DFT 算法的时间复杂度为 O(n^2),计算量过大,快速傅里叶变换(FFT)将其优化至 O(nlogn),成为数字信号处理中的核心算法。
本文重点介绍如何在 FPGA 中利用 IP 核实现 FFT,完成时域到频域的变换及基波频率采集。虽然原理部分较为经典,但实际工程调试中涉及到的参数配置、数据流控制及资源权衡往往容易被忽视,以下结合实战经验分享具体方案。
一、原理与目的
1. 傅里叶变换基础
傅里叶变换将任意信号分解为不同频率正弦信号的叠加。通过频率与幅值的对应关系,可以得到信号的幅频特性曲线。加入离散时间信号应用后即为离散傅里叶变换(DFT),在此基础上优化算法得到快速傅里叶变换(FFT)。
FFT 的核心在于蝶形运算和旋转因子。常见的实现方式有时域抽取(DIT)和频域抽取(DIF),两者在单向运算中互为逆序排列。重点关注二进制逆序排列的操作时机,这是确保 FFT 正确性的关键。
2. 实现目的
本文旨在说明如何配置 FFT IP 核,获取频谱数据,并利用这些数据进行后续的信号分析操作。
二、配置 FFT IP 核
在 IP Catalog 中搜索 FFT,双击进入配置界面。相比 NCO 或 PLL,FFT 的配置选项更为集中,建议按从上到下的顺序逐项调整。
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 模式。虽然资源消耗较高,但运算速度极快,且 Input Order 和 Output Order 通常固定为 Nature(自然数)。
3. Data and Twiddle(数据精度)
- Representation(表示方式):
- Fixed Point(定点):资源消耗最低,但存在溢出风险。
- Single Floating Point(单浮点):精度高,资源占用多。
- Block Floating Point(块浮点):折中方案,动态公共指数,兼顾精度与资源,是大多数 FFT 模块的默认推荐。
- Width(位宽):Data Input Width 决定输入精度,Twiddle Width 决定旋转因子精度。位宽越宽,数值表示越精确。
三、实例化与连接
生成 HDL 文件后,确认模块引脚定义。实例化过程可分为数据准备、芯片接入、数据处理三个阶段。
1. 芯片接入
- clk / reset_n:标准时钟与低电平复位信号。
- inverse:0 代表正变换,1 代表逆变换。
- sink_valid:直接置 1,表示始终有有效数据输入(部分模块需配合 ready 握手)。
- sink_ready:芯片反馈外部是否可以继续输入数据的信号。
- sink_error:输入 2'b00。高低位分别代表实部和虚部校验,高电平表示错误,不进行运算。

