SDR# (SDRSharp)代码讲解 (七)

本文深入解析了快速傅立叶变换(FFT)算法的实现过程,重点介绍了旋转因子W的计算方法及其在sdrsharp软件中的具体应用。通过分析代码片段,详细解释了长度N对应的2的指数幂的求解方式及输入时域信号序列的处理步骤。

要实现运算,还要把旋转因子W用代码实现,首先可以根据前面N=8例子中的碟形算法每一级中用到的W归纳一下,总结出旋转因子的一般形式,这样就方便用软件代码实现并做自动化的运算了。可以看到其实这个旋转因子W就是自然对数e的复指数,W上的参数变化,对应于在复数平面的旋转,所以叫旋转因子。这个旋转跟矩阵运算里的矩阵旋转没关系。


现在来看sdrsharp里的FFT运算的代码,sdrsharp/DNR/Fourier.cs中,第17~21行在求长度N对应的2的指数幂。比如N=1024时,这里算出来的结果是10,也就是说1024=2^10,如果N=8时,算出来的结果就是3。这里代码里的length变量就是N,代码里的m变量就是计算结果。原理也很好理解,i=i>>1的作用就是i=i/2,不停地把length除以2,除一次就给m加1,这样就能计算出这个2的指数幂了。


接下来,代码第25行~第46行做的是幻灯片第29页的操作。代码里的samples就是之前说的buffer,是同一个意思,samples里最早存储的是输入的时域信号序列,为了更加一般化,这个输入序列也看作复数,然后在同一个数组里交换不同位置的元素,来达到幻灯片29页的效果。第29~34行做的就是交换,只不过把复数元素的实部和虚部分开做了(应该是因为c#里不支持直接的复数运算,matlab里可以),另外tr和ti只是用于交换的临时变量。这部分代码的交换次序和幻灯片相同,只是在找哪个下标需要交换的时候没有用幻灯片28页里的倒位序的方法,但是实际效果是一样的。可以假设N=8的情况,把nd2=4代入到这段代码中,可以看到效果与幻灯片29页相同。这个循环对整个数组去头去尾,表示头和尾都不做任何操作,即数组元素0和数组元素7都保持原位,中间有几位做了交换,具体来看,数组元素0没有做任何操作,保持原位,数组元素1和数组元素4交换,数组元素2保持原位,然后数组元素3和数组元素6交换,数组元素4也没有做任何操作(因为之前已经换过一次了,换好了),然后数组元素5也保持原位,数组元素6也没有做任何操作(与数组元素4一样,换过一次了不需要再重复换),数组元素7也保持原位。长度为8时,实际有效的交换只做了2次。第37行~第45行用于找出要和当前位置i处的元素交换的位于j处的元素。之前说的倒位序方法也能达到相同的效果,即找出目标的排序,然后比较当前的排序,对当前排序的元素进行遍历,如果和目标排序相同就不交换,如果和目标排序不同就交换,如果和目标排序不同,但是之前已经做过次交换也不交换。但是为什么37行~45行也能实现这个功能还没完全理解。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值