前言
傅里叶变换能将信号的时域变换到频域。在频域中,系统响应等于信号与系统传函的频域相乘(时域上是卷积)。相比于直接在时域做卷积,先进行傅里叶变换,再在频域相乘,最后通过逆傅里叶变换反变换回来的步骤看似更长,但在工程技术上却相对容易实现。
传统的傅里叶变换属于工程数学范畴,主要针对连续时间信号。离散傅里叶变换(DFT)针对离散时间信号。DFT 算法时间复杂度为 O(n^2),快速傅里叶变换(FFT)将其优化至 O(nlogn)。
本文主要介绍在 FPGA 中实现 FFT 对信号进行时域 - 频域的变换,并采集基波频率的方案。
一、原理与目的
1. 傅里叶变换
傅里叶变换是将任意信号通过多种不同频率的正弦信号叠加而成。不同频率的正弦信号不仅有不同的频率,还有对应的幅值,通过频率与幅值的一一对应,就能得到任意信号的幅频特性曲线。
2. 快速傅里叶变换
在傅里叶变换的基础上加入了对离散时间信号的应用,即离散傅里叶变换;对离散傅里叶变换的算法进行优化,得到了快速傅里叶变换(FFT)。
FFT 的核心是蝶形运算和旋转因子。这里以基 2 的 8 点 FFT 为例,注意事项包括时域抽取和频域抽取的关系是在单向运算中的两种不同的运算方法。重点关注二进制逆序排列的操作。

3. 目的
本文的目的是学会配置 FFT,并知道如何获取频谱数据,并利用频谱数据进行后续的操作。
二、配置 FFT
在 IP Catalog 中搜索 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(爆发)等。由于对内存理解程度不够,选择最直接的流水线输入方式(Streaming)。这种输入方式会占用较高的资源但运算速度快。
选择了 Streaming 以后,Input Order 和 Output Order(输入输出格式)只能选择 Nature(自然数)了。
3. Data and Twiddle
Representation(表示):Fixed Point(固定点)、Single Floating Point(单浮点)、Block Floating Point(块浮点)。Block Floating Point 是大部分 FFT 模块芯片的配置选择。
Data Input Width(数据输入宽度):位宽越宽,数据的精度就越高。Twiddle Width(旋转因子宽度):位宽越宽代表了其值的精度。
三、实例化
对配置好的 FFT 模块生成 HDL 工作,确认模块引脚。

如上配置的 FFT 的实例化需要分成 3 个步骤,即前期的数据准备、芯片接入、后期数据处理。


