⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfft_32.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        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 + -