[原创] 【FPGA代码学习】之FFT(1)

chenzhufly   2015-8-28 02:09 楼主
最近开始有了一些学习FPGA的热情和激情,这次准备从FFT算法开始,深入的学习和了解FFT的物理意义,着重学习FFT算法的FPGA实现,也算是对以往所学的一次整理归纳,并进一步的深入思考和学习吧。 我准备按照以下的步骤来开展学习任务: 1)什么是FFT,它的物理意义是什么; 2)FFT用FPGA有哪些实现方法,大神们都在怎么玩; 3)仿真、测试的结果展示; 4)实际上板测试; 1、什么是FFT? 快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。 FFT的基本思想是把原始的N点序列,依次分解成一系列的短序列。充分利用DFT计算式中指数因子 所具有的对称性质和周期性质,进而求出这些短序列相应的DFT并进行适当组合,达到删除重复计算,减少乘法运算和简化结构的目的。此后,在这思想基础上又开发了高基和分裂基等快速算法,随着数字技术的高速发展,1976年出现建立在数论和多项式理论基础上的维诺格勒傅里叶变换算法(WFTA)和素因子傅里叶变换算法。它们的共同特点是,当N是素数时,可以将DFT算转化为求循环卷积,从而更进一步减少乘法次数,提高速度。 FFT就是DFT的一种快速算法, FFT将DFT的N2 步运算减少至 ( N/2 )log2N步。 2、FFT的算法类型 FFT算法很多,根据实现运算过程是否有指数因子WN可分为有、无指数因子的两类算法。 有指数因子的算法 经典库利-图基算法 当输入序列的长度N不是素数(素数只能被1而它本身整除)而是可以高度分解的复合数,即N=N1N2N3…Nr时,若N1=N2=…=Nr=2,N=2则N点DFT的计算可分解为N=2×N/2,即两个N/2点DFT计算的组合,而N/2点DFT的计算又可分解为N/2=2×N/4,即两个N/4点DFT计算的组合。依此类推,使DFT的计算形成有规则的模式,故称之为以2为基底的FFT算法。同理,当N=4时,则称之为以4为基底的FFT算法。当N=N1·N2时,称为以N1和N2为基底的混合基算法。 在这些算法中,基2算法用得最普遍。通常按序列在时域或在频域分解过程的不同,又可分为两种:一种是时间抽取FFT算法(DIT),将N点DFT输入序列x(n)、在时域分解成2个N/2点序列而x1(n)和x2(n)。前者是从原序列中按偶数序号抽取而成,而后者则按奇数序号抽取而成。DIT就是这样有规律地按奇、偶次序逐次进行分解所构成的一种快速算法。 分裂基算法(RSFFT) 1984年由P.杜哈美尔和H.赫尔曼等导出的一种比库利图基算法更加有效的改进算法,其基本思想是在变换式的偶部采用基2算法,在变换式的奇部采用基4算法。优点是具有相对简单的结构,非常适用于实对称数据,对长度N=2能获得最少的运算量(乘法和加法),所以是选用固定基算法中的一种最佳折衷算法。 3、FFT的计算方法 计算离散傅里叶变换的快速方法,有按时间抽取的FFT算法和按频率抽取的FFT算法。前者是将时域信号序列按偶奇分排,后者是将频域信号序列按偶奇分排。它们都借助于的两个特点:一是周期性;二是对称性,这里符号*代表其共轭。这样,便可以把离散傅里叶变换的计算分成若干步进行,计算效率大为提高。 离散信号x(n)的傅里叶变换可以表示为:
QQ图片20150828020518.png
式中的WN 称为蝶形因子,利用它的对称性和周期性可以减少运算量。一般而言, FFT算法分为时间抽取(DIT)和频率抽取(DIF)两大类。两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。本实验以时间抽取方法为例,如下图所示:
QQ图片20150828020545.png
QQ图片20150828020558.png
这些估计和IPcore里面的某些参数有关系,我们可以后期再回头看看。
本帖最后由 chenzhufly 于 2015-9-3 16:53 编辑
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰

回复评论 (22)

2推荐 chenzhufly 

哈哈 大家都很急切啊
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2015-8-31 10:12
柱神就是柱神,半夜发技术贴,膜拜一下!
点赞  2015-8-28 03:01
围观。。。。
分享铸就美好未来。。。
点赞  2015-8-28 08:39
楼上半夜观贴也是神人啊
点赞  2015-8-28 08:45
楼主加油   
加油!在电子行业默默贡献自己的力量!:)
点赞  2015-8-28 09:28
希望持续更新啊  版主  好板块  强烈支持
点赞  2015-8-28 09:34
引用: 574433742 发表于 2015-8-28 08:39
围观。。。。

挤挤。
什么都不会,只会水经验,请见谅。如果有什么得罪的地方,请找我们队长..................ID:lcofjp
点赞  2015-8-28 10:27
引用: lcofjp 发表于 2015-8-28 03:01
柱神就是柱神,半夜发技术贴,膜拜一下!

挤挤
什么都不会,只会水经验,请见谅。如果有什么得罪的地方,请找我们队长..................ID:lcofjp
点赞  2015-8-28 10:28
水军来顶。
什么都不会,只会水经验,请见谅。如果有什么得罪的地方,请找我们队长..................ID:lcofjp
点赞  2015-8-28 10:29
我是来看代码的,裤子都脱了,你给我看数字信号处理。空神上代码。
点赞  2015-8-28 12:12
柱哥,你又激动了~
强者为尊,弱者,死无葬身之地
点赞  2015-8-28 14:22
哈哈哈,不着急,慢慢来
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2015-8-28 15:39
水军来顶
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞  2015-8-28 17:47
我用Verilog编写了2048点FFT程序,1、16位数据经过ADS8505,后经过一个转浮点模块转换成32位单精度数据,之后传给FFT模块;
2、做一个旋转因子rom模块,总共1024个旋转因子,【000_0000_0000】到【0111_1111_1111】存放旋转因子实部,【100_0000_0000】到【1111_1111_1111】存放旋转因子虚部,供FFT模块调用;
3、FFT模块,首先将ad采样后并转化为32位单精度的数据,按照倒序存储对的方式放入RAM62256模块中(RAM62256是地址15位,数据8位),FFT计算完后按照原址存放的原则,再存如RAM62256中;
那么问题来了:如何做测试testbench代码????
     我想着是做一个存有2048个16位数据的data.txt,作为一个调用,然后在输出data_real_out.txt和data_imag_out.txt.如何实现啊
点赞  2015-8-28 19:20
你的代码是怎么实现的,或者请听我的下回分解
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2015-8-28 19:41
引用: 我是小强我怕谁 发表于 2015-8-28 19:20
我用Verilog编写了2048点FFT程序,1、16位数据经过ADS8505,后经过一个转浮点模块转换成32位单精度数据,之 ...

testbench有读写文件的函数
点赞  2015-8-28 20:14
不错,膜拜呀
点赞  2015-8-28 23:53
等着看
training
点赞  2015-8-29 13:05
版主怎么没有更新
点赞  2015-8-31 09:29
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复