这里以一个8点FFT设计为例作为介绍,整体电路架构如下图(可点击放大看),实现了一个数据串行输入,结果并行输出的FFT算法(data_in_real为输入值的实部,data_in_img为虚部):

上图架构是不是跟8点基2频率抽取FFT算法的蝶形运算框图(如下图)很相像:

因此结果很明了,最右边第一个模块one_stage_1实现第一级输出的4个蝶形运算,每个对应的蝶形运算如下:

这四个蝶形运算对应输出八个结果,分别送到one_stage_21,one_stage_22。也就是对应第二级的上下两个蝶形运算。

one_stage_21,one_stage_22又分别会有四个运算结果出来,两两被送到最后一级蝶形运算,由四个蝶形运算单元组成,分别为one_stage_31,one_stage32,one_stage33,one_stage_34。

每级单元的one_stage具体实现如下框架所示:

buffer_inst存储本级将要做蝶形运算的数据,比如one_stage_1里面的buffer_inst将会获取原始输入数据; one_stage_21,one_stage_22,one_stage_31,one_stage32,one_stage33,one_stage_34的buffer_inst里面将存取上一级相应的运算的结果。各级之间的握手信号为in_valid和o_valid。当每级拿到了完整的待计算数据之后,相应的o_valid就会被拉高,以告知下一级开始取数据,当本级运算结束,o_valid信号拉低。

w_coef_inst里面存的是蝶形运算的旋转因子,目前是作为9位有符号数来存储的,即将旋转因子扩大了255倍之后只保留整数位(原本旋转因子的范围在-1~1之间),也就是低8位表示的是小数点后的数。

实现如下:

addr为其旋转因子寻址信号。

目前的蝶形运算实现单元如下arithmetic_unit_inst(日后可能会做改进):

由于输入数据为24位的有符号定点数(低八位为小数),而蝶形运算因子为9位的,所以对于有符号数运算先要对蝶形运算因子做符号位扩展(原因见《有符号数单元加法器设计要点》),使其变为24位数据(c,d即符号位扩展后的蝶形运算因子),实现如下:

每个蝶形运算:

得第一个输出的计算代码如下(后缀real代表实部,img代表虚部,a_real,a_img 分别代表x(n)这个输入的实部和虚部;b_real,b_img分别代表x(n+N/2)这个输入的实部和虚部):

第二个输出(d_o2_real,d_02_img)计算代码如下:

(这里是直接用了 "*" 来做乘法运算,FPGA会直接综合成DSP里面的乘法模块,后面我们将会使用自己设计的乘法器来替换,那时候我们对数字信号运算电路设计的理解就会更深了)

d_o2_real_full,d_02_img_full为输入数据与蝶形运算因子相乘之后的完整结果;

而蝶形运算因子被扩大了255倍,其低8位都是表示小数,同样输入的数据a_real,a_img,b_real,b_img为24位数据,其低8位也表示小数位。

因此8位小数位与8位小数位相乘,其结果的低16位都是表示小数位。

因此我们的输出d_o2_real,d_02_img只取了d_o2_real_full,d_02_img_full的高24位,把低8位直接舍弃掉了,也就相当于每级的蝶形运算把小数位舍掉了8位,只保留了8位小数位的精度。

即每级运算的精度只能达到 1/256 ,如果级数越多,那么累积的误差也就可能会更大。

输入的8个数据如下:

那么对应的实际的输入的实部与虚部为上面的值除以256

对应为:

下面是仿真结果:

可以看到仿真结果相应的最后一级的输出结果的十进制如上。

把上述结果除以256(即第八位表示小数),得相应的每级输出结果如下(real 表示实部,img表示虚部):

基2频率抽取实现FFT的Verilog程序相关推荐

  1. czt算法c语言实现,基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF).ppt

    基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF) 第四节基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF)(Sander-Tu ...

  2. 已知序列求蝶形运算_在N=32的基 2 时间抽取发 FFT 运算流图中,从 到 需______级蝶形运算过程。 (4.0分)_学小易找答案...

    [单选题]互相关函数性质正确的是: [计算题]两个有限长的复序列 x[n] 和 h[n] ,其长度分别为 N 和 M ,设两序列的线性卷积为 y[n]=x[n]*h[n] ,回答下列问题: (1) 序 ...

  3. 如何利用FFT(基2时间以及基2频率)信号流图求序列的DFT

    直接用两个例子作为模板说明: 利用基2时间抽取的FFT流图计算序列的DFT 1.按照序列x[k]序号的偶奇分解为x[k]和x2[k],即x1[k]={1,1,2,1}, x2[k]={-1,-1,1, ...

  4. 基2FFT算法matlab程序编写,频率抽取(DIF)基2FFT算法的MATLAB实现

    频率抽取(DIF)基2FFT算法和时间抽取(DIT)基2FFT算法是两种等价的FFT算法,其相同之处: (1)DIF与DIT两种算法均为原位运算. (2)DIF与DIT运算量相同. 不同之处: (1) ...

  5. 傅里叶变换 ~ 基 2 时间抽取 FFT 算法

    文章目录 1.基2时间抽取FFT算法原理 2.基2时间抽取FFT算法流图 2.1.示例1 ~ 4点的序列表示成两个2点的DFT 2.2.示例2 ~ 8点的序列表示成两个2点的DFT 2.3.实例演示 ...

  6. matlab中xtem,快速傅里叶变换_蝶形运算_按频率抽取基2-fft算法_MATLAB代码

    function y=MyFFT_FB(x,n) %MYFFT_TB:My Fast Fourier Transform Frequency Based %按频率抽取基2-fft算法 %input: ...

  7. fft 估计载波频率程序_一种适用于MPSK解调的快速精确频率同步方法与流程

    本发明涉及MPSK信号解调的频率同步技术,特别涉及一种适用于MPSK解调的快速精确频率同步方法. 背景技术: 在无线数字通信系统中,载波频率偏移是影响系统解调性能指标的重要因素,为了降低误码率,提高通 ...

  8. fft 估计载波频率程序_fft频率估计

    在高动态环境中,由于载波多普勒频移和收发端时钟漂移等因素的存在,直扩接收机必须通过载波同步才能在接收端消除频差并重构载波相位,以实现相干解调.在传统的载波同步技术中,锁频环具有较大的捕获带宽但频率跟踪 ...

  9. fft 估计载波频率程序_载波同步算法程序 -

    5.2.1 载波频偏的捕获 A.前导序列估计 由于发送端和接收端载波频率的不同,每一个采样信号在时间t时包含一个未知的相位因素ej2??fct,这里?fc指的是未知的载波频偏.这个未知的相位因素在接收 ...

最新文章

  1. ubuntu如何修改字符集编码
  2. Cisco交换机的经典配置(4)
  3. c++ :MFC 如何遍历窗口同类型控件ID
  4. matlab如何添加度,matlab里的模糊工具箱绘制隶属度函数曲线导入到word的方法
  5. leetcode557. 反转字符串中的单词 III
  6. ElasticSearch的update_by_query使用
  7. PHP代码重用与函数编写
  8. Gentoo安装MarkDown编辑器Haroopad
  9. 82_Linux检测指定ip指定端口是否开放
  10. as常用固定搭配_英语常用固定搭配
  11. 什么叫云服务器?云服务器的概念及优势
  12. android 定时打开app,如何 定时启动你的Android App
  13. 写给区块链初创者的一封信
  14. Java集合框架——List接口
  15. 跟小博老师一起学习MyBatis ——MyBatis搭建运行环境
  16. 在Kubernetes上安装Netdata的方法
  17. 计算机编程入门课件,PPT课件大学计算机基础编程入门.ppt
  18. 微软「感谢你,Harry!」沈向洋23年后离职,继续职业生涯新篇章
  19. Google浏览器部分图片无法显示
  20. 0x3f3f3f3f知多少

热门文章

  1. ESP32串口转WiFi双天线ESP32-S模组
  2. 2021年春季学期-信号与系统-第五次作业参考答案-第七小题
  3. 华南赛区线上比赛安排
  4. 简述linux各个组成部分的定义及功能,Mariadb的架构及相关概念
  5. jwttoken解码_使用 JSON WEB TOKEN (jwt) 验证
  6. mysql 查询rowno_C# Mysql 查询 Rownum的解决方法
  7. 自定义变量 配置文件_「系统架构」Nginx调优之变量的使用(3)
  8. nginx lua连接mysql_OpenResty的安装和在nginx中使用lua直接访问mysql达到数据接口的统一...
  9. 递归和函数栈与setjmp和longjmp的关系
  10. linux 卸载模块命令,Linux中module模块的编译、加载、卸载