前言
傅里叶变换能将信号的时域变换到频域。在频域中,系统响应等于信号与系统传函的频域相乘,相比于直接在时域做卷积,先进行傅里叶变换再相乘最后逆变换的步骤看似复杂,但在工程技术上更易实现。
传统的傅里叶变换针对连续时间信号,而离散傅里叶变换(DFT)适用于工程采样。DFT 算法时间复杂度较高,快速傅里叶变换(FFT)将其优化至 O(nlogn)。本文主要介绍在 FPGA 中实现快速傅里叶变换以进行时域 - 频域变换及基波频率采集的方案。
一、原理与目的
1. 傅里叶变换
傅里叶变换是将任意信号通过多种不同频率的正弦信号叠加而成。不同频率的正弦信号不仅有不同的频率,还有不同频率对应的幅值,通过频率与幅值的一一对应,就能得到任意信号的幅频特性曲线。
2. 快速傅里叶变换
在傅里叶变换的基础上加入了对离散时间信号的应用,即离散傅里叶变换;对离散傅里叶变换的算法进行优化,得到了快速傅里叶变换(FFT)。
FFT 的核心是蝶形运算和旋转因子。这里使用基 2 的 8 点 FFT 进行讲解,注意事项包括时域抽取和频域抽取的关系是在单向运算中的两种不同的运算方法。重点关注一下二进制逆序排列的操作,时域抽取、频域抽取上哪里需要进行二进制的逆序排列等。
3. 目的
本文的目的是学会配置 FFT,并知道如何获取频谱数据,并利用频谱数据进行后续的操作。
二、配置 FFT
在 IP Catalog 中搜索 FFT,双击跳出来的唯一的 FFT 选项,对其进行命名。
可以看到,FFT 的 IP 配置界面相比于 NCO 和 PLL 的界面就比较整洁,我们还是从上到下的顺序来解读每个选项。
1. Transform
Transform(变换)这里是对快速傅里叶变换(FFT)的简写,也就是对 FFT 本身进行配置。
Length(长度)这里的长度也就是数字信号处理里常说的 N 点 FFT。这个 N 的大小与采样频率 Fs 和频率分辨率 dF 之间的关系是 dF = Fs / N。由此不难看出,N 越大,FFT 得到的频谱的频率分辨率越高;采样频率 Fs 越大,FFT 得到的频谱的频率分辨率越低。由于现在通信频率的逐渐升高,为保证采样的完整性(假设奈奎斯特采样),Fs 也一定越来越高,导致在需要相同的频谱频率分辨率的条件下,N 也就需要的越大,即 FFT 的长度越长。之前的资源问题中提到:FFT 的长度越长,占用 FFT 的资源也就会越大。因此我们需要合理的选择 FFT 的长度,这里考虑到 FPGA 资源的问题,选用了 1024 点 FFT。
Direction(方向)这里的方向指的是 FFT 的运算方向,即从时域变换到频域的正向 FFT(Forward)、从频域变换到时域的 FFT 逆变换(Reverse)和正向反向的双向变换(Bi-directional)。这里选择了双向变换。
2. I/O
Data Flow(数据流)代表选择需要 FFT 的模块芯片的数据输入方式,不同的数据输入方式自然也是应对各种方面的情况,包括具有高速性的 Streaming(流水线)、具有低资源占用的 Burst(爆发),中间的 Variable Streaming(多种流水线)和 Buffered Burst(缓冲爆发)分别居中,但前者更加贴近 Streaming,后者更加贴近 Buffered Burst。
由于对内存的理解程度不够高,运用的自然就不是那么好,因此就选择最直接的流水线的输入方式。这种输入方式会占用较高的资源但是架不住它的运算速度是真的快,输入了一个周期的数据之后,下一个周期就能输出数据了。
选择了 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 在 Single Floating Point 上把独立指数(权)动态变成了一个公共的、仍能保证数据有效的值,属于 Fixed Point 和 Single Floating Point 的中间选项,也是大部分 FFT 模块芯片的配置选择。
Data Input Width(数据输入宽度)这个应该大家也都明白,代表着输入数据的位宽,位宽越宽,数据的精度就越高。Twiddle Width(旋转因子宽度)这个旋转因子就是我在上文手写的理论计算方法里的旋转因子,是一个模长等于 1 的复数,因此位宽越宽也同样代表了其值的精度。
三、实例化
对配置好的 FFT 模块芯片进行生成 HDL 工作,再确认一下模块芯片的引脚。
如上配置的 FFT 的实例化需要分成 3 个步骤,即前期的数据准备、芯片接入、后期数据处理。这里先讲芯片的接入,再将其前后的支持部分。

