本發(fā)明涉及數字信號處理以及向量處理器領域,尤其涉及一種向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法及裝置。
背景技術:FFT(FastFourierTransformation,快速傅里葉變換),是離散傅里葉變換(DiscreteFourierTransformation,DFT)的快速實現(xiàn)算法?,F(xiàn)代無線通信和數字信號處理等應用領域中需要進行大量的FFT和IFFT(inversefastFourierTransformation,快速反傅立葉變換)運算,比如在4G通信中的OFDM調制和解調、MIMO的信道估計以及信號處理中的頻譜分析等。FFT可以將一個時域信號轉換成對應的頻域信號,與此相反,IFFT則可以把一個頻域信號轉換成相應的時域信號,因此FFT/IFFT通常用于數字信號的頻譜分析、信號的調制與解調等應用中。普通離散傅立葉變換要求的計算量比較大,例如一個N點的復數列進行DFT運算分別需要進行N*N次復數乘法和N*N次復數加法,當N比較大時,處理器可能因為運算量過大而無法滿足實時性要求。FFT/IFFT是DFT/IDFT的一種快速實現(xiàn)方式,能夠大大降低了運算復雜度,其輸入數據點數N必須是2的整數次冪。如圖1所示,一個基-2蝶形運算單元運算流程,包括兩個輸入和兩個輸出,其中一個輸入與旋轉因子相乘之后再與另外一個輸入數據做加和減操作,即一個蝶形運算單元包括一個復數乘法、一個復數加法和一個復數減法操作。一個N=2n點基-2的FFT算法結構由n級基-2蝶形運算組成,級間的數據需要經過一定方式的混洗排序之后才能輸入到下一級進行運算。每一級有N/2個基-2蝶形運算單元,而每個基-2蝶形運算單元需要一個的復數乘法和兩個的復數加法運算,因此總的運算量大大地減少了。FFT/IFFT算法是一種數據密集型算法,并且數據處理具有較大的并行性,一個N點基-2FFT算法的每一級都有N/2個可并行執(zhí)行的基-2蝶形運算和N/2個可并行執(zhí)行的復數乘法,因此面向FFT/IFFT應用的向量處理器通常采用SIMD(SingleInstructionMultipleData,單指令流多數據流)和VLIW(VeryLongInstructionWord,超長指令字)體系結構,通過設置向量運算指令、向量寄存器文件、向量處理陣列以及向量數據加載單元來開發(fā)數據和指令的并行性,加快數據處理的速度。向量處理器主要包括一個標量單元和一個向量單元。標量單元主要完成取指、指令譯碼、指令派發(fā)、標量運算、程序流的控制以及向量單元的控制寄存器的配置工作。向量單元一般至少有一個向量存儲器,一個向量數據加載單元和一個向量數據處理單元組成,其均工作在SIMD模式下。向量處理器執(zhí)行向量操作時,其指令譯碼部件完成指令譯碼,并將執(zhí)行何種指令操作、原操作數位置、以及目的操作數位置等譯碼結果發(fā)送到向量寄存器文件和向量數據處理部件。原操作數從向量寄存器文件讀出并送往向量數據處理部件中進行運算,運算結果被寫入由譯碼結果指定的目的向量寄存器文件當中,需要時,向量寄存器文件中的向量數據可以通過向量數據加載指令和向量數據加載單元訪問片內向量儲存器。單條向量指令可以同時觸發(fā)向量單元對多個向量數據同時進行運算。如圖2所示,SIMD向量處理器結構,主要包括一個標量單元和一個向量單元,標量單元主要完成取指、指令譯碼、指令派發(fā)、標量運算、程序流的控制以及向量單元的控制寄存器的配置工作。向量單元一般由至少一個向量儲存器、一個向量數據加載單元和至少一個向量數據處理單元構成,其中向量數據處理單元一般包含向量復數乘法單元和向量復數加法單元等,且均工作在SIMD模式下。向量處理器執(zhí)行向量操作時,其指令譯碼部件完成指令譯碼,并將執(zhí)行何種指令操作、原操作數位置、以及目的操作數位置等譯碼結果發(fā)送到向量寄存器文件和向量處理部件。原操作數從向量寄存器文件讀出并送往向量處理部件中進行運算,運算結果被寫入由譯碼結果指定的目的向量寄存器當中。需要時,向量寄存器文件中的向量數據可以通過向量數據加載指令和向量數據加載單元訪問片內向量儲存器。向量存儲器(Vectormemory,VM)一般分成多個存儲體實現(xiàn)向量數據的讀寫,向量數據加載單元一般包含一個數據混洗網絡,實現(xiàn)數據加載時的初始數據排列與對齊操作。如圖3所示,一個傳統(tǒng)的32點FFT信號流程(參考文獻ShoushengHe和TorkelsonM.的“ANewApproachtoPipelineFFTProcessor,ParallelProcessingSymposium,pp.766-770,15-19Apr.1996”),將32點FFT分成兩段,第一段包含3級的蝶形運算,第二段包含2級的蝶形運算,段間采用復數乘法。每一級蝶形運算都包含可并行執(zhí)行的16個基-2蝶形運算單元,同時第一段包括4個獨立基-23蝶形運算組,第二段包含8個獨立基-22蝶形運算組。傳統(tǒng)的數字信號處理器執(zhí)行FFT運算時,級間的復數乘法使用復數乘法器完成,造成處理器的功耗增大;且傳統(tǒng)的蝶形運算組內每一級蝶形運算需要不同的數據混洗方式,在并行蝶形運算過程中每一級蝶形數據計算完成之后需要對結果數據進行重排列,增加了硬件的復雜度和計算的復雜度,而且不方便硬件的擴展。
技術實現(xiàn)要素:本發(fā)明要解決的技術問題是:針對現(xiàn)有技術存在的技術問題,本發(fā)明提供一種實現(xiàn)方法簡單、蝶形運算組內無需獨立的復數乘法及復雜的混洗操作、功耗低、硬件及運算的復雜度低的向量處理器中基于SIMD的并行FFT蝶形運算方法及裝置。為解決上述技術問題,本發(fā)明提出的技術方案為:一種向量處理器中基于SIMD的并行FFT/IFFT蝶形運算的方法,步驟為:(1)將待運算的N=2n點存儲在向量存儲器中,按照蝶形運算總級數n將N點FFT蝶形運算分成多個段,每段分成2N/M個蝶形運算組,每個蝶形運算組包括多級蝶形運算;其中N為待計算的FFT點數,M為SIMD向量處理器的寬度;(2)每次從向量存儲器中加載一個蝶形運算組進行運算并將結果存儲回向量存儲器中,其中每一級的蝶形運算并行執(zhí)行;執(zhí)行每一級蝶形運算時,將目的寄存器中的向量數據以固定模式進行混洗后與對應的常復數系數進行相乘,相乘后的結果進行復數的加和減運算,得到一級蝶形運算的運算結果;(3)將2N/M個蝶形運算組的運算結果進行級聯(lián),構成一段蝶形運算結果并作為下一段蝶形運算的數據輸入,返回執(zhí)行步驟(2)直至完成所有段的蝶形運算。作為本發(fā)明方法的進一步改進:所述步驟(1)的具體實施步驟為:(1.1)將N=2n點FFT蝶形運算分成H段,其中前1~H-1段中每段包含N/2M個基-2b目標蝶形運算組,每個目標蝶形運算組包含b=log22M級蝶形運算,第H段包含N/2d個基-2d蝶形運算組,且每個蝶形運算組包含d=n-(H-1)*b級蝶形運算,其中d<b;(1.2)將第H段中的N/2d個基-2d蝶形運算組分為N/2M個目標蝶形運算組,每2M/2d個基-2d蝶形運算組組成一個目標蝶形運算組,每個目標蝶形運算組包含d級蝶形運算。作為本發(fā)明方法的進一步改進:所述步驟(2)的具體實施步驟為:(2.1)設置運算模式參數L,當執(zhí)行FFT運算時,L=0;當執(zhí)行IFFT運算時,L=1,每個目標蝶形運算組輸入2M個數據且輸出2M個數據;(2.2)加載向量存儲器中第一個目標蝶形運算組的2M個數據至第一目的寄存器中;(2.3)將第一目的寄存器中的向量數據以固定模式進行混洗后與對應的常復數系數進行相乘,相乘后的結果中每相鄰兩個數據進行復數的加和減運算后將結果寫入第一目的寄存器中,完成一級蝶形運算;返回步驟(2.3)執(zhí)行下一級蝶形運算,總計循環(huán)執(zhí)行NUM次后轉入執(zhí)行步驟(2.4),其中當處于第1~H-1段運算時,NUM=log22M,當處于第H段運算時,NUM=n-(H-1)*b;(2.4)加載段間復數旋轉因子并存儲到第二目的寄存器中,將第一目的寄存器和第二目的寄存器中數據進行復數乘法并將結果存儲到第一目的寄存器中,完成一個目標蝶形運算組內的蝶形運算,并將第一目的寄存器中的2M個計算結果存儲回向量存儲器中。作為本發(fā)明方法的進一步改進:所述步驟(2)中采用一條指令完成一個蝶形運算組內的一級蝶形運算,每條指令指定每級蝶形運算對應的常復系數,順序執(zhí)行NUM條指令后完成一個蝶形運算組內的蝶形運算,其中當處于第1~H-1段運算時,NUM=log22M,當處于第H段運算時,NUM=n-(H-1)*b。作為本發(fā)明方法的進一步改進:所述步驟(2)中固定模式進行混洗的方法為:將輸入數據按照0~2M-1順序編號并進行重排序,將編號為m的數據調整至編號為[(2m+m/M)mod2M]的位置,其中m/M為取整運算,mod表示取模運算。作為本發(fā)明方法的進一步改進:所述步驟(2)中向量數據進行混洗后與對應常復數系數進行相乘的具體方法為:將經過混洗后的輸出數據中編號為奇數的數據分別乘以一個常復系數、編號為偶數的數據的值不變,得到相乘后的結果;其中,當進行FFT運算時第J級蝶形運算第s個所述常復系數的值為當進行IFFT運算時第J級蝶形運算第s個常復系數的值為的共軛值,且W2M=e-j2π/2M,J為當前蝶形運算組的蝶形運算級數且0<=J<=log22M-1,inv(s)為smod2J結果的位反序。作為本發(fā)明方法的進一步改進:所述向量處理器為寬度為8、16或32的向量處理器中的一種。一種用來實施向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法的裝置,包括:向量寄存器文件,用來從向量存儲器中加載待運算數據,每次加載2M個復數數據并將數據輸出至固定模式混洗網絡;固定模式混洗網絡,用來將向量寄存器文件輸出的2M個數據以固定模式進行混洗,輸出2M個混洗后的數據至常復系數乘法器陣列;常復系數乘法器陣列,用來將經過混洗后的數據與對應的常復系數進行相乘,輸出結果至蝶形運算陣列;蝶形運算陣列,用來將常復系數乘法器陣列輸出的相乘后的結果中每相鄰的兩個數據進行復數的加法和減法運算,將運算結果輸出至向量寄存器文件中作為待運算的數據或輸出作為最后的運算結果;FFT/IFFT控制寄存器,用來設置運算模式參數L,控制常復系數乘法器陣列的常復系數取值;當進行FFT運算時,L=0,進行IFFT運算時,L=1。作為本發(fā)明裝置的進一步改進:所述固定模式混洗網絡將輸入端數據從對應的輸出端輸出,所述固定模式混洗網絡包括編號為0~2M-1的輸入端和編號為0~2M-1的輸出端,編號為m的所述輸入端對應連接編號為[(2m+m/M)mod2M]的所述輸出端,其中m/M為取整運算,mod表示取模運算。作為本發(fā)明裝置的進一步改進:所述常復系數乘法器陣列包括M個常復系數乘法器、編號為0~2M-1的輸入端和編號為0~2M-1的輸出端,每個奇數編號的所述輸入端對應連接一個常復系數乘法器,每個偶數編號的所述輸入端與對應輸出端相連;其中FFT/IFFT控制寄存器設置L=0時,第J級蝶形運算第s個所述常復系數乘法器的值為FFT/IFFT控制寄存器設置L=1時,第J級蝶形運算第s個所述常復系數乘法器的值為的共軛值,其中W2M=e-j2π/2M,J為當前蝶形運算組的蝶形運算級數且0<=J<=log22M-1,inv(s)為smod2J結果的位反序。與現(xiàn)有技術相比,本發(fā)明的優(yōu)點在于:(1)本發(fā)明利用SIMD處理器并行執(zhí)行FFT/IFFT蝶形運算,將FFT蝶形運算的數據混洗、復數乘法和復數加減法三個步驟融合成一個操作,大大減少運算的復雜度;使用常復數乘法器來完成蝶形運算組內的復數乘法,而只有段間使用獨立的復數乘法,使用單條向量蝶形運算指令就能實現(xiàn)向量數據的混洗、復數乘法以及復數的加和減運算,實現(xiàn)方法簡單、執(zhí)行效率高同時能夠有效減少處理器的功耗;(2)本發(fā)明在蝶形運算組內的每一級蝶形運算采用固定模式的數據混洗方式,無需獨立的混洗操作,大大方便程序的映射、加快了運算的執(zhí)行速度,減少了硬件及運算的復雜度,可以進一步方便硬件的擴展。附圖說明圖1是一個基-2蝶形運算單元運算流程示意圖。圖2是SIMD向量處理器結構示意圖。圖3是一個傳統(tǒng)的32點FFT信號流程示意圖。圖4是本實施例向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法流程示意圖。圖5是本發(fā)明用于實施向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法的裝置結構示意圖。圖6是本發(fā)明具體實施例(N=128)中執(zhí)行FFT運算時第一段的信號流程。圖7是本發(fā)明具體實施例(N=128)執(zhí)行第二段一個蝶形運算組的信號流程。圖8是本發(fā)明具體實施例(N=128)用于實施向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法的裝置結構示意圖。圖9是本發(fā)明在具體實施例(N=128)中常復系數乘法器陣列的取值對應關系示意圖。圖例說明1、向量寄存器文件;2、固定模式混洗網絡;3、常復系數乘法器陣列;4、蝶形運算陣列;5、FFT/IFFT控制寄存器。具體實施方式以下結合說明書附圖和具體優(yōu)選的實施例對本發(fā)明作進一步描述,但并不因此而限制本發(fā)明的保護范圍。采用向量處理器并行執(zhí)行FFT運算時,為了減少存儲器訪問次數,向量處理器每次加載一個或者多個蝶形運算組的數據到寄存器當中參與運算,由于蝶形運算組內的復數旋轉因子只有有限的幾組復系數,通常可以事先將其保存在寄存器當中。蝶形運算組內每一級蝶形運算可以并行執(zhí)行,運算過程中先將每個蝶形運算單元中的其中一個數據和旋轉因子通過向量處理器中的復數乘法器相乘得到中間向量結果,并將中間向量結果存儲在寄存器當中,然后將每個蝶形運算單元中的另一個輸入數據與中間向量結果做復數加和減運算。以下以本發(fā)明采用SIMD向量處理器并行執(zhí)行N=2n點蝶形運算為例進行說明,運算過程中所有的臨時變量存儲在寄存器當中,當整個蝶形運算組的操作計算完成之后,將結果數據存回存儲器當中,蝶形運算組內的每一級蝶形運算并行執(zhí)行。如圖4所示,本實施例向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法,步驟為:(1)將N=2n點FFT蝶形運算分成H段,前1~H-1段中每段包含N/2M個基-2b目標蝶形運算組,每個目標蝶形運算組包含b=log22M級蝶形運算,第H段包含N/2d個基-2d蝶形運算組,每個蝶形運算組包含d=n-(H-1)*b級蝶形運算,其中d<b;將第H段中的N/2d個基-2d蝶形運算組分為N/2M個目標蝶形運算組,每2M/2d個基-2d蝶形運算組組成一個目標蝶形運算組,每個目標蝶形運算組包含d級蝶形運算;每個目標蝶形運算組輸入2M個數據并輸出2M個數據,設置運算模式參數L,當執(zhí)行FFT運算時,L=0;當執(zhí)行IFFT運算時,L=1;其中N為待計算的FFT點數,M為SIMD向量處理器的寬度;(2)加載向量存儲器中第一個目標蝶形運算組的2M個數據至第一目的寄存器中;(3)將第一目的寄存器中的向量數據以固定模式進行混洗后與對應的常復數系數進行相乘,相乘后的結果中每相鄰兩個數據進行復數的加和減運算后將結果寫入第一目的寄存器中,完成一級蝶形運算;返回步驟(3)執(zhí)行下一級蝶形運算,總計循環(huán)執(zhí)行NUM次后轉入執(zhí)行步驟(4),其中當處于第1~H-1段運算時,NUM=log22M,當處于第H段運算時,NUM=n-(H-1)*b;(4)加載段間復數旋轉因子并存儲到第二目的寄存器中,將第一目的寄存器和第二目的寄存器中數據進行復數乘法并將結果存儲到第一目的寄存器中,完成一個蝶形運算組內的蝶形運算,轉入執(zhí)行步驟(5);(5)將第一目的寄存器中的2M個計算結果存儲回向量存儲器中,增加向量存儲器地址偏移量,加載下一個目標蝶形運算組到第一目的寄存器中,返回執(zhí)行步驟(3);總計循環(huán)執(zhí)行N/2M次后,完成一段蝶形運算;(6)判斷當前是否執(zhí)行了H段蝶形運算,若為是,輸出最終的蝶形運算結果;若為否,返回步驟(2)執(zhí)行下一段蝶形運算。為了減少數據從存儲器當中加載次數,根據XuanGuan等人的“HierarchicalDesignofanpplication-SpecificInstructionSetProcessorforHigh-ThroughputandScalableFFTProcessing,IEEETransactionsonVeryLargeScaleIntegration(VLSI)Systems,vol.20,no.3,pp.551-563,March2012”,F(xiàn)FT蝶形算法通常分成多個段(epoch),每個段包括多個蝶形運算組(group)。數據只有在每個蝶形運算組的開始和計算結束之后才訪問存儲器,而在蝶形運算組內的計算產生的中間結果存儲在向量寄存器當中。蝶形運算組一般是由一個基-4,基-8,基-16或者更高基的蝶形運算集合構成,同時,基-4,基-8和基-16蝶形運算組又可以進一步分解成基-22,基-23和基-24的蝶形運算組,以減少算法的運算量。本實施例中,將存儲于向量存儲器中待運算的N=2n點FFT分成H段,分段的方法為:使得前1~H-1段中每段包含b=log22M級蝶形運算,第H段包含d=n-(H-1)*b級蝶形運算,且d<b。每段蝶形運算分成N/2M個獨立的蝶形運算組,每個蝶形運算組輸入2M個數據,得到2M個數據輸出,輸出結果存儲在原輸入數據在向量存儲器中的位置。通過設置執(zhí)行模式參數L,可以執(zhí)行FFT運算或IFFT運算,當L=0時,執(zhí)行FFT運算,當L=1時,則執(zhí)行IFFT運算。本實施例中,由向量處理器的向量加載單元每次加載一個蝶形運算組的數據,即2M個數據,進行蝶形運算。執(zhí)行前1~H-1段的蝶形運算時,由于前1~H-1段中每段包含b級蝶形運算,每次加載的2M個數據需要執(zhí)行b級蝶形運算,前級的輸出作為后一級的輸入,執(zhí)行完b級蝶形運算后與段間復數因子相乘,以此完成一個蝶形運算組的運算。N/2M個蝶形運算組執(zhí)行完后,由N/2M個蝶形運算組的結果級聯(lián)得到一段的蝶形運算結果。第H-1段的輸出作為第H段的數據輸入,執(zhí)行第H段的蝶形運算時,由于第H段包含N/2d個基-2d蝶形運算組,每個蝶形運算組包含d級蝶形運算,將N/2d個基-2d蝶形運算組中相鄰的2M/2d個蝶形運算重新交叉組成一個目標蝶形運算組,共構成N/2M個目標蝶形運算組,每個目標蝶形運算組包含d級蝶形運算;進行運算時每次加載2M個數據進行d級蝶形運算,執(zhí)行N/2M個蝶形運算組的加載及執(zhí)行后完成第H段的蝶形運算。蝶形運算組執(zhí)行每一級蝶形運算時,由于每一級數據相關性不一樣,需要通過混洗操作對數據進行重新排列和對齊之后才能進行第二級并行蝶形運算。因此傳統(tǒng)的并行蝶形運算方法一般需要復數乘法、復數加減法以及向量數據混洗三步操作才能完成一級并行蝶形運算,增加了運算和硬件的復雜度。本實施例中,蝶形運算組執(zhí)行每一級蝶形運算時采用固定模式的混洗方式進行混洗,即按照一定的混洗方式對輸入數據進行重排列,固定模式進行混洗的方法為:將輸入的2M個數據按0~2M-1順序進行編號,將編號為m的數據調整至編號為[(2m+m/M)mod2M]的位置,即處于第m位的數據調整為第[(2m+m/M)mod2M]位,其中m=0、1,……,2M-1,m/M為取整運算,mod表示取模運算。本發(fā)明在蝶形運算組內的每一級蝶形運算采用固定模式的數據混洗方式,蝶形運算組內無需獨立的混洗操作,大大方便程序的映射、加快了運算的執(zhí)行速度,減少了硬件及運算的復雜度,可以進一步方便硬件的擴展。由于每段蝶形運算內的每個蝶形運算組的流程是相同的,并且一個基-2a蝶形運算組內的復數旋轉因子只有有限的a組,因此可以使用常復數乘法來完成蝶形運算組內的復數乘法,而只有段間的復數乘法使用獨立的復數乘法器。本實施例中,蝶形運算組執(zhí)行每一級蝶形運算時,將向量數據經過固定模式的混洗后與對應常復數系數進行相乘,具體方法為:將經過混洗后的輸出數據中編號為奇數的數據分別乘以一個常復系數,編號為偶數的數據的值不變,得到相乘后的結果。當L=0時,即進行FFT運算時,第J級蝶形運算第s個常復系數的值為當L=1時,即進行IFFT運算時,一個蝶形運算組中第J級蝶形運算的第s個常復系數的值為的共軛值,其中W2M=e-j2π/2M,J為當前蝶形運算組的蝶形運算級數且0<=J<=log22M-1,inv(s)為smod2J的位反序。當進行FFT運算時,若s=5,J=2,由于5mod4的值為1,1的二進制數01的位反序為10,其十進制數為2,則inv(5)=2,得到第2級第5個的常復系數的值為本實施例中采用常復數系數乘法器來完成蝶形運算組內的復數乘法,而只有段間的復數乘法使用獨立的復數乘法器,蝶形運算組內無需獨立的復數乘法,有效減少處理器的功耗。本實施例中,蝶形運算組執(zhí)行每一級蝶形運算可以通過設置一條相應的指令來實現(xiàn),計算一個基-2a蝶形運算組時,可以設置對應的a條指令操作碼R2BFJ,加上源寄存器src和目的寄存器dst實現(xiàn),其中J為執(zhí)行的蝶形級數且J=0,1,…,a-1。使用指令R2BFJsrc1,src2,dst0:dst1表示進行第J級蝶形運算,源寄存器的編號分別為src1和src2,向量寄存器將編號為src1和src2寄存器中的值輸出進行固定模式的混洗后與對應的常復數乘法進行相乘,由指令操作碼R2BFJ控制和選擇第J組對應的常復系數,將完成常復數乘法后的數據進行復數的加和減運算。順序執(zhí)行完J+1條指令后完成一個蝶形運算組內的蝶形運算,當處于第1~H-1段蝶形運算時,順序執(zhí)行l(wèi)og22M條指令后完成一個蝶形運算組內的蝶形運算,當處于第H段運算時,順序執(zhí)行完n-(H-1)*b條指令后完成一個蝶形運算組內的蝶形運算。本發(fā)明利用SIMD處理器并行執(zhí)行FFT/IFFT蝶形運算,將FFT蝶形運算的數據混洗、復數乘法和復數加減法三個步驟融合成一個操作,大大減少運算的復雜度;使用單條向量蝶形運算指令就能實現(xiàn)向量數據的混洗、復數乘法以及蝶形運算中加法和減法操作,實現(xiàn)方法簡單、執(zhí)行效率高同時能夠有效減少處理器的功耗。如圖5所示,本發(fā)明用于實施向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法的裝置,包括:向量寄存器文件1,用來從向量存儲器中加載待運算數據,每次讀取2M個復數數據并將數據輸出至固定模式混洗網絡2;固定模式混洗網絡2,用來將向量寄存器文件1輸出的2M個數據以固定模式進行混洗,輸出2M個混洗后的數據至常復系數乘法器陣列3;常復系數乘法器陣列3,用來將經過混洗后的數據與對應的常復系數進行相乘,輸出結果至蝶形運算陣列4;蝶形運算陣列4,用來將常復系數乘法器陣列3輸出的相乘后的結果中每相鄰的兩個數據進行加和減運算,將運算結果輸出至向量寄存器文件1中作為待運算的數據或輸出作為最后的運算結果;FFT/IFFT控制寄存器5,用來設置運算模式參數L,當進行FFT運算時,L=0,當進行IFFT運算時,L=1。其中,向量寄存器文件1、固定模式混洗網絡2、常復系數乘法器陣列3與蝶形運算陣列4依次連接,蝶形運算陣列4的另一端連接向量寄存器文件1輸入端,F(xiàn)FT/IFFT控制寄存器5與常復系數乘法器陣列3相連。本實施例中,用來實施向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法的裝置執(zhí)行一次完成一級蝶形運算,由指令控制選擇對應的常復系數。向量寄存器文件1包括兩個向量寄存器組,由每個向量寄存器組寫入或輸出M個復數數據。本實施例中,固定模式混洗網絡2將輸入端數據從對應輸出端輸出,固定模式混洗網絡2包含2M個輸入端和輸出端,將2M個輸入端和輸出端按0~2M-1順序進行編號,編號為m的輸入端對應連接編號為[(2m+m/M)mod2M]的輸出端,其中m/M取其整數部分,mod表示取模運算。本實施例中,常復系數乘法器陣列3包含M個常復系數乘法器、編號為0~2M-1的輸入端以及編號為0~2M-1的輸出端,其中每個編號為奇數的輸入端連接一個常復系數乘法器,每個編號為偶數的輸入端直接連接輸出端。當FFT/IFFT控制寄存器5的值L為0時,即進行FFT運算,第J級蝶形運算第s個常復數乘法器的常復系數值為其中W2M=e-j2π/2M,inv(s)是smod2J的位反序;當FFT/IFFT控制寄存器5的值L為1時,即進行IFFT運算,常復系數乘法器陣列3中的第J級蝶形運算第s個常復數乘法器的常復系數是L為0時的常復系數的共軛值。工作時,向量寄存器文件1根據指令當中指定的原操作數位置,每次從向量寄存器文件1的兩個向量寄存器中讀出2M個復數數據,并將數據輸出到固定模式混洗網絡2的2M個輸入端;固定模式混洗網絡2接收向量寄存器輸出的數據,將2M個輸入數據經過一定方式的混洗之后輸出2M個混洗后的數據到常復系數乘法器陣列3當中;常復系數乘法器陣列3接收混洗網絡輸出的2M個數據,并對輸出編號為奇數的輸入分別乘以一個常復系數之后輸出,而編號為偶數的輸入的值不變,直接輸出到蝶形運算陣列4;對常復系數乘法器陣列3輸出的2M個復數中每兩個相鄰的數進行相加和相減操作,同時產生2M個運算結果,并將2M個數據寫入指令中指定的目的向量寄存器當中,完成一級蝶形運算。本實施例中,可以通過對蝶形運算組內的每一級蝶形運算設置一條相應的指令,計算一個基-2a蝶形運算組時可以設置對應的a條指令操作碼R2BFJ加上源寄存器src和目的寄存器dst實現(xiàn),其中J=0,1,…,a-1,指令R2BFJsrc1,src2,dst0:dst1表示進行第J級蝶形運算,源寄存器的編號分別為src1和src2。向量寄存器文件1將編號為src1和src2寄存器中的值輸出固定模式混洗網絡2進行混洗操作,數據經過混洗之后輸出到常復系數乘法器陣列3進行常復數乘法,由指令操作碼R2BFJ控制和選擇常復系數乘法器陣列3對應的常復系數取值。常復系數乘法器陣列3輸出結果到蝶形運算陣列4進行運算,并將結果存儲到編號為dst0和dst1寄存器組當中,完成一次蝶形運算。執(zhí)行N點的FFT蝶形運算時,將蝶形運算分成H段,第1~H-1段包含N/2M個基-2b蝶形運算組,每個蝶形運算組執(zhí)行b=log22M級蝶形運算;第H段包含N/2d基-2d蝶形運算組,每個蝶形運算組執(zhí)行d=n-(H-1)*b級蝶形運算,其中d<b。執(zhí)行第H段的蝶形運算時,將N/2d個基-2d蝶形運算組中每相鄰的2M/2d個蝶形運算重新交叉組成一個蝶形運算組,共構成N/2M個待運算的目標蝶形運算組,每個目標蝶形運算組包含d級蝶形運算。進行運算時,每次由向量寄存器文件1加載2M個數據進行一個蝶形運算組的蝶形運算,每個蝶形運算組執(zhí)行b條R2BFJsrc1,src2,dst0:dst1指令后與段間復數相乘,N/2M個蝶形運算組執(zhí)行完后完成一段蝶形運算,當處于第H段的蝶形運算時,每個蝶形運算組則控制執(zhí)行d條R2BFJsrc1,src2,dst0:dst1指令。本發(fā)明采用固定混洗方式進行數據混洗,且段內采用常復數乘法器完成復數乘法,而僅在段間采用復數乘法進行計算,每個蝶形運算組內的運算無需獨立的復數乘法和復雜的數據混洗操作,大大加快了程序的執(zhí)行速度,減少了硬件的復雜度。以下以寬度為8的向量處理器計算128點FFT/IFFT為具體實施例進行說明,即N=128,M=8。如圖6、7所示,本發(fā)明具體實施例(N=128)中執(zhí)行FFT運算時的信號流程,將N=128點FFT分成了兩個段,第一段包含4級蝶形運算,第二段包含3級蝶形運算,段間采用復數乘法。如圖6所示,本發(fā)明具體實施例(N=128)中執(zhí)行FFT運算時第一段的信號流程,第一段包括n=0~7共8個獨立的基-24蝶形運算組,通過調整其輸入數據和中間運算結果的位置,每一級蝶形運算的數據混洗模式是固定相同的。每個蝶形運算組執(zhí)行4級蝶形運算后與段間復數相乘,得到一個蝶形運算組的16個運算結果n1=0~15,8個蝶形運算組的運算結果級聯(lián)作為第二段的數據輸入,每個蝶形運算組的相鄰兩個運算結果作為一組,組成n1=0、1,n1=2、3,……,n1=14、15共8個數據組。第二段包括16個基-23蝶形運算組,將相鄰兩個基-23蝶形運算組進行交叉組合得到了與第一段基-24蝶形運算組的前三級相同信號流程的蝶形運算組,即組合得到8個新的蝶形運算組,每個新的蝶形運算組包含3級蝶形運算,同樣其輸入和輸出都是16點,每一級的數據混洗模式也是相同的。如圖7所示,本發(fā)明具體實施例(N=128)中執(zhí)行第二段一個蝶形運算組的信號流程,其中n1=14、15且虛線表示目標蝶形運算組中n1=14的基-23蝶形運算組,實線表示目標蝶形運算組中n1=15的基-23蝶形運算組。n1=14和n1=15的兩個基-23蝶形運算組交叉組合成目標蝶形運算組,目標蝶形運算組經過3級蝶形運算輸出16個運算結果,其中3級蝶形運算與第一段的前三級信號流程相同。同理,若為其他點數的FFT蝶形運算可以分解成包含多個基-24蝶形運算的段以及一個包含多個基-23或基-22或基-21蝶形運算的段。本實施例中,執(zhí)行N=128點FFT蝶形運算的具體工作流程為:首先將N=128點的FFT蝶形運算劃分為H段,H段共包含n=7級蝶形運算,由于需滿足:前1~H-1段中每段包含b=log22M級蝶形運算、第H段包含d=n-(H-1)*b級蝶形運算,因此將N=2n=27點FFT分成H=2段,其中第1段包含b=log22M=4級蝶形運算,第H=2段包含d=n-(H-1)*b=3級蝶形運算,每段蝶形運算分成N/2M=8個獨立的蝶形運算組,每個蝶形運算組輸入2M=16個數據。設置FFT/IFFT控制寄存器5的值L為0,從第1段開始執(zhí)行蝶形運算。執(zhí)行第一段的第一個蝶形運算組的運算,由向量數據加載單元從片上向量存儲器當中取出第一個蝶形運算組的2M個數據到向量寄存器VR0和VR1。將從向量寄存器VR0、VR1中取出的第一個蝶形運算組向量數據進行固定混洗模式的混洗后與對應的常復數乘法相乘,相乘后結果進行復數的加和減操作,并將加和減的2M個結果存儲回向量寄存器VR0和VR1中,完成第一個蝶形運算組的第一級蝶形運算。以第一級蝶形運算的輸出結果作為第二級蝶形運算的輸入數據,同樣的方法得到第二級的蝶形運算結果,依次類推,完成4級蝶形運算后完成第一段第一個蝶形運算組所有級蝶形運算。通過使用4(R2BFJ,J=0,1,2,3)條R2BFJ指令完成一個蝶形運算組內的4級蝶形運算。由向量數據加載單元加載段間復數旋轉因子,存儲到向量寄存器VR2和VR3當中。通過向量處理器中的復數乘法器完成段間復數乘法,將向量寄存器VR0*VR2的結果存儲到向量寄存器VR0當中,將向量寄存器VR1*VR3的結果存儲到VR1當中,完成第一段第一個蝶形運算組運算。將向量寄存器VR0和VR1中的結果存儲到向量存儲器中原輸入數據的位置,增加地址偏移量,從向量存儲器中取出第二個蝶形運算組的2M=16個數據到向量寄存器VR0、VR1中,按照上述蝶形運算組的執(zhí)行方法執(zhí)行;依次類推,執(zhí)行完8個蝶形運算組的蝶形運算后完成第一段的蝶形運算。同樣的方法執(zhí)行第二段的蝶形運算,不同之處在于第二段的每個蝶形運算組內只有3級蝶形運算,只需使用3(R2BFJ,J=0,1,2)條指令完成一個蝶形運算組內的蝶形計算。本實施例中,固定模式混洗方法為:按照一定的混洗方式對16個數據進行排列,對其16個輸入和16個輸出分別從0~15的進行編號,編號為m的輸入與編號為(2m+m/8)mod16的輸出相連,其中m/8取其整數,mod為取模操作。如圖8所示,本發(fā)明具體實施例(N=128)用于實施向量處理器中基于SIMD的并行FFT蝶形運算方法的裝置,包括依次連接的向量寄存器文件1、固定模式混洗網絡2、常復系數乘法器陣列3以及蝶形運算陣列4,且均具有2M=16個輸入端和2M=16個輸出端。其中一個向量寄存器包含8個復數數據,一個復數數據由32bit表示,低16bit是實部,高16bit是虛部,因此向量寄存器的寬度為8*32bit。向量寄存器分成兩個體,因此每個時鐘周期可以讀取和寫入16個復數數據。工作時,向量寄存器文件1與固定模式混洗網絡2相連,根據源寄存器的位置向量寄存器文件1每次可以同時從兩個存儲體當中讀出16個復數數據,并將數據輸出到固定模式混洗網絡2的16個輸入端。固定模式混洗網絡2按照一定的混洗方式對16個數據進行排列,對其16輸入和16輸出分別從0~15的進行編號,其混洗模式為:編號為m的輸入與編號為(2m+m/8)mod16的輸出相連,其中m/8取其整數,mod為取模操作。數據經過混洗之后輸出到常復系數乘法器陣列3,常復系數乘法器陣列3將奇數號端口的輸入數據分別乘以一個對應的復數因子。如圖9所示,本發(fā)明在具體實施例(N=128)中常復系數乘法器陣列的取值對應關系,共包含有四組常復系數,每一組對應一條指令操作碼。執(zhí)行時由指令譯碼單元指定使用對應組的常復系數,例如第二條指令R2BF1VR0,VR1,VR0:VR1使用第二組常復系數[1,-j,1,-j,1,-j,1,-j,1,-j]。當FFT/IFFT控制寄存器5為1時,即進行IFFT操作,需要對每組常復系數因子取共軛操作作為IFFT運算時的常復系數。本實施例中,使用指令R2BF0VR0,VR1,VR0:VR1進行第一級蝶形運算組運算,之后接著使用R2BF1VR0,VR1,VR0:VR1進行第二級蝶形運算,R2BF2VR0,VR1,VR0:VR1進行第三級蝶形運算,一直到使用R2BFJVR0,VR1,VR0:VR1進行第b-1級蝶形運算,其中J=b-1,到此完成一個蝶形運算組內的蝶形運算。本實施例中,執(zhí)行一個基-24蝶形運算組的運算步驟為:(1)通過向量數據加載單元將一個基-24蝶形運算組的16個數據按順序分別存儲在向量寄存器VR0和VR1當中。(2)順序使用R2BF0VR0,VR1,VR0:VR1,R2BF1VR0,VR1,VR0:VR1,R2BF2VR0,VR1,VR0:VR1和R2BF3VR0,VR1,VR0:VR1四條指令即可以完成一個基-24蝶形運算組內4級并行蝶形運算。每條指令讀取向量寄存器VR0和VR1的數據并將其輸出到固定模式混洗網絡2對輸入數據進行混洗,混洗后的數據輸出到常復系數乘法器陣列3與相應的常復系數進行相乘;(3)將數據結果輸入到蝶形運算陣列4當中進行復數加法和減法操作,并將結果存儲到VR0和VR1寄存器當中。執(zhí)行兩個基-23蝶形運算組則只需要使用R2BF0VR0,VR1,VR0:VR1,R2BF1VR0,VR1,VR0:VR1,R2BF2VR0,VR1,VR0:VR1三條指令就可以完成。本實施例中,128點的FFT蝶形運算可以通過執(zhí)行兩段蝶形運算完成,第一段循環(huán)8次執(zhí)行基-24蝶形運算組,第二段循環(huán)執(zhí)行8次兩個基-23蝶形運算既可完成128點FFT運算。本發(fā)明用于實施向量處理器中基于SIMD的并行FFT/IFFT蝶形運算方法的裝置可以直接替換向量處理器中的其中一個向量數據處理單元,接收譯碼器發(fā)來的指令,進行并行FFT/IFFT蝶形運算,并將結果存儲回由指令譯碼結果指定的目的向量寄存器當中。本發(fā)明利用SIMD處理器并行執(zhí)行FFT蝶形運算,使用單條向量蝶形運算指令就能實現(xiàn)向量數據的混洗、復數乘法以及蝶形運算,實現(xiàn)方法簡單、執(zhí)行效率高同時能夠有效減少處理器的功耗。本發(fā)明還可擴展于寬度M=16、32甚至更寬的SIMD向量處理器執(zhí)行FFT/IFFT運算,具有很強的實用性,其工作原理與上述相同,在此不再進行贅述。上述只是本發(fā)明的較佳實施例,并非對本發(fā)明作任何形式上的限制。雖然本發(fā)明已以較佳實施例揭露如上,然而并非用以限定本發(fā)明。任何熟悉本領域的技術人員,在不脫離本發(fā)明技術方案范圍的情況下,都可利用上述揭示的技術內容對本發(fā)明技術方案做出許多可能的變動和修飾,或修改為等同變化的等效實施例。因此,凡是未脫離本發(fā)明技術方案的內容,依據本發(fā)明技術實質對以上實施例所做的任何簡單修改、等同變化及修飾,均應落在本發(fā)明技術方案保護的范圍內。