首页
学习
活动
专区
工具
TVP
发布

基2频率抽取FFT实现-16点

代码的改进后的详细介绍;端口参数实现电路配置;基于8点的FFT结构扩展到16点FFT

01

设计概述

文章《

基2频率抽取FFT算法实现-软件篇

》讲述了基2频率抽取FFT算法的python实现,主要了解如何获取蝶形运算因子。

文章《基2频率抽取FFT算法实现-verilog篇2》以8点基2频率抽取FFT算法为例讲述了其verilog实现。主要需要注意的点如有符号数加法运算,有符号数乘法运算,以及带有小数运算的时候,在数字电路里面的处理方式。

这里不再讨论上述问题,这里讨论如何根据前面设计的基本模块通过参数配置实现16点的FFT算法。

可知16点的FFT蝶形运算有4级,整体结构如下所示。

注意这里的输出结果是蝶形运算最后一级的输出结果,与真正的FFT最后的输出之间的排序是不一致的,他们之间的关系为倒序,具体关系说明见文章《基2频率抽取FFT算法实现-软件篇》。

可以看到每级都只是由one_stage这个电路模块实现,其结构如下。

包含有buffer, w_coef, arithmetic_unit三个模块。

one_stage模块端口如下,DEPTH表示运算的数据量,STAGE_NUM表示处于第几级。

buffer模块实现获取本单元蝶形运算所需的数据。in_valid信号表示输入的数据有效,当数据获取完整则o_valid拉高,进行输出送到arithmetic_unit模块做相应的运算。buffer模块可配置的参数如下:

WIDTH_A:表示地址位宽,如16点的就是2^4,则WIDTH=4。

DEPTH:表示本单元运算需要的数据个数,如16点FFT第一级只有一个单元,有16个数据做蝶形运算。其配置如下

buffer有两个输出(a_real,a_img,b_real,b_img),对应蝶形运算的两个数据x(n),x(n+N/2)。

这里较上次做了个改进,当输入的数据量达到了 DEPTH/2就可以开始做蝶形运算了。如对于第一级,当输入的数据达到了9个时就可以开始做第一个蝶形运算了,此时就可将o_valid拉高。

w_coef模块如下:

其中addr为对蝶形运算因子选择的地址。

如16点的FFTT,第一级运算对应需要的蝶形运算因子为

第二级运算对应需要的蝶形运算因子为

以此类推故其寻址实现如下:

02

仿真结果

verilog设计的仿真结果(蝶形运算最后一级的输出结果):

python代码实现的结果,(蝶形运算最后一级的输出结果),代码见《基2频率抽取FFT算法实现-软件篇》:

实数部分结果:

虚数部分结果:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180608G00D4900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券