




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、專題八專題八通用數(shù)字信號處理方法的通用數(shù)字信號處理方法的DSP實現(xiàn)實現(xiàn)DSP常見的幾種信號處理算法:常見的幾種信號處理算法:uDSP基本算術(shù)運算指令基本算術(shù)運算指令u除法運算除法運算u平方根運算平方根運算u級數(shù)展開級數(shù)展開u產(chǎn)生正弦波產(chǎn)生正弦波uFIR濾波器的實現(xiàn)濾波器的實現(xiàn)uFFT的實現(xiàn)的實現(xiàn)u自適應(yīng)濾波(自適應(yīng)濾波(LMS)的實現(xiàn))的實現(xiàn)實現(xiàn)整數(shù)(定點)加法指令實現(xiàn)整數(shù)(定點)加法指令uC5400,C5500中提供了多條用于加法的指令,中提供了多條用于加法的指令,如如ADD。u加法指令中不同的情況,如用于加法指令中不同的情況,如用于無符號數(shù)的加無符號數(shù)的加法法運算,用于運算,用于帶進位的加
2、法運算帶進位的加法運算(如(如32位擴展位擴展精度加法),以及用于精度加法),以及用于立即數(shù)的加法立即數(shù)的加法。它們的。它們的具體加法指令有所不同。具體加法指令有所不同。u要實現(xiàn)要實現(xiàn)飽和運算加法飽和運算加法,需要設(shè)置標志位,需要設(shè)置標志位SATD。uC5500下還提供了同時完成加下還提供了同時完成加/減運算的指令減運算的指令A(yù)DDSUB等,以及條件執(zhí)行加減,輔助寄存器等,以及條件執(zhí)行加減,輔助寄存器加法等增強加法指令。加法等增強加法指令。實現(xiàn)實現(xiàn)C6000加法指令加法指令uC6000也提供了ADD加法指令。u無符號加法(ADDU),飽和運算(SADD)加法,立即數(shù)加法(ADDK)等都有專用指
3、令完成,等等u也提供同時完成加/減運算的ADDSUB、ADDSUB2指令。u也提供ADD2,ADD4的SIMD操作。uC674x以及C6700浮點加法指令使用ADDSP,ADDDP完成循環(huán)尋址的加法循環(huán)尋址的加法uC5500的循環(huán)尋址通過ARx輔助寄存器在指令中實現(xiàn),可在任意間接尋址模式中使用。使用時可設(shè)置對應(yīng)的ARnLC比特位(ST2_55)。也可在指令后加.CRuC6000的循環(huán)尋址可以通過指令A(yù)DDAB,ADDAD,ADDAH,ADDAW,并使用B4-B7/A4-A7來實現(xiàn)實現(xiàn)減法操作實現(xiàn)減法操作u減法運算指令與加法類似,畢竟加一個負數(shù)就減法運算指令與加法類似,畢竟加一個負數(shù)就等效于做一
4、個減法操作。等效于做一個減法操作。u減法指令中,減法指令中,SUBC為移位減,為移位減,DSP中的除法中的除法就是用該指令來實現(xiàn)的。就是用該指令來實現(xiàn)的。uC5400,C5500,C6000都提供都提供SUBC指令。指令。u參考教材的參考教材的5.1.1小節(jié)(小節(jié)(Page247),如何實現(xiàn)),如何實現(xiàn)整數(shù)除法以及求模運算。整數(shù)除法以及求模運算。u教材教材Page252程序示例程序示例C6X整數(shù)除法整數(shù)除法C程序。程序。實現(xiàn)實現(xiàn)16位定點整數(shù)除法位定點整數(shù)除法u在在C54X中沒有提供專門的除法指令,一中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘般有兩種方法來完成除法。一種是用
5、乘法來代替,除以某個數(shù)相當于乘以其倒法來代替,除以某個數(shù)相當于乘以其倒數(shù),所以先求出其倒數(shù),然后相乘。這數(shù),所以先求出其倒數(shù),然后相乘。這種方法對于除以常數(shù)特別適用。另一種種方法對于除以常數(shù)特別適用。另一種方法是使用方法是使用SUBC指令,重復(fù)指令,重復(fù)16次減法完次減法完成除法運算。成除法運算。utemp1/temp2為例,說明如何使用為例,說明如何使用SUBC指令實現(xiàn)整數(shù)除法指令實現(xiàn)整數(shù)除法: ld temp1,T ;將被除數(shù)裝入;將被除數(shù)裝入T寄存器寄存器 mpy temp2,A ;除數(shù)與被除數(shù)相乘,結(jié)果放入;除數(shù)與被除數(shù)相乘,結(jié)果放入A寄存器寄存器 ld temp2,B ;將除數(shù);將除
6、數(shù)temp2裝入裝入B寄存器的低寄存器的低16位位 abs B ;求絕對值;求絕對值 stl B,temp2 ;將;將B寄存器的低寄存器的低16位存回位存回temp2 ld temp1,B ;將被除數(shù);將被除數(shù)temp1裝入裝入B寄存器的低寄存器的低16位位 abs B ;求絕對值;求絕對值 rpt #15 ;重復(fù);重復(fù)SUBC指令指令16次次 subctemp2,b ;使用;使用SUBC指令完成除法運算指令完成除法運算 bcddiv_end,agt;延時跳轉(zhuǎn),先執(zhí)行下面兩條指令,;延時跳轉(zhuǎn),先執(zhí)行下面兩條指令, ; 然后判斷然后判斷A,若,若A0,則跳轉(zhuǎn)到標號,則跳轉(zhuǎn)到標號 ; div_en
7、d,結(jié)束除法運算,結(jié)束除法運算stl B,quot_i ; 將商(將商(B寄存器的低寄存器的低16位)存入變量位)存入變量quot_isth B,remain_i ;將余數(shù)(將余數(shù)(B寄存器的高寄存器的高16位)存入變量位)存入變量remain_ixor B ;若兩數(shù)相乘的結(jié)果為負,則商也應(yīng)為負。;若兩數(shù)相乘的結(jié)果為負,則商也應(yīng)為負。Sub quot_i,B ;將商反號;將商反號stl B,quot_i ;存回變量;存回變量quot_i中中div_end:實現(xiàn)乘法運算實現(xiàn)乘法運算u乘法指令在C5500,C6000中都有大量的指令來實現(xiàn)。u在C5000中提供了大量的乘法運算指令,16位相乘,其結(jié)
8、果都是32位,放在累加器中。u乘數(shù)在C5000的乘法指令很靈活,可以是T寄存器、立即數(shù)、存貯單元和累加器的高16位。u有符號與無符號數(shù)乘法是不同的指令。實現(xiàn)乘法運算實現(xiàn)乘法運算-C6000uC6000也有MPY乘法指令,但其乘法的乘數(shù)有16位,32位,其結(jié)果也有32位,64位的不同指令。u也提供有符號與無符號的區(qū)別指令。uC674x以及C67+提供MPYSP/MPYDP浮點數(shù)乘法指令。uC6000的乘法指令需要2個或更多的時鐘周期,如MPYSP(4),MPYDP(10),等。具體請參考指令手冊。小數(shù)乘法小數(shù)乘法u小數(shù)乘法與整數(shù)乘法主要差別在乘積多出一個符號比特,需要左移一位來消除uC5000下
9、使用狀態(tài)寄存器的FRCT位來控制,當FRCT=1時進行小數(shù)乘法。uC6000使用獨立指令來實現(xiàn)乘積左移,實現(xiàn)小數(shù)乘法,如SMPY,SMPY32,SMPY2,SMPYHL,等待16位定點整數(shù)乘法例子位定點整數(shù)乘法例子u在在C54X中,小數(shù)的乘法與整數(shù)乘法基本一致,中,小數(shù)的乘法與整數(shù)乘法基本一致,只是由于兩個有符號的小數(shù)相乘,其結(jié)果的小只是由于兩個有符號的小數(shù)相乘,其結(jié)果的小數(shù)點的位置在次高的后面,所以必須左移一位,數(shù)點的位置在次高的后面,所以必須左移一位,才能得到正確的結(jié)果。才能得到正確的結(jié)果。C54X中提供了一個狀中提供了一個狀態(tài)位態(tài)位FRCT,將其設(shè)置為,將其設(shè)置為1時,系統(tǒng)自動將乘積時,
10、系統(tǒng)自動將乘積結(jié)果左移移位。結(jié)果左移移位。rsbxFRCT;清;清FRCT標志,準備整數(shù)乘標志,準備整數(shù)乘ldtemp1,T;將變量;將變量temp1裝入裝入T寄存器寄存器mpytemp2,a;完成;完成temp2*temp1,結(jié)果放,結(jié)果放 ;入;入A寄存器(寄存器(32位)位)16位定點小數(shù)乘法例子位定點小數(shù)乘法例子u0ccdH(十進制的(十進制的0.1)x 0599aH(十進制的十進制的0.7),),兩數(shù)相乘后兩數(shù)相乘后B寄存器的內(nèi)容為寄存器的內(nèi)容為08f5f0a4H(十進(十進制的制的0.07000549323857)。)。u可以使用可以使用RND或使用或使用MPYR指令對低指令對低1
11、6位做四位做四舍五入的處理。舍五入的處理。Ssbx FRCT ;FRCT=1,準備小數(shù)乘法,準備小數(shù)乘法ldtemp1,16,a ;將變量;將變量temp1裝入寄存器裝入寄存器A的高的高16位位mpya temp2 ;完成;完成temp2乘寄存器乘寄存器A的高的高16位,結(jié)位,結(jié) ;果在;果在B中,同時將中,同時將temp2裝入裝入T寄存器寄存器sthb,mpy_f ;將乘積結(jié)果的高;將乘積結(jié)果的高16位存入變量位存入變量mpy_f實現(xiàn)實現(xiàn)16定點小數(shù)除法定點小數(shù)除法u在在C54X中實現(xiàn)中實現(xiàn)16位的小數(shù)除法與前面的整數(shù)位的小數(shù)除法與前面的整數(shù)除法基本一致,也是使用循環(huán)的除法基本一致,也是使用
12、循環(huán)的SUBC指令來指令來完成。但有兩點需要注意:完成。但有兩點需要注意:u第一,小數(shù)除法的結(jié)果一定是小數(shù)(小于第一,小數(shù)除法的結(jié)果一定是小數(shù)(小于1),),所以被除數(shù)一定小于除數(shù)。這與整數(shù)除法正好所以被除數(shù)一定小于除數(shù)。這與整數(shù)除法正好相反。所以在執(zhí)行相反。所以在執(zhí)行SUBC指令前,應(yīng)將被除數(shù)指令前,應(yīng)將被除數(shù)裝入裝入A或或B寄存器的高寄存器的高16位,而不是低位,而不是低16位。位。其結(jié)果的格式與整數(shù)除法一樣,其結(jié)果的格式與整數(shù)除法一樣,A或或B寄存器寄存器的高的高16位為余數(shù),低位為余數(shù),低16位為商。位為商。u第二,與小數(shù)乘法一樣,應(yīng)考慮符號位對結(jié)果第二,與小數(shù)乘法一樣,應(yīng)考慮符號位對
13、結(jié)果小數(shù)點的影響。所以應(yīng)對商右移一位。小數(shù)點的影響。所以應(yīng)對商右移一位。乘累加運算乘累加運算-C5500uMAC/MAS是DSP的核心運算,C5500提供直接的乘累加或乘累減指令。uC5500在完成MAC/MAS同時,還可以直接完成數(shù)據(jù)的搬移,如MACMZuC5500提供MAC/MPY/MOV的并行執(zhí)行能力,如MAC:MAC,MAC:MAS,MAC:MPY,MACMZ:MOV,等等乘累加運算乘累加運算-C6000uC62x沒有直接的MAC指令,主要通過功能單元的并行能力來實現(xiàn)這個DSP核心操作!u但從C64開始,增加了DOTP2,DOTPN2等乘累加操作指令。u從C64+開始,增加了DDOTP
14、2等多次乘累加操作指令(需要pipeline配合)。u在C66x ,有DOTP4H等4個乘累加操作。特殊乘法指令特殊乘法指令uC5500的FIRSADD/FIRSSUB,LMS,SQA,SQDST,SQR等等uC64+的復(fù)數(shù)乘法:CMPYuC64+的Galois field乘法(伽羅瓦域伽羅瓦域):GMPY,XORMPY,等??捎糜诩用芴幚淼亩囗検竭\算uC6700的平方根指令:RSQRSP,等uC6700的倒數(shù)指令:RCPSP,RCPDP,等除法的實現(xiàn)除法的實現(xiàn)5.1.4小節(jié)(小節(jié)(Page257)除法的實現(xiàn)除法的實現(xiàn)uDSP中沒有直接除法指令u5.1.1小節(jié)和5.1.2小節(jié)可以使用SUBC指
15、令實現(xiàn)整數(shù)和小數(shù)除法u更通常的做法是將除法改為乘以倒數(shù)。故除法問題轉(zhuǎn)為倒數(shù)計算。u5.1.4小節(jié)給出了使用牛頓迭代法計算倒數(shù)。Newton-RhapsonuC6700提供倒數(shù)計算指令,但精度有限。牛頓迭代法計算倒數(shù)牛頓迭代法計算倒數(shù)u先定義函數(shù),a為輸入?yún)?shù)u則f(x)的根就是a的倒數(shù)。利用牛頓迭代法求去f(x)的根。u假設(shè)f (x)為f(x)的一階導(dǎo)數(shù),則u如果xn為f(x)的根,則迭代方程為:axxf1)()0(a2)(xxf.3 ,2 ,1 ,0,)()(1nnxfnxfnxnx.3 ,2 ,1 ,0),2(1nnxanxnxMatlab代碼% 計算輸入數(shù)據(jù)的倒數(shù),其迭代的初始值應(yīng)該保證
16、x2始終為正!a=input(Pls input the number=);x2=0.3;error=1;number=0;while error 0.00001 x1=x2; x2=x1*(2-a*x1); number=number+1; error=abs(x2-x1); disp(num2str(number), ,num2str(x2);enddisp(Result is ,num2str(x2);C6700的除法實現(xiàn)的除法實現(xiàn)u教材的Page259提供了單精度浮點除法運算的匯編程序?qū)嵗a。u同時給出了擴展精度的倒數(shù)計算方法。u教材Page260給出了C代碼函數(shù)實現(xiàn)除法例子。u如果
17、是其它定點如果是其它定點DSP,可以參考前面的,可以參考前面的定點數(shù)運算,用牛頓迭代法計算倒數(shù),定點數(shù)運算,用牛頓迭代法計算倒數(shù),從而實現(xiàn)定點除法計算!從而實現(xiàn)定點除法計算!平方根的實現(xiàn)平方根的實現(xiàn)5.2小節(jié)(小節(jié)(Page267)平方根計算平方根計算u求平方根也是數(shù)字信號處理中常見的算術(shù)運算之一。利用上一節(jié)介紹的Newton-Rhapson迭代算法,可以很方便地完成平方根或者平方根倒數(shù)的運計算。u將平方根運算作如下變換:u由上式可以看出,求平方根和求平方根倒數(shù)的運算實際上是等價的。1(0)xaaaa平方根計算平方根計算u因此,定義函數(shù)u只要求得方程g(y) = 0的根,進行x = ay的運算
18、可得到a的平方根。u為了使用Newton-Rhapson迭代算法,計算g(y)的一階導(dǎo)數(shù)并帶入迭代方程:21( )(0)g yaay21 1.50.5 (1, 2, 3)y ny na y nn平方根計算平方根計算-C6700u若使用C67xx,可將y0 = RSQRSP(a)為初始值,即使用C67xx的求倒數(shù)的指令計算值作為初值。X0 = _rsqrsp(arg1) ; get initial TLU value to 8 bitsV = 0.5*arg1 ; generate term just onceX1 = X0*(1.5-V*X02); 1st iteration to 16-bi
19、tsX2 = X1*(1.5V*X12); 2nd iteration to 32-bitsAns = arg1*X2; generate square root* _rsqrsp為C6700的平方根計算指令,這里用作初值,提高精度。級數(shù)求和的實現(xiàn)級數(shù)求和的實現(xiàn)5.3小節(jié)小節(jié)(PLOY指令的應(yīng)用)指令的應(yīng)用)利用利用POLY指令計算泰勒級數(shù)指令計算泰勒級數(shù)u三角函數(shù)、對數(shù)、指數(shù)等超越函數(shù)都可以用級數(shù)展開,如常用的泰勒級數(shù)。u不同的級數(shù)展開有不同的收斂速度。u以指數(shù) 的展開為例:xe!.! 3! 2132nxxxxenx(實際一般取9項)利用利用POLY指令計算泰勒級數(shù)指令計算泰勒級數(shù)!.! 3
20、! 2132nxxxxenx)!.! 3! 21 (1121nxxxxn)! 8! 71(.! 41(! 31(! 211 (1xxxxx利用利用POLY指令計算泰勒級數(shù)指令計算泰勒級數(shù)uPOLY指令的含義: poly SmemRound(A(32-16) x T + B - ASmem Bu指數(shù)展開)! 8! 71(.! 41(! 31(! 211 (1xxxxx x - TSmem - 1/n!taylor: STM a9, AR3 ;AR3 points to coefficient in;Taylors equ. LD X, T;set up running environment u
21、sing LD *AR3+, 16, A ;powerful poly instruction on 54x DSP LD *AR3+, 16, B RPT #7;loop 8 times enough for audio app. POLY *AR3+ ;AH=fractional part in Q15;format利用利用POLY指令計算泰勒級數(shù)指令計算泰勒級數(shù)a9 .int 1, 7, 46, 273, 1365, 5461, 16384, 32767, 0, 0C5500計算級數(shù)計算級數(shù)uC5400提供了POLY指令實現(xiàn)級數(shù)迭代計算,但C5500,C6000都沒有類似指令。u但C55
22、00可以通過并行指令來實現(xiàn):u上面的并行指令完全可以替代POLY的功能uC6000則通過功能單元并行來實現(xiàn)級數(shù)運算則通過功能單元并行來實現(xiàn)級數(shù)運算MAC AC1,T0,AC2,AC1: MOV *AR1+ ar0 st #INSTR_B,*ar0(#OFF_INTR_3) st #fir,*ar0(#OFF_INTR_3+1) ; init A/D int vector ! ld #temp,dp ;- the following codes for MAC st #win_data,t_ar3 ; ar3 - 2000h data windows st #filter_coff,t_ar2
23、; ar2 - filter coff xor a,a ; clear a xor b,b ; clear b rsbx intm ; enable all int !g: idle 1 b g;-; These codes may be called by serial rev int ! all registers dont ; change !; When enter this subroutine, the AD data has been put in A !;- fir: ld #temp,dp stl a,temp ; a - AD data ! call low_pass_ma
24、c ld a,-16,b ld #0,dp stl b,2,TDXR ; sent result to DA ! rete;*; LOWPASS FILTER (use MAC); Input data - A, output data - A; used AR2 - coff,AR3 - data_buffer !;*low_pass_mac: pshm st1 pshm st0 pshm ar0 pshm bk mvdm #t_ar2,ar2 ; restore ar2 mvdm #t_ar3,ar3 ; restore ar3 stm #1,ar0 stm #N,bk ; set cir
25、cular addressing size stl a,*ar3+% rptz a,#(N-1) ; 0 - a, then repeat 34 times mac *ar2+0%,*ar3+0%,a ; done FIR filter, result in a mvmd ar3,#t_ar3 ; save ar3 mvmd ar2,#t_ar2 ; save ar2 popm bk popm ar0 popm st0 popm st1 retu程序、數(shù)據(jù)的存儲器安排程序、數(shù)據(jù)的存儲器安排u程序功能框圖程序功能框圖u相關(guān)外設(shè)的準備:相關(guān)外設(shè)的準備:DSP,AD/DA,u相關(guān)外設(shè)的軟件設(shè)置:相關(guān)
26、外設(shè)的軟件設(shè)置:McBSP串口初始串口初始化、化、AC01的初始化、的初始化、u硬件電路設(shè)計、調(diào)試硬件電路設(shè)計、調(diào)試u軟件設(shè)計、調(diào)試軟件設(shè)計、調(diào)試FIRFIR濾波器的工程實現(xiàn)濾波器的工程實現(xiàn)初始化串口初始化串口初始化初始化AC01 等待新數(shù)據(jù)?等待新數(shù)據(jù)?調(diào)用濾波程序調(diào)用濾波程序串口串口發(fā)送發(fā)送中中斷服務(wù)程序斷服務(wù)程序串口串口接受接受中中斷服務(wù)程序斷服務(wù)程序是llCCS圖形工具顯示圖形工具顯示FIR濾波效果濾波效果圖形顯示圖形顯示FIR輸入輸入/輸出頻譜輸出頻譜FIRS指令來實現(xiàn)指令來實現(xiàn)FIR濾波器濾波器u一種有限單位沖激響應(yīng)呈現(xiàn)對中心點對稱的一種有限單位沖激響應(yīng)呈現(xiàn)對中心點對稱的FIR濾波
27、器。長度為濾波器。長度為N 的線性相位的線性相位FIR濾波器的濾波器的輸出表達式為:輸出表達式為:12/0)1()()()(NkkNnxknxkhnyFIRS指令來實現(xiàn)指令來實現(xiàn)FIR濾波器濾波器uFIRS Xmem,Ymem,pmad含義:FIRS指令來實現(xiàn)指令來實現(xiàn)FIR濾波器濾波器 B +(A(32-16) x Pmad - B(Xmem + Ymem) APAR+uPmad尋址FIR濾波器系數(shù),Xmem和Ymem分別指向窗口數(shù)據(jù)的上下兩部分。16點點FIRS濾波數(shù)據(jù)存放濾波數(shù)據(jù)存放*ar2 *ar3new *ar2+16點點FIRS濾波數(shù)據(jù)存放濾波數(shù)據(jù)存放FIR *AR2+0%,*AR
28、3+0%#FIR_COFAR2-, AR3-=2*ar2 *ar3new *ar2+使用使用FIRS指令完成濾波指令完成濾波u利用利用FIRS指令指令, ,需要將輸入數(shù)據(jù)緩沖分需要將輸入數(shù)據(jù)緩沖分成兩個成兩個, ,大小為大小為N/2。u初始狀態(tài)將初始狀態(tài)將AR2指到緩沖區(qū)指到緩沖區(qū)1的頂部,的頂部,AR3指到緩沖區(qū)指到緩沖區(qū)2的底部。每次濾波之前的底部。每次濾波之前, ,應(yīng)先將緩沖區(qū)應(yīng)先將緩沖區(qū)1頂部的數(shù)據(jù)移到緩沖區(qū)頂部的數(shù)據(jù)移到緩沖區(qū)2的底部的底部, ,新來的一個樣本存儲到緩沖區(qū)新來的一個樣本存儲到緩沖區(qū)1中時中時, ,并對緩沖區(qū)并對緩沖區(qū)1 1指針指針AR2加加1(1(使用循使用循環(huán)尋址環(huán)
29、尋址) )。使用使用FIRS指令完成濾波指令完成濾波u處理器然后使用處理器然后使用FIRS指令進行乘加運算。指令進行乘加運算。當然當然, ,在使用在使用FIRS指令前指令前, ,需要預(yù)先計算一需要預(yù)先計算一次求和次求和, ,以初始化以初始化A 。u在在RPTZ重復(fù)指令和循環(huán)尋址的配合下重復(fù)指令和循環(huán)尋址的配合下, ,完完成成FIR濾波濾波。u濾波完成后,需要對兩個數(shù)據(jù)緩沖的指針進濾波完成后,需要對兩個數(shù)據(jù)緩沖的指針進行修正,以便對下一個點進行處理。將行修正,以便對下一個點進行處理。將Buffer1的指針減的指針減1和和Buffer2的指針減的指針減2,使,使他們指向各自緩沖的數(shù)據(jù)隊列的最后。他
30、們指向各自緩沖的數(shù)據(jù)隊列的最后。STM #1,AR0 ; AR0=1STM #(N/2),BK ;BK=N/2,循環(huán)尋址循環(huán)尋址BUFFER大小為大小為NMVDD *ar2, *ar3 ;更新;更新Buffer2STLA, *ar2+% ; 更新濾波窗口中的采樣數(shù)據(jù)更新濾波窗口中的采樣數(shù)據(jù)ADD ADD * *ar2+0% , ar2+0% , * *ar3+0%ar3+0% ; 初始化初始化A ARPTZ B, #(N/2-1) ) ; 重復(fù)重復(fù)FIRSFIRS指令指令N/2次次, ,先將先將B B清零清零FIRS *ar2+0%, *ar3+0%,filter_coff+N/2 ;完成濾波
31、計算。注意完成濾波計算。注意FIR濾波系數(shù)存放濾波系數(shù)存放 ;在程序存貯區(qū),;在程序存貯區(qū),filter_cofffilter_coff為系數(shù)起始地址為系數(shù)起始地址MAR MAR * *ar2-%ar2-% ; 修改修改Buffer1Buffer1指針指針MAR MAR * *+ar3(-2)%+ar3(-2)% ; 修改修改Buffer2Buffer2指針指針使用帶使用帶FIRSFIRS指令的循環(huán)尋址模式實現(xiàn)指令的循環(huán)尋址模式實現(xiàn)FIR濾波器,程序片段濾波器,程序片段如下:如下:( (輸入數(shù)據(jù)在輸入數(shù)據(jù)在AL中中, ,濾波結(jié)果在濾波結(jié)果在B中中)uFIRSADD Acx,ACy,Cmem,X
32、mem,Ymem FIRSADD指令指令-C5500-C5500 ACy = ACy + (ACx * Cmem): ACx = (Xmem16) + (Ymem16)uFIRADD.CR可使得后面的Cmem,Xmem,Ymem間接尋址都是用循環(huán)尋址。u在滿足C5500的并行條件時,可以與其它指令并行執(zhí)行。C6000實現(xiàn)濾波器-乘累加loop: ldh.d1*A8+,A2 | ldh.d2*B9+,B3 nop4 mpy.m1x A2,B3,A4 nop add.l1A4,A6,A6 sub.l2B0,1,B0 b0 b.s1loop nop5What can you put in paral
33、lel?Load InstructionsMPY2x=+a1a0A0LDW .D1 *A4+,A0 x1x0B0| LDW .D2 *B4+,B0A2A3a1 * x1a0 * x0MPY2 A0,B0,A3:A2| MPYH.M2 A0,B0,B5+a1x1 + a3x3 .a0 x0 + a2x2 .ADD .L1 A2,A6,A6| ADD .L2 A3,B6,B6A6B6final sumADD .L1 A6,B6,A4A4+DOTP2 with LDDW=+a2a0A1:A0LDDW .D1 *A4+,A1:A0| LDDW .D2 *B4+,B1:B0A2B2a3*x3 + a2*
34、x2a1*x1 + a0*x0DOTP2 A0,B0,A2| DOTP2 A1,B1,B2+intermediate sumADD A2,A3,A3a1a3:A5x2x0B1:B0 x1x3:final sumADD A3,B3,A4A4+| ADD B2,B3,B3intermediate sumA3B3In Ch 8, well get all these instructions working in paralleld0*c0d1*c1d2*c2d3*c3+ yd4*c4d5*c5d6*c6d7*c7coefdataBlock Real FIRfor (i = 0; I ndata;
35、i+) sum = 0;for (j = 0; j ncoef; j+) sum = sum + (di+j * cj);yi = sum;loop Iterationi,j0,00,1d0c0d1c1d1c0d2c2d2c1d3c3d3c2.Block Real FIR Example (DDTOPL2 )for (i = 0; I ndata; i+) sum = 0;for (j = 0; j ncoef; j+) sum = sum + (di+j * cj);yi = sum;loop Iterationi,j0,00,1d0c0+d1c1d1c0+d2c1d2c2d3c3d3c2.
36、uFour 16x16 multipliesuIn each .M unit every cycle-adds up to 8 MACs/cycle, or8000 MMACSuBottom Line: Two loop iterations for the price of oneDDOTPL2 d3d2:d1d0, c1c0, sum1:sum0loop Iterationi,j0,00,10,20,30,40,5d0c0+d1c1d1c0+d2c1d2c2d2c0d3c3d3c2d3c1d3c0d4c4d4c3d4c2+d5c3d4c1d4c0d5c5d5c4d5c2+d6c3d5c1d
37、6c0d6c6d6c5d6c4d6c2d6c1d7c7d7c6d7c5d7c4d7c3d6c2d8c7d8c6d8c5d8c4d6c3 DDOTPL2.M1 d3d2:d1d0, c1c0, sum1:sum0| DDOTPL2.M2 d7d6:d5d4, c3c2, sum3:sum2Parallel DDOTPL2sReal Block FIR A_j SPLOOPD 4| MVC .S2 B_i0, ILC ;set ILC | ADD .L2 B_i0, 1, B_i0 ;T/4 | ADDAH .D2 B_DLYaddr, nCoefs-1+4, B_DLYOUTaddr | MVK
38、 .S1 nCoefs/4-3, A_T| ADDAB .D1 A_DLYaddr, 8, A_DLYaddr*- stage A -* LDDW .D1T2 *+A_DLYaddr, B_d7d6:B_d5d4 ; 1,1 | LDDW .D2T1 *+B_DLYaddr, A_d3d2:A_d1d0 ; 1,1 LDDW .D2T2 *+B_COEFaddr, B_c3c2:B_c1c0 ; 2,1 | LDDW .D1T1 *+A_COEFaddr, A_c3c2:A_c1c0 ; 2,1 SPMASK| LDDW .D1T1 *A_DLYaddr1, A_dbda:A_d9d8 ; 3
39、,1 | LDDW .D2T2 *B_INaddr+, B_TEMP1:B_TEMP0 ;ld 1st input | MVC .S2 B_i0, RILC ;set RILC SPMASK| LDDW .D2T1 *B_INaddr+, A_TEMP1:A_TEMP0 ;ld 2nd input | ZERO .L1 A_st ;clear st flag | ADDAB .D1 DP, outputs+8, A_OUTaddr| MVK .S2 nCoefs/4-1, B_TC| MVK .S1 nCoefs/4-1, A_TC*- stage B -* SPMASK| SUB .L2X
40、A_OUTaddr, 8, B_OUTaddr NOP 1 DMV .S2X B_d5d4, A_d3d2, B_d5d4_:B_d3d2_ ; 7,1 | DDOTPL2 .M1 A_d3d2:A_d1d0,A_c1c0, A_pb:A_pf ; 7,1 | DDOTPL2 .M2 B_d7d6:B_d5d4,B_c3c2, B_p2:B_p6 ; 7,1 SPMASK| DMV .S1X A_d9d8, B_d7d6, A_d9d8_:A_d7d6_ ; 8,1 | DDOTPL2 .M2 B_d5d4_:B_d3d2_,B_c3c2, B_pa:B_pe ; 8,1 | DDOTPL2
41、.M1 A_dbda:A_d9d8,A_c3c2, A_p0:A_p4 ; 8,1 | STNDW .D2T2 B_TEMP1:B_TEMP0, *B_DLYOUTaddr+ ;st 1st inputNew double-throughput 16-bit mpy instructionsABCABCABCDDDABCD4ABCABCABCDDDABCDO1O2O3O4O5e1e2,p1e3,p2e4,p3p4DDOTP4DDOTP4 (.unit) src1, src2, dst_o:dst_eBlock Real FIRuC64x ImplementationDOTP2 d1d0, c1
42、c0, s0 ;d1*c1 + d0*c0DOTP2 d2d1, c1c0, s1 ;d2*c1 + d1*c0uC64x Plus ImplementationDDOTPL2 d3d2:d1d0, c1c0, s1:s0uReduces .M requirement by halfC64x: 194 cycles, 624 bytes (N=40, T=16)C64x+:126 cycles, 496 bytes (N=40, T=16) N = Length of example block, T = data sizeCMPY.Complex Multiply (CMPY)A0r1i1x
43、xA1r2i2=CMPY A0, A1, A3:A2r1*r2 - i1*i2:i1*r2 + r1*i2 32-bits 32-bits uFour 16x16 multiplies per .M unituUsing two CMPYs, a total of eight 16x16 multiplies per cycleuFloating-point version (CMPYSP) uses: 64-bit inputs (register pair)128-bit packed products (register quad)You then need to add/subtrac
44、t the products to get the final result single .M unitComplex MPYuCMPY (.M) src1, src2, dst_o:dst_eFour 16-bit inputs (real0,imag0, real1,imag1)Two 32-bit outputs (real, imag)uCMPYR (.M) src1, src2, dstFour 16-bit inputs (real0,imag0, real1,imag1)One packed 32-bit output (16 bit real, 16 bit imag)Rou
45、nded by adding 2*15 uCMPYR1 (.M) src1, src2, dstFour 16-bit inputs (real0,imag0, real1,imag1)One packed 32-bit output (real, imag)Rounded by adding 2*14 plus left shiftBlock Complex FIRuC64x ImplementationDOTP2dre_dim, cim_cre, pimDOTPN2 dre_dim, cre_cim, preuC64x Plus ImplementationCMPY dre_dim, cr
46、e_cim, pre:pimuReduces .M requirement by halfC64x: 674 cycles, 572 bytes (N=40, T=16)C64x+: 344 cycles, 460 bytes (N=40, T=16)N = Length of example block, T = data sizeDSPLIBuOptimized DSP Function Library for C programmers using C62x/C67x and C64x devicesuThese routines are typically used in comput
47、ationally intensive real-time applications where optimal execution speed is critical. uBy using these routines, you can achieve execution speeds considerably faster than equivalent code written in standard ANSI C language. And these ready-to-use functions can significantly shorten your development t
48、ime.uThe DSP library features:C-callableHand-coded assembly-optimizedTested against C model and existing run-time-support functionsAdaptive filteringMathDSP_firlms2DSP_dotp_sqrCorrelationDSP_dotprodDSP_autocorDSP_maxvalFFTDSP_maxidxDSP_bitrev_cplxDSP_minvalDSP_radix 2DSP_mul32DSP_r4fftDSP_neg32DSP_f
49、ftDSP_recip16DSP_fft16x16rDSP_vecsumsqDSP_fft16x16tDSP_w_vecDSP_fft16x32MatrixDSP_fft32x32DSP_mat_mulDSP_fft32x32sDSP_mat_transDSP_ifft16x32MiscellaneousDSP_ifft32x32DSP_bexpFilters & convolutionDSP_blk_eswap16DSP_fir_cplxDSP_blk_eswap32DSP_fir_genDSP_blk_eswap64DSP_fir_r4DSP_blk_moveDSP_fir_r8D
50、SP_fltoq15DSP_fir_symDSP_minerrorDSP_iirDSP_q15toflTechnical TrainingOrganizationT TOFFT實現(xiàn)實現(xiàn)教材教材7章章(7.3小節(jié)及小節(jié)及7.4小節(jié)小節(jié))FFT是數(shù)字信號處理中重要的工是數(shù)字信號處理中重要的工具具uFFT是一種高效實現(xiàn)離散付氏變換的算是一種高效實現(xiàn)離散付氏變換的算法。法。(8.2.2小節(jié)介紹了小節(jié)介紹了 Goertzel算法)算法) u離散付氏變換的目的是把信號由時域變離散付氏變換的目的是把信號由時域變換到頻域,從而可以在頻域分析處理信換到頻域,從而可以在頻域分析處理信息,得到的結(jié)果再由付氏逆變換到
51、時域。息,得到的結(jié)果再由付氏逆變換到時域。uDFT的定義為:的定義為: 1,.,1 , 0)2(10NkenxkXnkNjNnDFT的定義的定義u可以方便的把它改寫為如下形式:可以方便的把它改寫為如下形式:uWN(旋轉(zhuǎn)因子)的周期性是(旋轉(zhuǎn)因子)的周期性是DFT的關(guān)鍵的關(guān)鍵性質(zhì)之一。為了強調(diào)起見,常用表達式性質(zhì)之一。為了強調(diào)起見,常用表達式WN取代取代W以便明確其周期是以便明確其周期是N。 1,.,1 , 010NkWnxkXnkNNn)2sin()2cos()2(nkNjnkNeWnkNjnkNFFT是是DFT的快速算法的快速算法u由由DFT的定義可以看出,在的定義可以看出,在xn為復(fù)數(shù)序為
52、復(fù)數(shù)序列的情況下,完全直接運算列的情況下,完全直接運算N點點DFT需要需要(N-1)2次復(fù)數(shù)乘法和次復(fù)數(shù)乘法和N(N-1)次加法。)次加法。uFFT的基本思想在于,將原有的的基本思想在于,將原有的N點序列點序列序列分成兩個較短的序列,這些序列的序列分成兩個較短的序列,這些序列的DFT可以很簡單的組合起來得到原序列可以很簡單的組合起來得到原序列的的DFT。FFT是是DFT的快速算法的快速算法u例如,若例如,若N為偶數(shù),將原有的為偶數(shù),將原有的N點序列分成點序列分成兩個(兩個(N/2)點序列,那么計算)點序列,那么計算N點點DFT將將只需要約只需要約(N/2)2 2 2=N2/2次復(fù)數(shù)乘法。即比次
53、復(fù)數(shù)乘法。即比直接計算少作一半乘法。直接計算少作一半乘法。u該處理方法可以反復(fù)使用,即(該處理方法可以反復(fù)使用,即(N/2)點的)點的DFT計算也可以化成兩個(計算也可以化成兩個(N/4)點的)點的DFT(假定(假定N/2為偶數(shù)),從而又少作一半的乘為偶數(shù)),從而又少作一半的乘法。這樣一級一級的劃分下去一直到最后法。這樣一級一級的劃分下去一直到最后就劃分成兩點的就劃分成兩點的FFT運算的情況。運算的情況。FFT是是DFT的快速算法的快速算法u比如,一個比如,一個N = 8點的點的FFT運算按照這種運算按照這種方法來計算方法來計算FFT可以用下面的流程圖來可以用下面的流程圖來表示:表示:W0W0
54、W2W0W2W0W1W2W3x(0)x(4)x(2)x(6)x(1)x(5)x(3)x(7)X(7)X(6)X(5)X(4)X(3)X(2)X(1)X(0)W0W0W0實數(shù)實數(shù)FFT運算運算u對于離散傅立葉變換(對于離散傅立葉變換(DFT)的數(shù)字計)的數(shù)字計算,算,F(xiàn)FT是一種有效的方法。一般假定是一種有效的方法。一般假定輸入序列是復(fù)數(shù)。當實際輸入是實數(shù)時,輸入序列是復(fù)數(shù)。當實際輸入是實數(shù)時,利用對稱性質(zhì)可以使計算利用對稱性質(zhì)可以使計算DFT非常有效。非常有效。u一個優(yōu)化的實數(shù)一個優(yōu)化的實數(shù)FFT算法是一個組合以算法是一個組合以后的算法。原始的后的算法。原始的2N個點的實輸入序列個點的實輸入序
55、列組合成一個組合成一個N點的復(fù)序列,之后對復(fù)序列點的復(fù)序列,之后對復(fù)序列進行進行N點的點的FFT運算,最后再由運算,最后再由N點的復(fù)點的復(fù)數(shù)輸出拆散成數(shù)輸出拆散成2N點的復(fù)數(shù)序列。點的復(fù)數(shù)序列。實數(shù)實數(shù)FFT運算運算u使用這種方法,在組合輸入和拆散輸出使用這種方法,在組合輸入和拆散輸出的操作中,的操作中,F(xiàn)FT運算量減半。運算量減半。u這樣利用實數(shù)這樣利用實數(shù)FFT算法來計算實輸入序算法來計算實輸入序列的列的DFT的速度幾乎是一般復(fù)的速度幾乎是一般復(fù)FFT算法算法的兩倍。的兩倍。u本實驗就用這種方法實現(xiàn)了一個本實驗就用這種方法實現(xiàn)了一個256點實點實數(shù)數(shù)FFT(2N = 256)運算。)運算。
56、實數(shù)實數(shù)FFT運算運算序列序列的存的存儲分儲分配配程序存儲區(qū)實數(shù)FFT程序1800h1FFFhFFT程序存儲空間數(shù)據(jù)存儲區(qū)0F00h0FFFh堆棧test_val0C00h對輸入數(shù)據(jù)進行符號擴展的測試值temp_ar50C01h輸出緩沖區(qū)的指針temp_ar30C02h輸入緩沖區(qū)的指針input_cnt0C03h輸入數(shù)據(jù)計數(shù)器output_cnt0C04h輸出數(shù)據(jù)計數(shù)器d_grps_cnt0C05h組指針d_twid_idx0C06h旋轉(zhuǎn)因子指針d_data_idx0C07h數(shù)據(jù)處理緩沖指針sine_table0D00h0DFFh正弦表cos_table0E00h0EFFh余弦表fft_da
57、ta2200h22FFh數(shù)據(jù)處理緩沖同時又是功率譜輸出緩沖d_input_addr2300h23FFh數(shù)據(jù)輸入緩沖基二實數(shù)基二實數(shù)FFT運算的算法運算的算法u第一步,輸入數(shù)據(jù)的組合和位倒序:(第一步,輸入數(shù)據(jù)的組合和位倒序:(1)把輸入序列作位倒序,是為了在整個運把輸入序列作位倒序,是為了在整個運算最后的輸出中得到的序列是自然順序。算最后的輸出中得到的序列是自然順序。(2)原始的輸入的)原始的輸入的2N = 256個點的實數(shù)個點的實數(shù)序列復(fù)制放到標記有序列復(fù)制放到標記有“d_input_addr”的的相鄰單元,當成相鄰單元,當成N = 128點的復(fù)數(shù)序列點的復(fù)數(shù)序列dn。其中,奇數(shù)地址是。其中
58、,奇數(shù)地址是dn的實部,偶的實部,偶數(shù)地址是數(shù)地址是dn的虛部。復(fù)數(shù)序列經(jīng)過位的虛部。復(fù)數(shù)序列經(jīng)過位倒序,存儲在數(shù)據(jù)處理緩沖器中倒序,存儲在數(shù)據(jù)處理緩沖器中 “fft-data”。2206h2207h2208h2209h220Ah220Bh22FFh2300ha02301ha12302ha22303ha32304ha42305ha523FFha2552200h2201h2202h2203h2204h2205h2306ha62307ha72308ha82309ha9230Aha10230Bha112206hr96=a1922207hi96=a1932208hr16=a322209hi16=a33
59、220Ahr80=a160220Bhi80=a16122FFhi127=a2552300ha02301ha12302ha22303ha32304ha42305ha523FFha2552200hr0=a02201hi0=a12202hr64=a1282203hi64=a1292204hr32=a642205hi32=a652306ha62307ha72308ha82309ha9230Aha10230Bha1122FEhr127=a25423FEha254bit_rev: STM #d_input_addr,ar3 ;在;在AR3中放入輸入地址中放入輸入地址 STM #fft_data,ar7 ;
60、在;在AR7中放入處理后輸出的地址中放入處理后輸出的地址 MVMM DATA_PROC_BUF,ar2 ; AR2中裝入第一個位倒序中裝入第一個位倒序 ; 數(shù)據(jù)指針數(shù)據(jù)指針 STM #K_FFT_SIZE-1,BRC STM #K_FFT_SIZE,ar0 ; AR0=輸入數(shù)據(jù)數(shù)目的一半輸入數(shù)據(jù)數(shù)目的一半(128) RPTB bit_rev_end MVDD *ar3+,*ar7+; 將原始輸入緩沖中的數(shù)據(jù)放入到將原始輸入緩沖中的數(shù)據(jù)放入到 ; 位倒序緩沖中去之后輸入緩沖位倒序緩沖中去之后輸入緩沖 ; (AR3)指針加指針加1, 位倒序緩沖位倒序緩沖(AR2)指指 ; 針也加針也加1 MVDD *ar
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 木牘教育課件語文
- 加油站管理經(jīng)驗分享
- 小學(xué)四年級數(shù)學(xué)幾百幾十數(shù)乘以一位數(shù)水平作業(yè)習(xí)題
- 兩位數(shù)加兩位數(shù)計算同步監(jiān)控訓(xùn)練題大全附答案
- 漿細胞性白血病的健康宣教
- 制劑生產(chǎn)技能培訓(xùn)
- 中葉綜合征的健康宣教
- 合同審批流程優(yōu)化效果評估管理制度
- 火災(zāi)逃生技能培訓(xùn)
- 遺傳性橢圓形紅細胞增多癥的健康宣教
- 2025年部門預(yù)算支出經(jīng)濟分類科目說明表
- 《陸上風電場工程概算定額》NBT 31010-2019
- 湖北省水功能區(qū)劃
- 維生素D教學(xué)講解課件
- 曾鞏《道山亭記》賞析
- 第十章 結(jié)算、轉(zhuǎn)資移交和工程驗收管理
- Copulas函數(shù)及其在水文中的應(yīng)用模板課件
- 國開電大《財務(wù)報表分析》形考完整答案
- DB45-T 2228.1-2020公路養(yǎng)護預(yù)算編制辦法及定額 第1部分:公路養(yǎng)護工程預(yù)算編制辦法及定額-(高清可復(fù)制)
- 艾滋病感染HIV篩查檢測報告表
- 全北京市二手房最低指導(dǎo)價
評論
0/150
提交評論