DFT在实际应用中非常重要,可以计算信号的频谱,功率谱和线性卷积等。

离散傅里叶变换的公式:

其中:

 称为旋转因子。

由欧拉公式可得:

直接按DFT变换进行计算,当序列长度N很大时,计算量非常大,所需的时间非常长。

FFT是 快速傅里叶变换。其算法原理这里不再赘述,网上资料或者相关书籍的介绍很多。主要分为按时间抽取法和按频率抽取法。

这里介绍按时间抽取的基2算法的硬件实现。

下面介绍的部分需要了解蝶形运算是什么,这里不做分析。

先来看一张16点的蝶形运算图:

第1级(第1列)每个蝶形的两节点“距离”为1,第2级每个蝶形的两节点“距离”为2,第3级每个蝶形的两节点“距离”为4,第4级每个蝶形的两节点“距离”为8。由此推得,第m级蝶形运算,每个蝶形的两节点“距离”L=2^(m-1)。

对于16点的FFT,第1级有8组蝶形,每组有1个蝶形;第2级有4组蝶形,每组有2个蝶形;第3级有2组蝶形,每组有4个蝶形;第4级有1组蝶形,每组有8个蝶形。由此可推出,对于N点的FFT,第m级有N/2L组蝶形,每组有L=2^(m-1)个蝶形。

从上图我们可以分析出左边输入端与右边输出端的顺序关系,用二进制表示为:

左边                                                      右边

0000                                                     0000

1000                                                     0001

0100                                                     0010

1100                                                     0011

0010                                                     0100

1010                                                     0101

0110                                                     0110

1110                                                      0111

0001                                                     1000

·······                                                      ·······

不难看出,右边的逆序正是左边的正序,利用这一点,可以事先将输入序列重新排序。

关于旋转因子,可以事先计算出来 ,由于FPGA不擅长做浮点运算,需要将计算出的旋转因子扩大2^n倍。然后以.mif的格式存放在FPGA片上ROM中。

关于输入序列的长度N,最好是2的整数次幂。

为了提高速度,可将FFT的输入序列存放在FPGA片上RAM中,所以在使用FFT的项目中,选取FPGA芯片时,要考虑片上RAM的容量。

将片上RAM设置为TRUE DPRAM,两个口读,两个口写,提高存取效率,实际使用中自有妙用。

根据上图的蝶形运算图,可以大致确定 FFT的计算量。

直接的DFT算法运算量:

N*N ,单位为复数乘法的时间MT;

使用FFT算法的运算量:

N/2*log2(N),单位为数乘法的时间MT;

算法运算量 比较:

根据蝶形运算图,可以将FPGA设计层级结构分为3层:

蝶形级数循环层,

蝶形组数循环层,

蝶形个数循环层。

复数乘法可直接使用FPGA片内自带的乘法器,注意数据位宽,谨防溢出。

另外,被乘数和乘数必须为原码,做乘法时必须考虑数据的正负符号问题。

设计加法器和减法器时,由于存在符号问题,包括正数+正数,正数+负数,负数+负数,以及正数-正数,正数-负数,负数-正数,负数-负数,这些判断操作非常繁琐,设计时格外注意数据的大小及正负。

这里我们可以将设计变的简单:

将输入到加法器和减法器的两个数据先转换为补码,然后做加法运算,输出时再将补码转换成原码即可。

为了节省资源,尽可能使用移位代替乘法和除法。为了提高速度,可在适当的地方加入流水线操作。

关于精度问题:由于FPGA不擅长做浮点运算,必然存在精度问题。

首先,对存入ROM的旋转因子进行了放大,引入精度问题。

然后,在旋转因子的乘法中,引入精度问题。

再后续旋转因子的还原中,也引入精度问题。

提高精度,一方面在放大旋转因子时,可以适当提高放大倍数,另一方面,旋转因子还原中,尽量把还原除法放在最后输出的地方。


版权所有权归卿萃科技 杭州FPGA事业部,转载请注明出处

作者:杭州卿萃科技ALIFPGA

原文地址:杭州卿萃科技FPGA极客空间 微信公众号


扫描二维码关注杭州卿萃科技FPGA极客空间


关于FFT的硬件实现的更多相关文章

  1. 关于硬件实现FFT逆运算

    前面的文章我们介绍了关于FFT的硬件实现.关于FFT的逆运算IFFT,其实就是将实现FFT的过程反过来执行就可以了. 在实现过程中要注意很多问题. 同 FFT一样,效率问题.以2048点为例,根据理论 ...

  2. 基于verilog的FFT算法8点12位硬件实现

    FFT算法8点12位硬件实现 (verilog) 1 一.功能描述: 1 二.设计结构: 2 三.设计模块介绍 3 1.蝶形运算(第一级) 3 2.矢量角度旋转(W) 4 3.CORDIC 结果处理 ...

  3. linux驱动程序设计的硬件基础,王明学learn

    linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...

  4. STM32F4使用FPU+DSP库进行FFT运算的测试过程一

    测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...

  5. 从Xilinx FFT IP核到OFDM

    笔者在校的科研任务,需要用FPGA搭建OFDM通信系统,而OFDM的核心即是IFFT和FFT运算,因此本文通过Xilinx FFT IP核的使用总结给大家开个头,详细内容可查看官方文档PG109.关于 ...

  6. 数字信号处理专题(3)——FFT运算初探

    一.前言 FFT运算是目前最常用的信号频谱分析算法.在本科学习数字信号处理这门课时一直在想:学这些东西有啥用?公式推来推去的,有实用价值么?到了研究生后期才知道,广义上的数字信号处理无处不在:手机等各 ...

  7. DSP28335做FFT傅里叶变换

    1. 看了一下例程,居然没有FFT的例程,难道这个DSP28335不能做FFT吗?对了C2000系列是有C2000 ware这个库的.方便很多,不过目前不确定在C5000上运行的FFT能直接迁移到DS ...

  8. 关于FFT提速

    前面的文章,我们对用硬件实现FFT做了简单介绍.前面文章我们使用的是控制器方式实现FFT,也就是说将一组数据放入FFT模块的RAM中,计算一次蝶形计算,完成后从RAM中读出数据继续计算. 以2048点 ...

  9. 义隆单片机学习笔记之(一) 硬件框架&资源下载

    参考网址: 点击链接或右键链接地址 (台湾义隆官网)http://www.emc.com.tw/chs/tech_8bit.asp (EM78P153K官方资料)http://www.emc.com. ...

随机推荐

  1. 由浅入深了解EventBus:(三)

    原理 EventBus的核心工作机制如下图 在EventBus3.0架构图: EventBus类 在EventBus3.0框架的内部,核心类就是EventBus,订阅者的注册/订阅,解除注册,以及事件 ...

  2. 关于ie下消除offset 问题解决

    这个问题应该是上周就发现了,所有页面都没有问题,偏偏就一个页面出现不兼容问题,而且他们用的是同一个文件.这真是一个神奇的事情.今天一来上班,我就着手解决这个问题,分析查看原来是这个元素多了一个offs ...

  3. List根据某个字段(属性)去重

    有时候自带的list.Distinct()去重并不能满足魔门的要求,比如以下情况 如果testList的Name相同则视为重复,则可以如下实现,比写循环语句简洁多了 testList.Where((x ...

  4. ftp的本地用户搭建

    前期的准备跟虚拟用户一样,就是配置文件不一样 修改配置文件 就是共享的都是自己的账号的家目录,然后启动服务就可以了 本地登陆的都是自己的账号密码 ftp本地的黑名单,

  5. hdu 6059 Kanade's trio(字典树)

    Kanade's trio Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  6. CSS3径向渐变linear-gradient

    语法: 选择器{ background:linear-gradien(线性渐变的方向,起点颜色,终点颜色): } 第一个参数:[可选参数,默认从上到下] 线性渐变的方向:top,bottom,left ...

  7. Jquery EasyUI Tree树形结构的Java实现(实体转换VO)

    前一阵做的OA项目,有一个是组织架构的树,因为是分开做的,我做的是Controller和页面,其他组做的Service和Dao,因为之前一直没有商量页面用什么框架做比较好,导致,Dao层取出来的数据都 ...

  8. LVS模式二:隧道模式(Tun)

    一.IP隧道(IP Tunneling) ip隧道是一个将ip报文封装到另一个ip报文的技术,这可以使得目标为一个ip地址的数据报文被封装和转发到另一个ip地址.ip隧道技术也成为ip封装技术.    ...

  9. Linux:tr命令详解

    tr tr命令可以对来自标准输入的字符进行替换.压缩和删除 语法 tr(选项)(SET1 SET2) 选项 -c或——complerment:取代所有不属于第一字符集的字符: -d或——delete: ...

  10. DIV css中cursor属性详解-鼠标移到图片变换鼠标形状 (转)

    css中cursor属性详解-鼠标移到图片变换鼠标形状   语法: cursor : auto | all-scroll | col-resize| crosshair | default | han ...