📄 example 3-45.asm
字号:
; Example 3 - 45. FCT ASM Listing for the TMS320C3x DSP
*
* A PPENDIX E1
*
* A FAST COSINE TRANSFORM
*
* BASED ON THE ALGORITHM OUTLINED BY BYEONG GI LEE IN THIS ARTICLE, FCT - A
* FAST CISUBE TRANSFORM, PUBLISHED IN THE PROCEEDING OF THE IEEE INTER-
* NATIONAL CONFERENCE ON ACOUSTIC, SPEECH, AND SIGNAL PROCESSING, SAN
* DIEGO, CA, MARCH 1984, P28A.3/1-4 VOL. 2,(CH1954-5/84/0000-0299).
*
* LEE'S ALGORITHM HAS BEEN MODIFIED TO ALLOW NATURAL ORDER TIME DOMAIN
* COEFFICIENTS RATHER THAN THE LESS ORDERED IMPUT SUGGESTED IN HIS ARTICLE.
*
* THE FREQUENCY DOMAIN COEFFICNENT ARE IN BIT REVERSE ORDER. THIS IS AN
* PLACE CALCULATION
*
* AUTHER: PAUL WILHELM
*
*
.global FCT ; FAST COSINE TRANSFORM ENTRY POINT.
.global M ; LENGTH OF DATA ENTRY.
.global COS_TAB ; TABLE OF COSINE COEFFICIENTS.
.global COEFF ; TABLE OF INPUT DATA.
*
.text
*
FCTSIZE .word M
_COS .word COS_TAB
_DATA .word COEFF
*
FCT:
LDI @FCTSIZE, ARO ; LOAD DATA LENGTH
LDI @FCTSIZE, BK ; SET BLOCK SIZE FOR CIRCULAR
* ; ADDRESS
LDI @_DATA, AR6 ; LOAD DATA POINTER.
LDI @_COS, AR7 ; LOAD COSINE TABLE POINTER.
LDI ARO, IRI ; INITIALIZE INDEX REGISTERS FOR FIRST
LDI -1, IRO ; BUTTERFLY SERIES.
LDI AR6, AR1 ; INITIALIZE DATA POINTERS.
ADDI3 AR6, AR0, AR2
SBUI 1, AR2
LSH3 IRO, ARO, AR3
LDI 1, AR5 ; INITIALIZE 2'S POWER COUNTER.
ADDI AR6, AR3 ; FINISH DATA POINTER INITIALIZATION.
ADDI3 IRO, AR3,AR4
ADDI3 IRO, AR5, RC ; RC SHOULD BE ONE LESS THAN COUNT
* : DISIRED
*
* FIRST LOOP SERIES
*
* THIS LOOP SERIES DOES ALL THE BUTTERFLY STAGES EXCEPT THE FINAL ONE.
*
RPTB END_COUNTER_LOOP
*
OUTSIDE_LOOP: ; TWO BUTTERFLIES ARE CALCULATED AT
MIDDLEL_OOP: ; THE SAME TIME.
*
LDF *AR2, R2 ; GET LOWER HALF OF EACH BUTTERFLY.
|| LDF *AR3, R3 ; (THIS ALLOWS FOR MORE PARALLEL
* ; COMMANDS LATER)
SUBF3 *AR3, *AR4, R1 ; SUBTRACT SECOND BUTTERFLY DATA.
SUBF3 *AR2, AR1, R0 ; SUBTRACT FIRST BUTTERFLY DATA.
MPYF3 R1, *++AR7, R1 ; MULTIPLY 2ND SUBTRACTION RESULT BY
|| ADDF3 R3, *AR4, R3 ; BOSINE COEFFICIENT. ADD SECOND
* ; BUTTERFLY DATA.
MPYF3 R0, *--AR7, R0 ; MULTIPLY 1ST SUBTRACTION RESULT BY
|| ADDF3 R2, *AR1,R2 ; COSINEFFICIENT. ADD FIRST
* ; BUTTERFLY DATA
STF R1, *AR2++(IR1)% ;SAVE 2ND MULTIPLY RESULT IN LOWER
|| STF R3, *AR4++(IR1)% ; HALF IF BUTTERFLY. SAVE 2ND
* ; ADDITION IN UPPER 2ND BUTTERFLY.
END-CENTER-LOOP:
*
STF R0, *AR3++(IR1)% ; SAVE 1ST MULTIPLY IN LOWER HALF OF
|| STF R2, *AR1++(IR1)% ; 2ND BUTTERFLY. SAVE 1ST ADDITION
* ; IN UPPER 1ST BUTTERFLY.
* END OF CENTER LOOP OF FIRST LOOP SERIES.
*
ADDI3 IR0, AR5, RC ; UPDATE REPEAT COUNTER FOR NEXT BLOCK
* : REPEAT,
ADDF3 *AR3++, *AR2__, R0; UPDATE DATA POINTERS.
CMPI AR3, AR2 ; HAVE BUTTERFLIES BEEN COMPLETE?
BGTD MIDDLE_LOOP ; DELAYED BRANCH, IF NOT.
ADDF3 *AR1++, *AR4__,R0 ; UPDATE FINAL TWO POINTERS FOR NEXT
* ; REPEAT.
ADDI 2, AR7 ; UPDATE COSINE COEFFICIENT POINTER.
OR 0100H, ST ; SET REPEAT MODE. (FASTER THAN USING
* : RPTB WHEN START AND END ADDRESS
* ; ARE STILL GOOD)
*
* DELAY BRANCH FROM HERE TO MIDDLE_LOOP.
*
LSH -1, IR1 ; UPDATE INDEX REGISTER. (DEVIDED BY 2)
LDI AR6,AR1 ; REINITIALIZE DATA POINTERS.
ADDI IR0, AR6, AR2
ADDU IR1, AR2
CMPI 2, IR1 ; IS FIRST BUTTERFLY SERIES COMPLETE?
BGTD OUTSIDE_LOOP ; DELAY BRANCH, IF NOT.
KSG 1, AR5 ; MULTIPLY 2'S POWER COUNTER BY 2.
SUBI3 IR0, AR4, AR3 ; CONTINUE REINITIALIZING DATA
* ; POINTERS
ADDI3 IR0, AR5, RC ; SET REPEAT COUNTER FOR REPEAT BLOCK.
*
* END OF FIRST LOOP SERIES.
*
* FINAL BUTTERFLY STAGE LOOP.
*
* INCLUDES LAST BUTTERFLIES AND FIRST STAGE OF BIT REVERSE ADDITIONS.
*
LDI 4, IR1 ; INITIALIZE INDEX REGISTER.
ADDI 1, AR3 ; SET UP DATA POINTERS.
LSH -1. AR5
ADDI 3, AR4
ADDI3 IR0, AR5, RC ; INITIALIZE REPEAT COUNTER.
MPYF3 *AR7, ++AR7, R4 ; CALCULATE (2/M)*COS(PI/4).
* ; <I.E.-> (SQRT(2))/N THIS VALUE IS
* ; CALLED, S, BELOW,)
RPTB END_2ND_LOOP ; TWO BUTTERFLIES ARE CALCULATED PER
* ; LOOP
*
* SUBF3 *AR2, *AR1, R0 ; SUBTRACT 1ST BUTTERFLY DATA
SUBF3 *AR4, *AR3, R1 ; SUBTRACT 2ND BUTTERFLY DATA
MPYF3 R0, R4, R0 ; MULTIPLY 1ST SUBTRACTION RESULT
|| ADDF3 *AR3++*(IR1), *AR4++(IR1), R3 ; BY S. AND 2ND BUTTERFLY
* ; DATA
MPYF3 R1, R4, R1 ; MULTIPLY 2ND SUBTRACTION RESULT
|| ADDF3 *AR1++(IR1), *AR2++(IR1), R2 ; BY S. ADD 1ST BUTTERFLY
* ; DATA
MPYF3 R3, *+AR7, R3 ; MULTIPLY 2ND ADDITION RESULT BY
|| STF R0, *-AR2(IR1) ; 7071. SAVE 1ST SUBTRACTION IN
; LOWER 1/2 OF 1ST BUTTERFLY.
MPYF3 R2, *+AR7, R2 ;MULTIPLY 1ST ADDITION RESULT BY
:: STF R1, *-AR4(IR1) ; .7071 SAVE 2ND SUBTRACTION IN
* ; LOWER 1/2 OF 2ND BUTTERFLY.
ADDF3 R3, R1, R3 ; ADD 2ND SUBTRACTION MULTIPLY TO 2ND
* : ADDITION MULTIPLY.
STF R2, *-AR1(IR1) ; SAVE 1ST ADDITION MULTIPLY IN UPPER
* ; 1/2 OF BUTTERFLY.
*
END_2ND_LOOP:
*
STF R3, *-AR3(IR1) ; SAVE 2ND ADDITION MULTPLY IN UPPER
* : 1/2 OF UPPER BUTTERFLY.
*
* END OF FINAL BUTTERFLY STAGE LOOP.
*
* BIT REVERSE ADDITION LOOP SERIES.
*
* THIS LOOPSERIES DOES ALL OF THE BIT REVERSE ADDITION AT THE END OF FAST
* COSINE TRANSFORM
*
LDI 2, IR0 ; INITIALIZE INDEX REGISTERS AND DATA
LDI AR6, AR1 ; POINTERS FOR FINAL ADDITION
ADDI 4, AR1 ; SERIES
LDI AR1, AR2
LDI 8, IR1
*
LAST_OUTSIDE_LOOP:
* LDI AR2, AR4 ; UPDATE POINTERS AND COUNTERS.
LSH -1, AR5
LDI AR5, RC ; SET UP REPEAT COUNTER.
ADDF3 *AR2++(IR0)b, *AR4++(IR0)R, R0 ; DATA POINTER UPDATE.
LDI AR1,R4 ; USE INITIAL AR1 VALUE AS INNER LOOP
* ; CONTROL.
SUBI 1, RC
NOP *AR4++(IR0)B ; CONTINUE UPDATING POINTERS.
LDI AR2, AR3
*
RPTB END_INSIDE ; TWO ADDITIONS ARE DONE IN EACH LOOP.
*
LAST_INSIDE_LOOP:
*
ADDF3 *AR1, *AR2++(IR1)%,R0 ;ADD FIRST TWO DATA.
ADDF3 *AR3, *AR4++(IR1)%,R1 ;ADD SECOND TWO DATA.
STF R0,*AR1++(IR1)% ;SAVE FIRST ADDITION.
*
END_INSIDE:
*
STF R1, *AR3++(IR1)% ; SAVE SECOND ADDITION.
*
* END OF INSIDE LOOP FOR LAST LOOP SERIES.
*
ADDF3 *AR1++(IR0)B, *AR2++(IR0)B,RO ; UPDATE DATA POINTERS.
ADDF3 *AR3++(IR0)B, *AR4++(IR0)B,RO
ADDF3 *AR3++(IR0)B, *AR4++(IR0)B,RO
ADDF3 *AR1++(IR0)B, *AR2++(IR0)B,RO
CMPI R4, AR4 ; IS THIS LOOP COMPLETE?
BNED LAST_INSIDE_LOOP ; DELAYED BRANCH, IF NOT.
LDI AR5, RC ; SET UP REPEAT COUNTER.
SUBG1 1, RC
OR 0100H, ST ; SET REPEAT MODE
*
* BRANCH DELAYED TO LAST_INSIDE_LOOP.
*
RPTB LAST_BLOCK ; SINCE THERE ARE AN ODD NUMBER OF
ADDF3 *AR1, *AR2++(IR1)Z, R0 ; ADDITIONS THE FINAL ONES ARE
* ; DONE NOW.
*
LAST_BLOCK:
*
STF R0, *AR1++(IR1)% ; SAVE ADDITION.
*
* END OF LAST REPEAT BLOCK.
*
LSH 1,IR0 ; MULTIPLY IR0 BY 2.
ADDI IR0, R4 ; UPDTEE INNER LOOP CONTROL REGISTER.
CMPI 1, AR5 ; ARE CALCULATIONS COMPLETE?
BGTD LAST_OUTSIDE_LOOP ;DELAYED BRANCH, IF NOT.
LDI R4, AR2 ; UPDATE DATA POINTERS.
LDI R4, AR1
LSH 1, IR1 ; MULTIPLY IR1 BY 2.
*
* DELAYED BRANCH TO LAST_OUTSIDE_LOOP.
*
* END OF LAST LOOP SERIES.
*
* MULTIPLY COEFFICIENT ZERO BY .5 IF NOT ZERO.
*
LDF *AR6, R0 ; SET ZERO FLAG *AR6 = 0.
BEQD DONT_STORE ; IF COEFFICIENT IS ZERO, DON'T DO
* : THIS
LSH 24, AR5 ; USE INTEGER MATCH FOR FLOAT DIVIDE
* ; BY 2.
SUBI3 AR5, *AR6, AR1
NOP
*
* DELAYED BRANCH FROM HERE IF VALUE IS NOT TO BE STORED.
*
STI AR1, *AR6 ; STORE, IF EXPONENT WASN'T -128.
*
DONT_STORE:
*
RETS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -