数字信号处理——FFT运算模块设计(1)




目录​​​​​​​

引言

FFT理论

基2 DIT-FFT 算法

基于FPGA的设计方法分析

数据存储分析

顺序与倒序

R2 DIT-FFT算法特点

同址运算

蝶形运算独立性

蝶形运算的间距变化规律

旋转因子变化规律

FFT处理器分析

参考声明



引言

FFT,DFT的快速算法,在如今数字信号处理领域有着重要的应用。XILINX 有自己的IP CORE 产品:Fast Fourier Transform (9.1),之前有一个付费专栏中的其中一篇博文着重介绍了该IP CORE的配置使用。链接:

FFT IP核 使用教程 (源码)https://blog.csdn.net/qq_43045275/article/details/120287088但是 IP CORE 毕竟只是人家的,我还是一无所有。想自己从原理出发,自己写一个FFT运算模块。所以就有了这个博客系列。

本文主要介绍 FFT算法的理论 以及 FFT运算模块在FPGA实现时用到的结构。后续博文会给出具体详细的设计、仿真源码。


FFT理论

众所周知,FFT是DFT的快速算法,本质还是DFT的计算。序列X【n】的DFT X【k】为:

数字信号处理——FFT运算模块设计(1)_第1张图片

直接计算X【k】的运算量过大,需要4*N^2 次实数乘法,N(4N-2)次实数加法。可以利用旋转因子的对称性和周期性来降低运算量:

数字信号处理——FFT运算模块设计(1)_第2张图片

基2 DIT-FFT 算法

按时间抽取的基2FFT算法,基本思想就是将DFT计算的过程按照时间将序列分成奇偶各一半,进行DFT计算。具体的推导过程就不再赘述,不了解的可以看下参考【1】。此处直接给出结论:

数字信号处理——FFT运算模块设计(1)_第3张图片

其中,G【k】是原序列偶数点的N/2点DFT,H【k】是原序列奇数点的N/2点DFT。其对应的蝶形结构:

数字信号处理——FFT运算模块设计(1)_第4张图片

以16点序列的FFT为例,其结果可以由2个8点的FFT组合算出,而1个8点FFT又可以由2个4点FFT组合算出,1个4点的FFT可以由2个2点的FFT组合算出。即,不论是几点的FFT,其结果都可以由最基本的2点FFT计算得出。而最基本的两点FFT的蝶形:

数字信号处理——FFT运算模块设计(1)_第5张图片

以 8 点FFT为例,其蝶形结构(信号流图):

数字信号处理——FFT运算模块设计(1)_第6张图片

基于FPGA的设计方法分析

数据存储分析

每一个蝶形运算需要两个输入数据和一个旋转因子,这三个数据是要同时给到的。因此,需要3个RAM来存储对应的运算数据。以8点FFT运算为例,旋转因子有4个(即需要),输入数据一共为8个,分两路并行RAM存储,则需要深度为4的两个RAM。即,总的需要3个深度为4的RAM来存储操作数和运算结果(同址运算)。

顺序与倒序

其实不论是DIT-FFT还是DIF-FFT都可以选择顺序输入或是倒序输入,而输出就刚好反过来。但是一般我们的使用都会要求输出计算结果为顺序。那么就要求蝶形运算的第一级输入数据必须为倒序输入。即如上图所示。(以8点FFT为例)

那这样的话就剩下一个问题,待运算序列在存入RAM时按照顺序地址输入就要按照倒序地址读出,如果按照倒序地址存入就要按照顺序地址读出。当然了,这两种思路都可以没啥问题,本文就按照后者进行后面的介绍,即倒序地址存入,顺序地址读出。

此处可以用计数器对时间轴进行计数,0-7,然后在存入时将计数器的数值倒序后,作为RAM存入的地址进行写入,然后读出时就按照顺序地址计数进行读取。

R2 DIT-FFT算法特点

同址运算

每一级蝶形运算的运算结果仍然存储在与输入数据相同的地址空间。从信号的信号流图中就可以清晰地看到,每条信号流图的支路都是和输入数据在一条直线上。

蝶形运算独立性

1、每个蝶形运算的输入数据仅仅对本次蝶形运算有效,不受其他蝶形运算的影响。

2、同一级的蝶形运算没有先后之分。

蝶形运算的间距变化规律

每级蝶形运算的两个输入端地址距离都相同,不同级之间的变化关系:

D=2^{p}

p为蝶形运算的级数,取值范围:0~log2N

旋转因子变化规律

第k级蝶形运算,对应存在2^k个旋转因子。k为蝶形运算的级数,取值范围:0~log2N

FFT处理器分析

以8点序列FFT为例进行分析。

旋转因子按照如下的顺序存放:

各级操作数按地址的取用规律:

数字信号处理——FFT运算模块设计(1)_第7张图片

 按照上面讲到的,蝶形运算具有独立性,同一级的蝶形运算顺序没有先后之分,因此可以对旋转因子的取用稍做如下改动,减少RAM的读取次数:

数字信号处理——FFT运算模块设计(1)_第8张图片

 对于16点FFT运算:

数字信号处理——FFT运算模块设计(1)_第9张图片

上图同颜色(地址)的旋转因子可以在一起操作,减小RAM的读取频率。

由于蝶形运算同时需要两个输入数据,这就需要从两个不同的地址空间取数,也就需要预先将Ⅳ个数据存入两个不同的单端口RAM 中,每个RAM有N/2个数据。对于8点FFT,数据按照时间顺序送入,存储的地址规律:

 两个RAM的存储地址生成:

数字信号处理——FFT运算模块设计(1)_第10张图片

 两个RAM存储数据的情况:

数字信号处理——FFT运算模块设计(1)_第11张图片

FFT运算过程中,数据和地址变化规律:

数字信号处理——FFT运算模块设计(1)_第12张图片

 操作数地址变化规律:

数字信号处理——FFT运算模块设计(1)_第13张图片

 旋转因子的地址变化:

算法流程:

数字信号处理——FFT运算模块设计(1)_第14张图片

 

文献【2】给出了基于FPGA的FFT设计思路(FSM)

状态编码:

数字信号处理——FFT运算模块设计(1)_第15张图片

信号说明:

数字信号处理——FFT运算模块设计(1)_第16张图片

状态转移图:

数字信号处理——FFT运算模块设计(1)_第17张图片


后续文章,也将参考这种思路进行实现,可能具体的实现细节有所不同。 


参考声明

【1】钱玲,谷亚林,王海青.数字信号处理.北京:电子工业出版社,2018.

【2】高亚军.基于FPGA的数字信号处理.(部分图片取自或参考该文献)

 

你可能感兴趣的:(基于FPGA的数字信号处理设计,FFT,FPGA)