看完了变量可以看一下三个循环各自代表的功能,来对整个代码结果做一个整体上的理解。首先,最外侧的循环,对应于第48行的for,代表了当前运算对应第几级。第58行,对应于同一级中有几个旋转因子,所以这个循环在结束前的第73行~75行做的运算就是在计算这一级的下一个旋转因子。第62行的for循环,对应于同一级且同一个旋转因子所要做的运算。比如最左侧的第一级,一共就只有一个旋转因子,所以第58行的for循环只做了一次,而这一级中同一个旋转因子W0N用了4次,做了4个小的碟形运算,所以第62行的for循环做了4次。
另外,还可以看一下这3个循环每次变量增加的值,以及变量最大值。48行的for循环对应级的上升,显然,每个级都要做,所以每次增加1,然后级的最大值就是M所以不能超过代码里的变量m。58行的for循环,对应同一级旋转因子,每个旋转因子参与的运算都要做,所以每次增加1,由31页图可知每一级旋转因子的数量正好与这一级碟形运算的距离(碟形大小)相等,比如第二级中有2个旋转因子,而这一级的碟形大小间距就是2,所以这个循环的最大值(即旋转因子数量)就是le2。62行的循环对应于同一级中同一个旋转因子所做的所有运算,同一级同一旋转因子的距离就是用le表示的,所以这个循环的变量增加值就是le,为了遍历序列的所有输入,所以这个循环的最大值是nm1,也就是总长度-1。
看完了以上这些可以说FFT正变换就看懂了。接下来的IFFT其实是利用了傅立叶变换本身的性质,也是调用FFT实现的,并不复杂。如果要把一个复数序列做逆变换,只需要把这个输入序列的虚数部分符号反一反,然后对它做正变换,做完后再乘以一个缩放因子,然后再把它的虚部符号反一反,所得的结果正好就是直接对这个复数序列做逆变换的结果。这个可以从幻灯片第43页看出来,也可以自己进行公示推导。幻灯片第45页也再次做了证明。幻灯片里的取共轭就是实部不变,虚部符号反一反。
对应于代码可以看到第82~85行,先给输入的复数序列的各个元素的虚部加了一个负号,相当于对这个复数序列取共轭,然后87行做了FFT正变换,89行算了缩放因子。91行~95行的循环把前面的FFT正变换结果用缩放因子做了缩放,并对虚部加了负号相当于又做取了一次共轭。和幻灯片第45页的操作基本一致(只有求共轭和除以N的次序反了,但是这个没区别的)。
这样FFT的正变换和逆变换在sdrsharp里的实现就讲完了,看懂这些后再看sdrsharp里其它信号处理代码应该也没什么问题了。