📄 cfft_32.asm
字号:
dadd *ar3, B ;B=PI QR
dadd *ar3+, B ;B=PI+QR QI
dsub *ar3, A ;A=PR QI
dsub *ar3-, A ;A=PR-QI QR
sth A, ASM, *ar3+ ;QRH'=(PR-QI)/2 QR
stl A, ASM, *ar3+ ;QRL'=(PR-QI)/2 QI
sth B, ASM, *ar3+ ;QIH'=(PI+QR)/2 QI
stl B, ASM, *ar3+ ;QIH'=(PI+QR)/2 QR+1
; Butterfly4
;===== QR*W (Q31) =====
ld #0, A
macsu *ar4-, *ar3+, A ;QRH*WL QRL WH
macsu *ar3-, *ar4, A ;QRH*WL + QRL*WH
ld A, -16, A ;A>>16
mac *ar4+, *ar3+, A ;A=QR*W QRL WL
sth A, *ar5+ ;Tempdw1=QR*W for later use
stl A, *ar5-
;======================
mar *ar3+ ;point to QI QR
;===== QI*W (Q31) =====
ld #0, B ;QIH*WL QIL WH
macsu *ar4-, *ar3+, B ;QIH*WL + QIL*WH
macsu *ar3-, *ar4, B ;B>>16
ld B, -16, B ;B=QI*W QI WL
mac *ar4+, *ar3-, B ;B=QI*W QI
sth B, *ar6+ ;Tempdw2=QI*W for later use
stl B, *ar6-
;======================
mar *ar3- ;point to QR again QR
sub B, A ;A=QR*W - QI*W
dadd *ar2, A ;A=PR+(QR*W - QI*W) PR
dld *ar2, B ;B=PR PR
sth A, ASM, *ar3+ ;QRH'=(PR+(QR*W + QI*W))/2 QR
stl A, ASM, *ar3+ ;QRL'=(PR+(QR*W + QI*W))/2 QI
sub B, A ;A=QR*W - QI*W
sub A, B ;B=PR-(QR*W - QI*W)
sth B, ASM, *ar2+ ;PRH'=((PR-(QR*W - QI*W))/2 PR
stl B, ASM, *ar2+ ;PRL'=((PR-(QR*W - QI*W))/2 PI
dld *ar5, B ;B=QR*W
dadd *ar6, B ;B=QR*W+QI*W
drsub *ar2, B ;B=PI-(QR*W+QI*W) PI
dld *ar2, A ;A=PI PI
sth B, ASM, *ar2+ ;PIH'=(PI-(QR*W + QI*W))/2 PI
stl B, ASM, *ar2+0 ;PIL'=(PI-(QR*W + QI*W))/2 PR+1
sub A, B ;B=-(QR*W + QI*W)
sub B, A ;A=PI+(QR*W + QI*W)
sth A, ASM, *ar3+ ;QIH'=(PI+(QR*W + QI*W))/2 QI
stl A, ASM, *ar3+0 ;QIL'=(PI+(QR*W + QI*W))/2 QR+1
fftStg3End
.if __far_mode
fret
.else
ret
.endif
;=============================================================================
; Function: fftStageX
;
; Description: General radix 2 stage of Complex FFT (double precision)
;
; Inputs: None
;
; Outputs: None
;
; Assumptions: Output will be in place of input.
;
;=============================================================================
; .global fftStageX
fftStageX:
.if __far_mode
mvdk *SP(2),BRC
.else
mvdk *SP(1),BRC
.endif
pshm AR0 ;save current offset index
mvmm ar6,ar4 ;start of cosine in stage 'stg'
mvmm ar7,ar5 ;start of sine in stage 'stg'
.if __far_mode
mvdk *SP(4),AR0 ;offset index for butterfly optimization
.else
mvdk *SP(3),AR0 ;offset index for butterfly optimization
.endif
;===== Butterfly starts here =====
dld *ar2, B ;B=PR PR
dsub *ar3, B ;B=PR-QR QR
dld *ar3, A ;A=QR QR
sth B, ASM, *ar3+ ;QRH'=(PR-QR)/2 QR
stl B, ASM, *ar3+ ;QRL'=(PR-QR)/2 QI
add A, 1, B ;B=PR+QR
sth B, ASM, *ar2+ ;PRH'=(PR+QR)/2 PR
stl B, ASM, *ar2+ ;PRL'=(PR+QR)/2 PI
dld *ar3, A ;A=QI QI
dadd *ar2, A, B ;B=PI+QI PI
sth B, ASM, *ar2+ ;PIH'=(PI+QI)/2 PI
stl B, ASM, *ar2+ ;PIH'=(PI+QI)/2 PR+1
sub A, 1, B ;B=PI-QI
rptbd BflyX ;delayed block repeat
sth B, ASM, *ar3+ ;QIH'=(PI-QI)/2 QI
stl B, ASM, *ar3+ ;QIH'=(PI-QI)/2 QR+1
;!!!!! rptb starts here !!!!!
;===== QR*WR (Q31) =====
ld #0, B
macsu *ar4-, *ar3+, B ;QRH*WRL QRL WRH
macsu *ar3+, *ar4, B ;QRH*WRL + QRL*WRH QI WRH
ld B, -16, B ;B>>16
;>>16 INTEGRATED INTO QI*WI FOR OPTIMIZATION
;FINAL MAC HAS BEEN MOVED AFTER QI*WI FOR OPTIMIZATION
;======================
;===== QI*WI (Q31) =====
ld #0, A
macsu *ar5-, *ar3+, A ;QIH*WIL QIL WIH
macsu *ar3-, *ar5, A ;QIH*WIL + QIL*WIH QIH WIH
ld A, -16, A ;A>>16
mac *ar5+, *ar3-, A ;A=QIH*WIH QRL WIL
;======================
mar *ar3- ;point to QR again QR
mac *ar4+, *ar3, B ;B+=QRH*WRH=QR*WR QR WRL
sub A, B ;B = (QR*WR - QI*WI)
dadd *ar2, B ;B=PR+(QR*WR - QI*WI) PR
dld *ar2, A ;A=PR PR
sth B, ASM, *ar2+ ;PRH'=(PR+(QR*WR - QI*WI))/2 PR
stl B, ASM, *ar2+ ;PRL'=(PR+(QR*WR - QI*WI))/2 PI
sub A, B ;B=QR*WR - QI*WI
sub B, A ;A=PR-(QR*WR - QI*WI)
;===== QR*WI (Q31) =====
ld #0, B
macsu *ar5-, *ar3+, B ;QRH*WIL QRL WIH
macsu *ar3+, *ar5, B ;QRH*WIL + QRL*WIH QIH WIH
;===== QI*WR (Q31) =====
macsu *ar4-, *ar3+, B ;QIH*WRL QIL WRH
macsu *ar3-, *ar4, B ;QIH*WRL + QIL*WRH QIH WRH
ld B, -16, B ;B>>16
mac *ar4+0%,*ar3-,B ;B=QIH*WRH, next WRL QIL WRL+1
mar *ar3- ; QRH
mac *ar5+0%,*ar3,B ;B=QRH*WIH, next WIL QRH WIL+1
;B=QIWR+QRWI
;======================
sth A, ASM, *ar3+ ;QRH'=(PR-(QR*WR - QI*WI))/2 QRL
stl A, ASM, *ar3+ ;QRL'=(PR-(QR*WR - QI*WI))/2 QIH
;======================
dadd *ar2, B ;B=PI+(QI*WR+QR*WI) PI
dld *ar2, A ;A=PI PI
sth B, ASM, *ar2+ ;PIH'=(PI+(QI*WR+QR*WI))/2 QI
stl B, ASM, *ar2+ ;PIL'=(PI+(QI*WR+QR*WI))/2 QR+1
sub A, B ;B=(QI*WR+QR*WI)
sub B, A ;A=PI-(QI*WR+QR*WI)
sth A, ASM, *ar3+ ;QIH'=(PI-(QI*WR+QR*WI))/2 PI
BflyX stl A, ASM, *ar3+ ;QIL'=(PI-(QI*WR+QR*WI))/2 PR+1
popm AR0 ;restore offset index
banzd fftStageX, *ar1-
mar *ar2+0
mar *ar3+0
;!!!!! Branch occurs here !!!!!
.if __far_mode
fret
.else
ret
.endif
;=============================================================================
; Function: fftButterfly
;
; Description: General radix 2 butterfly of Complex FFT (double precision)
;
; Inputs: None
;
; Outputs: None
;
; Assumptions: BRC has been initialized already.
; Output will be in place of input.
;
;=============================================================================
; .global fftButterfly
fftButterfly:
dld *ar2, B ;B=PR PR
dsub *ar3, B ;B=PR-QR QR
dld *ar3, A ;A=QR QR
sth B, ASM, *ar3+ ;QRH'=(PR-QR)/2 QR
stl B, ASM, *ar3+ ;QRL'=(PR-QR)/2 QI
add A, 1, B ;B=PR+QR
sth B, ASM, *ar2+ ;PRH'=(PR+QR)/2 PR
stl B, ASM, *ar2+ ;PRL'=(PR+QR)/2 PI
dld *ar3, A ;A=QI QI
dadd *ar2, A, B ;B=PI+QI PI
sth B, ASM, *ar2+ ;PIH'=(PI+QI)/2 PI
stl B, ASM, *ar2+ ;PIH'=(PI+QI)/2 PR+1
sub A, 1, B ;B=PI-QI
rptbd BflyEnd ;delayed block repeat
sth B, ASM, *ar3+ ;QIH'=(PI-QI)/2 QI
stl B, ASM, *ar3+ ;QIH'=(PI-QI)/2 QR+1
;!!!!! rptb starts here !!!!!
;===== QR*WR (Q31) =====
ld #0, B
macsu *ar4-, *ar3+, B ;QRH*WRL QRL WRH
macsu *ar3+, *ar4, B ;QRH*WRL + QRL*WRH QI WRH
ld B, -16, B ;B>>16
;>>16 INTEGRATED INTO QI*WI FOR OPTIMIZATION
;FINAL MAC HAS BEEN MOVED AFTER QI*WI FOR OPTIMIZATION
;======================
;===== QI*WI (Q31) =====
ld #0, A
macsu *ar5-, *ar3+, A ;QIH*WIL QIL WIH
macsu *ar3-, *ar5, A ;QIH*WIL + QIL*WIH QIH WIH
ld A, -16, A ;A>>16
mac *ar5+, *ar3-, A ;A=QIH*WIH QRL WIL
;======================
mar *ar3- ;point to QR again QR
mac *ar4+, *ar3, B ;B+=QRH*WRH=QR*WR QR WRL
sub A, B ;B = (QR*WR - QI*WI)
dadd *ar2, B ;B=PR+(QR*WR - QI*WI) PR
dld *ar2, A ;A=PR PR
sth B, ASM, *ar2+ ;PRH'=(PR+(QR*WR - QI*WI))/2 PR
stl B, ASM, *ar2+ ;PRL'=(PR+(QR*WR - QI*WI))/2 PI
sub A, B ;B=QR*WR - QI*WI
sub B, A ;A=PR-(QR*WR - QI*WI)
;===== QR*WI (Q31) =====
ld #0, B
macsu *ar5-, *ar3+, B ;QRH*WIL QRL WIH
macsu *ar3+, *ar5, B ;QRH*WIL + QRL*WIH QIH WIH
;===== QI*WR (Q31) =====
macsu *ar4-, *ar3+, B ;QIH*WRL QIL WRH
macsu *ar3-, *ar4, B ;QIH*WRL + QIL*WRH QIH WRH
ld B, -16, B ;B>>16
mac *ar4+0%,*ar3-,B ;B=QIH*WRH, next WRL QIL WRL+1
mar *ar3- ; QRH
mac *ar5+0%,*ar3,B ;B=QRH*WIH, next WIL QRH WIL+1
;B=QIWR+QRWI
;======================
sth A, ASM, *ar3+ ;QRH'=(PR-(QR*WR - QI*WI))/2 QRL
stl A, ASM, *ar3+ ;QRL'=(PR-(QR*WR - QI*WI))/2 QIH
;======================
dadd *ar2, B ;B=PI+(QI*WR+QR*WI) PI
dld *ar2, A ;A=PI PI
sth B, ASM, *ar2+ ;PIH'=(PI+(QI*WR+QR*WI))/2 QI
stl B, ASM, *ar2+ ;PIL'=(PI+(QI*WR+QR*WI))/2 QR+1
sub A, B ;B=(QI*WR+QR*WI)
sub B, A ;A=PI-(QI*WR+QR*WI)
sth A, ASM, *ar3+ ;QIH'=(PI-(QI*WR+QR*WI))/2 PI
BflyEnd stl A, ASM, *ar3+ ;QIL'=(PI-(QI*WR+QR*WI))/2 PR+1
.if __far_mode
fret
.else
ret
.endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -