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

幻灯片29页的变址处理(对输入数组做交换)完成后,接下来就要做碟形算法了。对应于代码第48行~第78行。要看懂这段代码,首先有几个地方要搞懂。一个是复数乘法的实现方式,可以参照幻灯片第5页,复数乘法输出的实部等于输入的两个复数的实部相乘的结果减去输入两个复数的虚部相乘的结果,而复数乘法输出的虚部等于两个输入复数的实部乘以另一个的虚部的和,这个如果不理解可以自己用两个复数推导一下复数乘法的公式。其实代码里的第65~66行以及第74~75行都在做复数乘法,前者在做的是旋转因子与输入序列间的复数乘法,后者做的是旋转因子本身的在旋转过程中要经历的复数乘法。


有几个变量可以对应看一下,第48行的l变量就对应于第33页的L,也就是第L级。(31页从左往右,最左是第一级),然后第48行里的m变量对应于第33页的M,如果N=8的话,M=3也就是总共有3级,所以这里m也等于3。le2对应于幻灯片第32页的距离,这个距离的意思是每个碟形运算的间距,碟形中间一行都没隔开,这个距离就是1,隔一行距离就是2,隔三行距离就是4。le2在这里循环里会产生的变量正好就是1、2、4。而le在这里其实也表示距离,它代表的是在一级中使用同样的旋转因子的两行之间的距离。因为从第31页碟形图中看到,尤其是中间的第二级和第三级,旋转因子本身是会变化的,比如第二级,我们可以先把使用同一个旋转因子W0N的所有的运算都做完了(从第一组运算调入第二组运算时要用这个le来找到合适的位置),再对旋转因子本身做旋转,做另一个旋转因子W2N对应的运算。


接下来是ur和ui,它们代表旋转因子在最早期W0N的虚部和实部,从幻灯片第33页最下面的旋转因子一般形式知道,其实旋转因子就是在单位圆上用指数形式表示的复数值,当r=0时,指数幂就是0,那么这个旋转因子正好等于1,即实部是1虚部是0。所以最开头ur=1,ui=0。注意第33页最下方的公式里有2个j,其中最左侧的表示复数,另一个表示的是同一级中的j取值,就是33页上方右侧的j,第一级j只能是0,第二级j可以是0、1,第三级j可以是0、1、2、3。这个值在代码里对应于第60行的jm1。


往下看,sr和si是用来构造后期的旋转因子的。它们是cos和-sin,正好是e^(-j)的实部和虚部。然而,旋转因子在每一级中的转动幅度是不一样的,越高的级旋转幅度越小,增加一级旋转幅度缩小一倍,可以在第33页最后一行中间的公式里看到,L增加1,指数上的分母就要多乘以一个2,整个指数相当于除以2,这样每次j增加后的旋转效果也会相应缩小。这个在第55行和第66行的分母上的le2也有所体现。再往下的变量jm1前面已经说过,再往下看ip变量和i的关系就是碟形运算中两个输入值的位置的关系。只要知道碟形运算的上方的输入值的位置再加上它们间的距离le2就可以找到与它做碟形运算的另一个值的位置。然后tr和ti是碟形运算的乘法的结果,可以看到都是碟形运算下方的输入乘上了当前的旋转因子(从ur和ui中体现),乘法项做完了就做加法,根据第14页,碟形运算上方的输出是前面两个值相加,下方的输出是前面两个值相减,67行~70行就在做这个事,samples[ip]就代表下方的输出,samples[i]代表上方的输出。再往下看就是当同一级中旋转因子有好几个时,对其本身进行旋转生成下一个旋转因子的操作,u代表旋转因子的当前值,s代表旋转因子本身要转动的值,tr只是暂时保存ur的中间变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值