天天看點

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的中間變量。