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

📄 fft.asm

📁 dsp程序:ccs环境下的fft程序
💻 ASM
字号:
******************************************************************
***            N(8-1024) points FFT Program                    ***
******************************************************************
               .title          "fft.asm"
               .mmregs
               .copy           "coeff.inc"
               .def            _c_int00
sine:          .usect          "sine",512
cosine:        .usect          "cosine",512

fft_data:      .usect          "fft_data",2048
d_input:       .usect          "d_input",2048
fft_out:       .usect          "fft_out",1024
STACK          .usect          "STACK",10
K_DATA_IDX_1            .set   2
K_DATA_IDX_2            .set   4
K_DATA_IDX_3            .set   8
K_TWID_TBL_SIZE         .set   512
K_TWID_IDX_3            .set   128
K_FLY_COUNT_3           .set   4
***    N points FFT     ***
K_FFT_SIZE              .set   16          ;N=8
K_LOGN                  .set   4           ;LOG(N)=LOG(8)=3

                .bss           d_twid_idx,1
                .bss           d_data_idx,1
                .bss           d_grps_cnt,1
                .sect          "fft_prg"  ;
***             Bit             Reversal Routine      ***
                .asg          AR2,REORDERED
                .asg          AR3,ORIGINAL_INPUT
                .asg          AR7,DATA_PROC_BUF
                .text
_c_int00:
                SSBX         FRCT
                STM          #STACK+10,SP
   
                NOP                                  ;put a probe,input 2N data into d_input(dm) 
                                                     ;include Re and Im
                STM          #sine,AR1               ;move sine1(512) into sine(dm)
                RPT          #511                    ; 
                MVPD         sine1,*AR1+

                STM          #cosine,AR1             ;move cosine1 into cosine
                RPT          #511                    ;
                MVPD         cosine1,*AR1+

                STM          #d_input,ORIGINAL_INPUT
                STM          #fft_data,DATA_PROC_BUF
                MVMM         DATA_PROC_BUF,REORDERED  ;RECORDERED point fft_data too
                STM          #K_FFT_SIZE-1,BRC
                RPTBD        bit_rev_end-1        
                STM          #K_FFT_SIZE,AR0           ;this is double words order
                MVDD         *ORIGINAL_INPUT+,*REORDERED+    ;Bit Reversal 
                MVDD         *ORIGINAL_INPUT-,*REORDERED+
                MAR          *ORIGINAL_INPUT+0B
bit_rev_end:
* * * * FFT Code * * * * *
                .asg         AR1,GROUP_COUNTER
                .asg         AR2,PX
                .asg         AR3,QX
                .asg         AR4,WR
                .asg         AR5,WI
                .asg         AR6,BUTTERFLY_COUNTER
                .asg         AR7,STAGE_COUNTER
* * * stage 1 * * *
                STM          #0, BK    ;why not=16?
                LD           #0, ASM 
                ;LD           #-1, ASM  ;protect flowover ,all output/2
                STM          #fft_data,PX
                LD           *PX,16,A   ;AH:=Re[x(0)]
                STM          #fft_data+K_DATA_IDX_1,QX   ;QX point Re[x(4)]
                STM          #K_FFT_SIZE/2-1,BRC   ;stage 1 is N/2-1
                RPTBD        stage1end-1
                STM          #K_DATA_IDX_1+1,AR0
                SUB          *QX,16,A,B  ;BH=Re[x(0)]-Re[x(4)]
                ADD          *QX,16,A    ;AH=Re[x(0)]+ Re[x(4)]
                STH          A,ASM,*PX+
                ST           B,*QX+
                ||LD         *PX,A
                SUB          *QX,16,A,B  ;BH=Im[x(0)]-Im[x(4)]
                ADD          *QX,16,A    ;AH=Im[x(0)]+Im[x(4)]
                STH          A,ASM,*PX+0
                ST           B,*QX+0%   ;BK=0 why here circle access  ?
                ||LD         *PX,A
stage1end:
* * * Stage 2 * * *
                STM          #fft_data,PX
                STM          #fft_data+K_DATA_IDX_2,QX
                STM          #K_FFT_SIZE/4-1,BRC
                LD           *PX,16,A    ;AH=Re[x(0)]+ Re[x(4)],AH=1
                RPTBD        stage2end-1
                STM          #K_DATA_IDX_2+1,AR0
;1st butterfly
                SUB          *QX,16,A,B  ;BH={Re[x(0)]+ Re[x(4)]}-{Re[x(2)]+ Re[x(6)]},BH=0
                ADD          *QX,16,A    ;AH={Re[x(0)]+ Re[x(4)]}+{Re[x(2)]+ Re[x(6)]},AH=2
                STH          A,ASM,*PX+  
                ST           B,*QX+
                ||LD         *PX,A
                SUB          *QX,16,A,B  ;BH={Im[x(0)]+ Im[x(4)]}-{Im[x(2)]+ Im[x(6)]},BH=0
                ADD          *QX,16,A    ;AH={Im[x(0)]+ Im[x(4)]}+{Im[x(2)]+ Im[x(6)]},BH=0
                STH          A,ASM,*PX+  
                STH          B,ASM,*QX+
;2nd butterfly
                MAR          *QX+
                ADD          *PX,*QX,A   ;AH={Re[x(0)]-Re[x(4)]}+{Im[x(2)]-Im[x(6)]},=1
                SUB          *PX,*QX-,B  ;BH={Re[x(0)]-Re[x(4)]}-{Im[x(2)]-Im[x(6)]},=1
                STH          A,ASM,*PX+
                SUB          *PX,*QX,A   ;AH={Im[x(0)]-Im[x(4)]}-{Re[x(2)]-Re[x(6)]},=-1,note:sub
                ST           B,*QX
                ||LD         *QX+,B      ;very important, " BH= {Re[x(2)]- Re[x(6)]} ",=1
                
******************************************************************************************                                         
                ST           A,*PX       ;   right!!!
                ||ADD        *PX+0%,A    ;  note:this order include BH
                ST           A,*QX+0%    ;
                ||LD         *PX,A
***************** my modify***************************************************************
              ;  ST           A,*PX
              ;  ||ADD        *PX+0%,B  
              ;  ST           B,*QX+0%
              ;  ||LD         *PX,A                          
*****************************************************************************************
                                                               
stage2end:
* * * Stage 3 through Stage logN * * *
                STM          #K_TWID_TBL_SIZE,BK
                ST           #K_TWID_IDX_3,d_twid_idx
                STM          #K_TWID_IDX_3,AR0
                STM          #cosine,WR
                STM          #sine,WI
                STM          #K_LOGN-2-1,STAGE_COUNTER
                ST           #K_FFT_SIZE/8-1,d_grps_cnt
                STM          #K_FLY_COUNT_3-1,BUTTERFLY_COUNTER
                ST           #K_DATA_IDX_3,d_data_idx
stage:
                STM          #fft_data,PX
                LD           d_data_idx,A  ;A:=8
                ADD          *(PX),A       ;A:=2008
                STLM         A,QX          ;this time QX piont what?
                                           ;my thought:point the eighth space(ccs test)
                                           ;may relocate QX pointer
                MVDK         d_grps_cnt,GROUP_COUNTER
group:
                MVMD         BUTTERFLY_COUNTER,BRC
                RPTBD        butterflyend-1
                LD           *WR,T      ;T:=1,cos0
                MPY          *QX+,A     ;A=000001FFFC                                        
                MACR         *WI+0%,*QX-,A   ;T=0,sin0,WI next piont 0.707,-1                                           
                ADD          *PX,16,A,B      ;B=0000040000,0000010000
                ST           B,*PX           ;the first ouput:1/8*{...}
                ||SUB        *PX+,B          ;B=0000000000,0000010000                                             
                ST           B,*QX           ;
                ||MPY        *QX+,A          ;A=0000000000,000000B504
                MASR         *QX,*WR+0%,A    ;T=0 ,WR next piont 0.707,0
               ;SFTL          A,4,A                                      
                ADD          *PX,16,A,B      ;B=0000000000,OVB=1                                         
                ST           B,*QX+
                ||SUB        *PX,B           ;B=0000000000 ,00FFFE0000                                      
                LD           *WR,T           ;T:=0.707,0
                ST           B,*PX+          ;
                ||MPY        *QX+,A
*********************************************************
butterflyend:
; Update pointers for next group
                PSHM          AR0
                MVDK          d_data_idx,AR0
                MAR           *PX+0
                MAR           *QX+0
                BANZD         group,*GROUP_COUNTER-
                POPM          AR0
                MAR           *QX-
;Update         counters and indices for next stage
                LD            d_data_idx,A    ;A:=8
                SUB           #1,A,B          ;B:=7
                STLM          B,BUTTERFLY_COUNTER   ;butterfly_counter:=7
                STL           A,1,d_data_idx  ;d_data_idx:=4
                LD            d_grps_cnt,A    ;A:=0(8/8-1)
                STL           A,ASM,d_grps_cnt ;d_grps_cnt=A/2
                LD            d_twid_idx,A     ;A:=128
                STL           A,ASM,d_twid_idx  ;d_twid_idx=A/2
                BANZD         stage,*STAGE_COUNTER-   ;stage_counter:=0
                MVDK          d_twid_idx,AR0
fft_end:
* * * Compute the power spectrum * * *
                STM           #fft_data,AR2
                STM           #fft_out,AR4
                STM           #K_FFT_SIZE-1,BRC
                NOP
                RPTB          power_end-1
                SQUR          *AR2+,A
                SQURA         *AR2+,A
                
                STL           A,-1,*AR4+
power_end:
                nop                
here:           B             here
                .end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -