指令功能與程序設(shè)計實驗
實驗?zāi)康?br> 1、 熟悉開發(fā)軟件的使用,了解程序的完整的調(diào)試過程;
2、 掌握DSP匯編語言編程及調(diào)試方法。
實驗要求
按照下面的實驗內(nèi)容建立新工程,調(diào)試程序,并驗證結(jié)果。
一、定點除法
在通用DSP芯片中,一般不提供單周期的除法指令,為此必須采用除法子程序來實現(xiàn)。二進制除法是乘法的逆運算。乘法包括一系列的移位和加法,而除法可分解為一系列的減法和移位。下面來說明除法的實現(xiàn)過程。
設(shè)累加器為8位,且除法運算為10除以3。除的過程就是除數(shù)逐步移位并與被除數(shù)比較的過程,如果能減則將位插入商中。
(1) 除數(shù)的最低有效位對齊被除數(shù)的最高有效位。
00001010
- 00011000
11110010
(2) 由于減法結(jié)果為負(fù),放棄減法結(jié)果,將被除數(shù)左移一位再減。
00010100
- 00011000
11111000
(3) 結(jié)果仍為負(fù),放棄減法結(jié)果,被除數(shù)左移一位再減。
00101000
- 00011000
00010000
(4) 結(jié)果為正,將減法結(jié)果左移一位后加1,作最后一次減。
00100001
- 00011000
00001001
(5) 結(jié)果為正,將結(jié)果左移一位加1得最后結(jié)果。高4位代表余數(shù),低4位表示商。
00010011
即商為0011=3,余數(shù)為0001=1。
TMS320沒有專門的除法指令,但使用條件減指令SUBC可以完成有效靈活的除法功能。使用這一指令的唯一限制是兩個操作數(shù)必須為正。程序員必須事先了解其可能的運算數(shù)的特性,如其商是否可以用小數(shù)表示及商的精度是否可被計算出來。這里每一種考慮可影響如何使用SUBC指令的問題。下面給出兩種不同情況下的除法程序。
(1) 分子小于分母
;=================================================
分子小于分母除法
文件名DIV_A.ASM
;=================================================
title "DIV_A"
include "vectors.h"
def _c_int0
bss NUMERA,1
bss DENOM,1
bss TEMSGN,1
bss QUOT,1
_c_int0: LDP #6H
LT NUMERA
MPY DENOM
PAC
SACH TEMSGN ;取商的符號
LAC DENOM
ABS
SACL DENOM ;使分母為正
ZALH NUMERA ;使分子為正
ABS
RPTK 14
SUBC DENOM ;除循環(huán)15次
SACL QUOT
LAC TEMSGN
BGEZ DONE ;若符號為正,則完成
ZAC
SUB QUOT
SACL QUOT ;若為負(fù),則商為負(fù)
DONE: B DONE
PHANTOM: RET
.end
這個程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN為暫存單元。
(2) 分子大于分母,規(guī)定商的精度
;===========================================
;文件名DIV_B.ASM
;===========================================
.title "DIV_B"
.include "vectors.h"
.def _c_int0
.bss NUMERA,1
.bss DENOM,1
.bss TEMSGN,1
.bss QUOT,1
.bss FRAC,1
FRAC .set 0ch ;規(guī)定商的精度
_c_int0:
LDP #6H
LT NUMERA
MPY DENOM
PAC
SACH TEMSGN ;取商的符號
LAC DENOM
ABS
SACL DENOM ;使分母為正
LACK 15
ADD FRAC
SACL FRAC ;計算循環(huán)計數(shù)器
LAC NUMERA
ABS ;使分子為正
RPT FRAC
SUBC DENOM ;除循環(huán)16+FRAC次
SACL QUOT
LAC TEMSGN
BGEZ DONE ;若符號為正,則完成
ZAC
SUB QUOT
SACL QUOT ;若為負(fù),則商為負(fù)
DONE: B DONE
PHANTOM: RET
.end
與DIV_A相同,這個程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN為暫存單元。FRAC中規(guī)定商的精度,如商的精度為Q13,則調(diào)用程序前FRAC單元中的值應(yīng)為13。
二、采用查表和線性插值法求正弦值
采用查表和線性插值法求正弦值。以下給出線性插值的圖形和具體的算式。
圖3-1 線性插值法
計算一個角度的正弦值
輸入:0~360角度值(對應(yīng)0H~FFFFH)存放在內(nèi)部300H單元;輸出:SIN(角度)*32767,格式Q15,存放在301H單元。
;========================================
; 文件名sine.asm
;========================================
.include "F2407REGS.H"
.mmregs
.def SIN
.def _ c_int0
.sect "vectors"
.bss angle,1
.bss RESULT,1
b _c_int0
;=========================================
;主程序
;========================================
.text
_c_int0:
.
.
LAR AR1,#60H
MAR *,AR1
LACC #4000H ;π/2
SACL *+
CALL SIN
b $
;===================================================
;SINE子程序
;輸入:0~360角度值(對應(yīng)0H~FFFFH)存放在內(nèi)部300H單元
;輸出:SIN(角度)*32767,格式Q15,存放在301H單元
;==================================================
SIN
LDP #6H
LT angle ;取變量 (x)
MAR *+
LACC #64H
SACL *
MPYU * ;
PAC
SACH *+
SACL *
LACC *,15
AND #0FFFFH,15
SACH *-
BCND equal_sin,eq
LACC #Table_sin ;表格的其始地址
ADD *-
TBLR *+ ;yi
ADD #1H
TBLR * ;裝載yi+1的值
LACC *-
SUB *+ ;yi+1-yi
SACL *+
LT *-
MPY *
SPH *- ;在yi+1和yi之間插值
LACC *+
ADD *,1
LDP #6H
SACL RESULT ;存結(jié)果
RET
equal_sin
LACC #Table_sin ;表格的其始地址
ADD *- ;指向表格的索引的地址
TBLR *
LACC *+
LDP #6H
SACL RESULT ;存結(jié)果
end_interp_sin
RET
Table_sin .include "sine.tab"
Table_sin_end
.end
sine.tab
;====================================================
;Table_sin
;====================================================
.word 0
.word 2057
.word 4107
.word 6140
.word 8149
.word 10126
.word 12062
.word 13952
.word 15786
.word 17557
.word 19260
.word 20886
.word 22431
.word 23886
.word 25247
.word 26509
.word 27666
.word 28714
.word 29648
.word 30466
.word 31163
.word 31738
.word 32187
.word 32509
.word 32702
.word 32767
.word 32702
.word 32509
.word 32187
.word 31738
.word 31163
.word 30466
.word 29648
.word 28714
.word 27666
.word 26509
.word 25247
.word 23886
.word 22431
.word 20886
.word 19260
.word 17557
.word 15786
.word 13952
.word 12062
.word 10126
.word 8149
.word 6140
.word 4107
.word 2057
.word 0
.word -2057
.word -4107
.word -6140
.word -8149
.word -10126
.word -12062
.word -13952
.word -15786
.word -17557
.word -19260
.word -20886
.word -22431
.word -23886
.word -25247
.word -26509
.word -27666
.word -28714
.word -29648
.word -30466
.word -31163
.word -31738
.word -32187
.word -32509
.word -32702
.word -32767
.word -32702
.word -32509
.word -32187
.word -31738
.word -31163
.word -30466
.word -29648
.word -28714
.word -27666
.word -26509
.word -25247
.word -23886
.word -22431
.word -20886
.word -19260
.word -17557
.word -15786
.word -13952
.word -12062
.word -10126
.word -8149
.word -6140
.word -4107
. word -2057
三、 FIR濾波器的定點DSP實現(xiàn)
TMS320定點DSP芯片所提供的單周期乘/累加帶數(shù)據(jù)移動指令和較大的片內(nèi)RAM空間,使數(shù)字濾波器每個濾波樣值的計算可以在一個周期內(nèi)完成。TMS320LF2407內(nèi)部具有三個片內(nèi)的DARAM,分為B0、B1和B2三塊。其中B0塊(256字)可以用軟件編程為數(shù)據(jù)區(qū)(CNFD)或程序區(qū)(CNFP),執(zhí)行CNFP后,B0塊映射到程序區(qū)的FF00H~FFFFH。采用高效的MACD指令,必須用片內(nèi)RAM,其中B0塊必須配置為程序區(qū)。
采用MACD指令結(jié)合RPTK指令就可以實現(xiàn)單周期的濾波樣值計算:
RPTK N-1
MACD(程序地址),(數(shù)據(jù)地址)
其中,RPTK N-1指令將立即數(shù)N-1(要求不大于255)裝入到重復(fù)計數(shù)器,使下一條指令重復(fù)執(zhí)行N次。MACD指令實現(xiàn)下列功能:
(1)將程序在儲器地址裝入到程序計數(shù)器;(2)將存于數(shù)據(jù)區(qū)(B1塊)的數(shù)據(jù)乘以程序區(qū)(B0塊)的數(shù)據(jù);(3)將上次的乘積加到累加器;(4)移動數(shù)據(jù),將B1塊中的數(shù)據(jù)向高地址移動一個地址;(5)每次累加后,程序計數(shù)器加1,指向下一個單位脈沖響應(yīng)樣值。
為了使用MACD指令,輸入樣值x(n)和濾波器系數(shù)h(n)必須合理地進行存放。圖3.2是輸入樣值x(n)和濾波器系數(shù)h(n)在TMS320LF2407內(nèi)存中的一種存放方法,以下是高效實現(xiàn)FIR濾波方程的匯編程序。
B0塊 B1塊
|
? |
x(n) |
? | |
┇ |
x(n-1) |
? | ||
|
? | |||
h(1) |
? | |||
h(0) |
x[n-(N-1) |
? |
?
圖3.2 TMS320LF2407的存儲器組織方法
;N階FIR濾波的TMS320LF2407程序
;y(n)=x(n-(N-1))h(N-1)+x(n-(N-2))h(N-2)+…+x(n)h(n)
;
CNFP ;B0塊配置為程序區(qū)
NEXT IN XN,PA0 ;從PA0口取一個樣值
LARP AR1
LRLK AR1,3FFH ;AR1指向B1塊的底部
MPYK 0 ;P寄存器清零
ZAC ;ACC清零
RPTK N-1 ;重復(fù)N-1次
MACD FF00H,*- ;乘/累加
APAC
SACH YN,1
OUT YN,PA1 ;輸出濾波器響應(yīng)y(n)至PA1口
B NEXT ;做下一點濾波
移序說明:
(1)FIR濾波器系數(shù)h(0),…,h(N-1)均小于1,可用Q15表示;
(2)輸入待濾波樣值從PA0口得到,直接送到x(n)對應(yīng)的存儲單元;
(3)濾波后的樣值由SACH YN,1指令送至YN存儲單元。由于濾波器系數(shù)用Q15表示,因此乘累加后在ACC中的值也是Q15,左移1位并取高16位后得到的數(shù)應(yīng)與輸入的樣值具有相同的Q值了;
(4)濾波后的樣值在PA1口輸出;
(5)一點濾波結(jié)束后,由于MACD指令的作用,所有的輸入樣值均向高地址移動一個位置,即x[n-(N-2)]移動到x[n-(N-1) ]的位置,x[n-(N-3)]移動到x[n-(N-2)]位置,……,x(n)移動到x(n-1)的位置,從而為下一點濾波做好準(zhǔn)備。
四、IIR濾波器的定點DSP實現(xiàn)
在IIR濾波器結(jié)構(gòu)中,直接II型結(jié)構(gòu)是最常用的濾波器結(jié)構(gòu),因為這種結(jié)構(gòu)的二階形式可作為有級聯(lián)型和并聯(lián)型結(jié)構(gòu)中的基本節(jié)。二階直接II型結(jié)構(gòu)IIR濾波器如圖3.3所示。
圖3.3 二階直接II型IIR濾波器
二階直接II型結(jié)構(gòu)濾波器的差分方程為:
d(n)=x(n)+a1d(n-1)+a2d(n-2)
y(n)=b0d(n)+b1d(n-1)+b2d(n-2)
式中,d(n)、d(n-1)、d(n-2)對應(yīng)于圖中具有不同延遲的中間節(jié)點值。以下是實現(xiàn)二階直接II型IIR濾波器的匯編程序。
本程序?qū)崿F(xiàn)一個二階直接II型IIR濾波器
NEXT IN XN,PA0;從PA0口輸入一個樣值
LAC XN,15 ;ACC=x(n)
LT DN1 ;T=d(n-1)
MPY A1 ;P=a1*d(n-1)
LTA DN2 ;ACC=x(n)+a1*d(n-1),T=d(n-2)
MPY A2 ;P=a2*d(n-2)
APAC ;ACC=x(n)+a1*d(n-1)+a2*d(n-2)
SACH DN,1 ;d(n)=x(n)+a1*d(n-1)+a2*d(n-2)
ZAC ;ACC=0
MPY B2 ;P=b2*d(n-2)
LTD DN1 ;T=d(n-1),ACC=b2*d(n-2),d(n-2)=d(n-1)
MPY B1 ;P=b1*d(n-1)
LTD DN ;T=d(n), ACC=b2*d(n-1)+b1*d(n-1),d(n-1)=d(n)
MPY B0 ;p=b0*d(n)
APAC ;ACC=b2*d(n-2)+b1*d(n-1)+b0*d(n)
SACH YN,1 ;y(n)=b0*d(n)+b1*d(n-1)+b0*d(n)
OUT YN,PA1 ;輸出濾波樣值至PA1口
B NEXT
程序說明:
(1)在這個例子中,DN、DN1和DN2分別是二階基本節(jié)中三個中間延遲節(jié)點d(n)、d(n-1)和d(n-2)的存儲器單元,三個存儲單元占據(jù)三個連續(xù)的存儲空間,DN在低地址,DN2在高地址,DN1在中間。這是為了保證連續(xù)濾波時d(n)、d(n-1)、d(n-2)三個中間結(jié)果正確的存儲位置。一點濾波結(jié)束后,由于LTD指令的作用,d(n)移動到d(n-1)、d(n-1)移動到d(n-2),為下一點濾波做好準(zhǔn)備。
(2)A1、A2和B0、B1、B2分別是濾波器系數(shù)a1、a2和b0、b1、b2對應(yīng)的存儲單元;
(3)XN為新輸入樣值x(n)的存儲單元,YN為濾波后輸出樣值y(n)對應(yīng)的存儲單元;
(4)濾波器的五個濾波器系數(shù)均小于1,用Q15表示;
(5)濾波器的輸入樣值從PA0口輸入,LAC XN,15指令將輸入樣值x(n)左移15位后送入累加器ACC,這是為了與下面乘積相加時保證小數(shù)點對齊;
(6)SACH DN,1和SACH YN,1指令將ACC中的值左移1位,并將高16位存入d(n)和y(n)。假設(shè)x(n)的Q值為0,左移15位后送入ACC,相當(dāng)于Q15,與乘積相加后的值也為Q15。左移1位相當(dāng)于得到Q 16的數(shù),而將高16位直接存入d(n)和y(n)又相當(dāng)于將結(jié)果右移16位。因此d(n)和y(n)的Q值又變?yōu)?,從而與x(n)的Q值一致。
程序的出口參數(shù):t=kT時的控制量u(k);
程序中用到的資源:PID的三個參數(shù)Kp、Ki、Kd,t=(k-1)T時的控制量u(k-1),t=(k-2)T、t=(k-1)T、t=kT時的誤差e(k-2)、e(k-1)、e(k),VCC、SXM、TREG、PREG以及三個臨時單元PIDTMP1、PIDTMP2、PIDTMP3;
說明:程序中用到的參數(shù)規(guī)格化格式在程序注釋欄中標(biāo)明,如Q15×32表示該參數(shù)是被規(guī)格化為Q15格式值乘以32得到。
;=====================================================
;文件名:PID.asm
;======================================================?
.title "PID"
.include "vectors.h"
.def _c_int0
.bss V,1
.bss VE2,1
.bss VE1,1
.bss VE0,1
.bss PIDTMP1,1
.bss PIDTMP2,1
.bss PIDTMP3,1
.bss KP,1
.bss KI,1
.bss KD,1
.bss U,1
VREF .set 00FFh
_c_int0: LDP #4H ;數(shù)據(jù)頁4 200h~0280h
SETC SXM ;允許符號擴展
LACL VREF ;Vref,Q.15*256
SUB V ;V,Q.15*256
SACL VE2 ;e(k)= Vref-V,Q15*256
SUB VE1 ;e(k-1),Q15*256
SACL PIDTMP1 ;Delta(e(k))=e(k)-e(k-1),Q15/256
SUB VE1
ADD VE0 ;e(k-2),Q15*256
SACL PIDTMP3 ;Delta(e(k)) -Delta(e(k-1))= e(k)-2e(k-1)+e(k-2)
;Q15*256
LT KP ;Kp,Q15*32
MPY PIDTMP1
PAC ;Kp*Delta(e(k)),Q30*8192
RPT #4
SFL ;Kp*Delta(e(k)),Q30*256
SACH PIDTMP1,1 ;Kp*Delta(e(k)),Q15*256
LT KI ;Ki,Q15*32
MPY VE2
PAC ;Ki*e(k),Q30*8192
RPT #4
SFL ;Ki*e(k),Q30*256
SACH PIDTMP2,1 ;Ki*e(k),Q15*256
LT KD ;Kd,Q15*32
MPY PIDTMP3
PAC ;Kd* Delta(e(k))-Delta(e(k-1)),Q30*8192
RPT #4
SFL ;Kd* Delta(e(k))-Delta(e(k-1)),Q30*256
SACH PIDTMP3,1 ;Kd* Delta(e(k))-Delta(e(k-1)),Q15*256
LACL U ;u(k-1),Q15*256
ADD PIDTMP1
ADD PIDTMP2
ADD PIDTMP3
SACL U ;u(k),Q15*256
SUB #4B00H ;150V,Q15*256
BCND PID1,LEQ
SPLK #4A3DH,U ;上限幅
B PID2
PID1: BIT U,0
BCND PID2,NTC
SPLK #0,U ;下限幅
PID2: LACL VE1 ;平移保存
SACL VE0 ;e(k-2)=e(k-1)
LACL VE2
SACL VE1 ;e(k-1)=e(k)
DONE: B DONE
PHANTOM: RET
.end
六、FFT的定點DSP實現(xiàn)
基2的DIT FFT的蝶形如下圖
圖3-4 基2的DIT FFT的蝶形運算
考慮N點FFT第m級的基2碟形,輸出可以表示為:
KN Pm+1=Pm+ W Q
kN Qm+1=Pm- W Qm
這里,Pm和Qm是輸入,Pm+1和Qm+1是輸出。一般的,Pm,Qm,Pm+1和Qm+1與蝶形因子一樣是復(fù)數(shù)。蝶形因子可以表示為:
KN W =e-j(2π/N)k=cos(x)-jsin(x)
式中,X=(2π/N)k。這樣Pm和Qm可以用實部和虛部表示為:
Pm=PR+jPI
Qm=QR+jQI
由上兩式可得:
Pm+1=PR+ jPI+[QRcos(x)+QIsin(x)]+j[QIcos(x)-QRsin(x)]
=[PR+QRcos(x)+QIsin(x)]+j[PI+QIcos(x)-QRsin(x)]
Qm+1=PR+ jPI-[QRcos(x)+QIsin(x)]-j[QIcos(x)-QRsin(x) ]
=[PR-QRcos(x)-QIsin(x)+j[PI-QIcos(x)+QRsin(x) ]
假設(shè)每個蝶形的輸入用Q15表示,幅度小于1,則上式輸出的最大幅度為
1+ 1sin(45°)+1cos(45°)=2.414213562
為了避免溢出,可在FFT的每一級用因子2.414213562進行歸一化。但是,每一級用這樣的一個因子歸一化勢必增加運算量。考慮到大多數(shù)情況屬是實數(shù)FFT,最大幅度不超過2,因此可在每一級用因子2進行歸一化。運用DSP芯片的移位特性,用2歸一化不增加任何運算量。這樣,如果FFT包含M級,則輸出相當(dāng)于除以2M=N,其中N為FFT的長度。
FFT的運算時間往往被用來衡量DSP芯片性能的一個重要指標(biāo),因此,提高FFT的運算速度也是非常重要的。在用DSP芯片實現(xiàn)FFT算法時,應(yīng)充分利用DSP芯片所提供的各種軟硬件資源。例如對于TMS320LF2407,可供利用的一些資源包括:(1)片內(nèi)RAM,片內(nèi)B0和B1塊可以實現(xiàn)256點復(fù)數(shù)FFT;(2)比特反轉(zhuǎn)尋址方式,這種尋址方式是專門為FFT運算提供的。
下面是一個8~256點基2復(fù)數(shù)FFT的TMS320 LF2407匯編程序。
程序說明:
(1)數(shù)據(jù)頁指針DP=0
(2)用到的寄存器:AR0、AR1、AR2、AR3
(3)輸入?yún)?shù):N、M、WKAD、NOM
其中,N=FFT的點數(shù),M=Log2(N),WKAD為系數(shù)的存放地址;
32點FFT:N=32,M=5,WKAD=WK32;
64點FFT:N=64,M=6,WKAD=WK64;
128點FFT:N=128,M=7,WKAD=WK128;
256點FFT:N=256,M=8,WKAD=WK256;
NOM:控制FFT運算是否進行歸一化
(4)調(diào)用FFT子程序前輸入數(shù)據(jù)已經(jīng)存放在INDATR、INDATI,存放順序為:
實部:在INDATR,按順序存放
虛部:在INDATI,按順序存放
.title "fft"
.include "vectors.h"
.global _c_int0
INPUT .equ 200h ;FFT運算時輸入數(shù)據(jù)的位置
INDATR .equ 9000h ;輸入數(shù)據(jù)實部存放地址
INDATI .equ 9100h ;輸入數(shù)據(jù)虛存放地址
SINTAB .equ 9200h ;系數(shù)表在內(nèi)存中的地址
;內(nèi)部存儲器定義:
N .equ 118 ;FFT點數(shù)
M .equ 119 ;pow(2,M)=N
WKAD .equ 120 ;系數(shù)的起始地址
NOM .equ 121 ;歸一化(0),不歸一化(1)
IW .equ 122 ;系數(shù)增量
XT .equ 123 ;暫存
YT .equ 124 ;暫存
ID .equ 125 ;DISTANT BETWEEN 2 COMPUTING DATAS
C1 .equ 126 ;循環(huán)計數(shù)器
C2 .equ 127 ;循環(huán)計算器
.text
_c_int0:
LDP #0H
SETC INTM
LALK 256
SACL N
LACK 8
SACL M
LACK 0
SACL NOM
LALK WK256
LRLK AR1,SINTAB
RPTK 255
TBLR *+,AR1 ;將系數(shù)表調(diào)入SINTAB開始的RAM中
CALL FFT ;作FFT運算
HERE: B HERE
;以下是FFT子程序
FFT: LDP 0
LACC M
SUBK 1
SACL M ;M=M-1
LARP AR1
LALK SINTAB
SACL WKAD
FFT1: LAR AR0,N
LAC N
SUBK 1
SACL N ;N=N-1
LARP AR1
;將輸入數(shù)據(jù)調(diào)入片內(nèi)RAM,存放順序為:實部、虛部;實部、虛部;……
LRLK AR2,INPUT
LRLK AR1,INDATR
LAR AR3,N
MF1: LAC *+,0,AR1
SACL *BR0+,0,AR3
BANZ MF1,*-,AR2
LRLK AR1,INDATI
LAR AR3,N
MF2: LAC *+,0,AR1
SACL *BR0+,0,AR3
BANZ MF2,*-,AR2
SOVM
SSXM ;符號擴展
SPM 1 ;結(jié)果左移一位
LACK 1
SACL ID ;ID=1
LAC N
ADDK 1
SACL IW,1 ;IW=2*N
LAR AR2,M
LOOP3: LRLK AR1,INPUT ;AR1=INPUT P.X
LAC ID,1
SACL ID ;ID=2*ID=2
LAC IW ;IW=IW/2=N
LAC IW,15
SACH C2 ;C2=IW/2=N/2
LAR AR0,ID
LOOP2: LAR AR3,WKAD ;AR3指向WK的起始地址
LAC ID,15
SACH C1 ;C1=ID/2=1
MAR *0+,AR3 ; AR1=AR1+D→Q.X
LOOP1: ZAC
LT *+,AR1
MPY *+,AR3
LT *,AR1
MPYA *-,AR3
SPAC
SACH XT ;XT=Q.X*COS-Q.Y*SIN
ZAC
LT *-,AR1
MPY *+,AR3
LT *,AR1
MPYA *-
APAC
SACH YT ;YT=Q.X*SIN+Q.Y*COS
LAC NOM
BNZ D2 ;IF NOM=1 歸一化
*********A_BEGIN ************ ;else 不歸一化
MAR *0- ;(AR1)=P.X
LAC *
ADD XT
SACL *0+ ;P.X=XT+P.X
SUB XT,1
SACL *+ ;Q.X=P.X-XT;(AR1)=Q.Y
MAR *0- ;(AR1)=P.Y
LAC *
ADD YT
SACL *0+ ;P.Y+YT
SUB YT,1
SACL *+,0,AR3 ;Q.Y=P.Y-YT
B D ;(AR1)=Q.Y+1→NEXT Q.X
********A_END************
********B_BEGIN**********
D2: MAR *0- ;(AR1)=P.X
LAC *,15
ADD XT,15
SACH *0+ ;P.X=(XT+P.X)/2
SUBH XT
SACH *+ ;Q.X=(P.X-XT)/2;(AR1)=Q.Y
MAR *0- ;(AR1)=P.Y
LAC *,15
ADD YT,15
SACH *0+ ;P.Y=(P.Y+YT)/2
SUBH YT
SACH *+,0,AR3 ;Q.Y=*(P.Y-YT)/2
;(AR1)=Q.Y+1→NEXT Q.X
****** B_END ******
D: LAR AR0,IW
MAR *0+ ;(AR3)=(AR3)+IW→WK.COS
LAR AR0,ID ;(AR0)=ID
LAC C1
SUBK 1
SACL C1 ;C1=C1-1
BGZ LOOP1
LAC C2
SUBK 1
SACL C2 ;C2=C2-1
BGZ LOOP2
LARP AR2
BANZ LOOP3,*-,AR1
RET
;上述程序中,當(dāng)NOM為1時,F(xiàn)FT運算進行歸一化,否則不進行歸一化。其中,A_BEGIN到A_END之間的程序為不需要歸一化的程序,而B_BEGIN到B_END之間的程序為需要歸一化的程序。FFT的運算結(jié)果在200H~(200H+2*N-1)的片內(nèi)
;以下是8點~256點FFT系數(shù)表,存放順序為cos,sin;cos;cos,sin;…
.data
WK8 .equ $
.word 07fffh,00h,05a82h,0a57eh,00h,08001h,0a57eh,0a57eh
WK16 .equ $
.word 07fffh,00h,07642h,0cf05h,05a82h,0a57eh,030fch,089bfh
.word 00h,08001h,0cf04h,089bfh,0a57eh,0a57eh,089beh,0cf05h
WK32 .equ $
.word 07fffh,00h,07d8ah,0e708h,07642h,0cf05h,06a6eh,0b8e4h
.word 05a82h,0a57eh,0471dh,09593h,030fch,089bfh,018f9h,08276h
.word 00h,08001h,0e707h,08276h,0cf04h,089bfh,0b8e3h,09593h
.word 0a57eh,0a57eh,09592h,0b8e4h,089beh,0cf05h,08276h,0e708h
WK64 .equ $
.word 07fffh,00h,07f62h,0f375h,07d8ah,0e708h,07a7dh,0dad8h
.word 07642h,0cf05h,070e3h,0c3aah,06a6eh,0b8e4h,062f2h,0aecdh
.word 05a82h,0a57eh,05134h,09d0eh,0471dh,09593h,03c57h,08f1eh
.word 030fch,089bfh,02528h,08583h,018f9h,08276h,0c8ch,0809eh
.word 00h,08001h,0f374h,0809eh,0e707h,08276h,0dad8h,08583h
.word 0cf04h,089bfh,0c3a9h,08f1eh,0b8e3h,09593h,0aecch,09d0eh
.word 0a57eh,0a57eh,09d0eh,0aecdh,09592h,0b8e4h,08f1dh,0c3aah
.word 089beh,0cf05h,08583h,0dad8h,08276h,0e708h,0809eh,0f375h
WK128 .equ $
.word 07fffh,00h,07fd9h,0f9b9h,07f62h,0f375h,07e9dh,0ed38h
.word 07d8ah,0e708h,07c2ah,0e0e7h,07a7dh,0dad8h,07885h,0d4e1h
.word 07642h,0cf05h,073b6h,0c946h,070e3h,0c3aah,06dcah,0be32h
.word 06a6eh,0b8e4h,066d0h,0b3c1h,062f2h,0aecdh,05ed7h,0aa0bh
.word 05a82h,0a57eh,055f6h,0a129h,05134h,09d0eh,04c40h,09931h
.word 0471dh,09593h,041ceh,09236h,03c57h,08f1eh,036bah,08c4bh
.word 030fch,089bfh,02b1fh,0877ch,02528h,08583h,01f1ah,083d7h
.word 018f9h,08276h,012c8h,08163h,0c8ch,0809eh,0648h,08028h
.word 00h,08001h,0f9b8h,08028h,0f374h,0809eh,0ed38h,08163h
.word 0e707h,08276h,0e0e6h,083d7h,0dad8h,08583h,0d4e1h,0877ch
.word 0cf04h,089bfh,0c946h,08c4bh,0c3a9h,08f1eh,0be32h,09236h
.word 0b8e3h,09593h,0b3c0h,09931h,0aecch,09d0eh,0aa0ah,0a129h
.word 0a57eh,0a57eh,0a129h,0aa0bh,09d0eh,0aecdh,09930h,0b3c1h
.word 09592h,0b8e4h,09236h,0be32h,08f1dh,0c3aah,08c4ah,0c946h
.word 089beh,0cf05h,0877bh,0d4e1h,08583h,0dad8h,083d6h,0e0e7h
.word 08276h,0e708h,08163h,0ed38h,0809eh,0f375h,08027h,0fb9h
WK256 .equ $
.word 07fffh,00h,07ff6h,0fcdch,07fd9h,0f9b9h,07fa7h,0f69h
.word 07f62h,0f375h,07f0ah,0f055h,07e9dh,0ed38h,07e1eh,0ea1eh
.word 07d8ah,0e708h,07ce4h,0e3f5h,07c2ah,0e0e7h,07b5dh,0ddddh
.word 07a7dh,0dad8h,0798ah,0d7dah,07885h,0d4e1h,0776ch,0d1efh
.word 07642h,0cf05h,07505h,0cc22h,073b6h,0c946h,07255h,0c674h
.word 070e3h,0c3aah,06f5fh,0c0e9h,06dcah,0be32h,06c24h,0bb86h
.word 06a6eh,0b8e4h,068a7h,0b64ch,066d0h,0b3c1h,064e9h,0b141h
.word 062f2h,0aecdh,060ech,0ac65h,05ed7h,0aa0bh,05cb4h,0a7beh
.word 05a82h,0a57eh,05843h,0a34ch,055f6h,0a129h,0539bh,09f14h
.word 05134h,09d0eh,04ec0h,09b18h,04c40h,09931h,049b4h,0975ah
.word 0471dh,09593h,0447bh,093dch,041ceh,09236h,03f17h,090a1h
.word 03c57h,08f1eh,0398dh,08dabh,036bah,08c4bh,033dfh,08afch
.word 030fch,089bfh,02e11h,08894h,02b1fh,0877ch,02827h,08676h
.word 02528h,08583h,02224h,084a3h,01f1ah,083d7h,01c0ch,0831dh
.word 018f9h,08276h,015e2h,081e3h,012c8h,08163h,0fabh,080f7h
.word 0c8ch,0809eh,096bh,08059h,0648h,08028h,0324h,0800ah
.word 00h,08001h,0fcdch,0800ah,0f9b8h,08028h,0f695h,08059h
.word 0f374h,0809eh,0f055h,080f7h,0ed38h,08163h,0ea1eh,081e3h
.word 0e707h,08276h,0e3f4h,0831dh,0e0e6h,083d7h,0dddch,084a3h
.word 0dad8h,08583h,0d7d9h,08676h,0d4e1h,0877ch,0d1efh,08894h
.word 0cf04h,089bfh,0cc21h,08afch,0c946h,08c4bh,0c673h,08dabh
.word 0c3a9h,08f1eh,0c0e9h,090a1h,0be32h,09236h,0bb85h,093dch
.word 0b8e3h,09593h,0b64ch,0975ah,0b3c0h,09931h,0b140h,09b18h
.word 0aecch,09d0eh,0ac65h,09f14h,0aa0ah,0a129h,0a7bdh,0a34ch
.word 0a57eh,0a57eh,0a34ch,0a7beh,0a129h,0aa0bh,09f14h,0ac65h
.word 09d0eh,0aecdh,09b17h,0b141h,09930h,0b3c1h,09759h,0b64ch
.word 09592h,0b8e4h,093dch,0bb86h,09236h,0be32h,090a1h,0c0e9h
.word 08f1dh,0c3aah,08dabh,0c674h,08c4ah,0c946h,08afbh,0cc22h
.word 089beh,0cf05h,08894h,0d1efh,0877bh,0d4e1h,08676h,0d7dah
.word 08583h,0dad8h,084a3h,0ddddh,083d6h,0e0e7h,0831ch,0e3f5h
.word 08276h,0e708h,081e2h,0ea1eh,08163h,0ed38h,080f6h,0f055h
.word 0809eh,0f375h,08059h,0f696h,08027h,0f9b9h,0800ah,0fcdch
PHANTOM RET
.end
評論
查看更多