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

📄 fft.asm

📁 一些在CCS上可以运行的初级DSP汇编程序
💻 ASM
字号:
*********************************************
***     N(8--1024) points FFT Program     ***
*********************************************
        .title    "FFT.asm"
        .mmregs
        .copy     "coeff.inc"
        .def      start
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
K_FFT_SIZE        .set   32  ;N
K_LOGN            .set  5   ;LOG(N)
PA0               .set    0
PA1               .set    1
        .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
start:
        SSBX FRCT
        STM #STACK+10,SP
        STM #d_input,AR1      ;input the 2N data
        RPT #2*K_FFT_SIZE-1   ;from PA1
        PORTR PA1,*AR1+
        STM #sine,AR1         ;move coeff of sin
        RPT #511              ;from program to data
        MVPD sine1,*AR1+
        STM #cosine,AR1       ;move coeff of cos
        RPT #511              ;from program to data
        MVPD cosine1,*AR1+
        STM #d_input,ORIGINAL_INPUT
        STM #fft_data,DATA_PROC_BUF
        MVMM DATA_PROC_BUF,REORDERED
        STM #K_FFT_SIZE-1,BRC
        RPTBD bit_rev_end-1
        STM #K_FFT_SIZE,AR0
        MVDD *ORIGINAL_INPUT+,*REORDERED+  
        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
        LD #-1,ASM
        STM #fft_data,PX
        LD *PX,16,A
        STM #fft_data+K_DATA_IDX_1,QX
        STM #K_FFT_SIZE/2-1,BRC
        RPTBD stage1end-1
        STM #K_DATA_IDX_1+1,AR0
        SUB *QX,16,A,B
        ADD *QX,16,A
        STH A,ASM,*PX+    
        ST B,*QX+
        ||LD *PX,A
        SUB *QX,16,A,B
        ADD *QX,16,A
        STH A,ASM,*PX+0    
        ST B,*QX+0%         
        ||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
        RPTBD stage2end-1
        STM #K_DATA_IDX_2+1,AR0
; 1st butterfly
        SUB *QX,16,A,B
        ADD *QX,16,A
        STH A,ASM,*PX+   
        ST B,*QX+        
        ||LD *PX,A
        SUB *QX,16,A,B
        ADD *QX,16,A
        STH A,ASM,*PX+     
        STH B,ASM,*QX+   
;  2nd butterfly
        MAR *QX+
        ADD *PX,*QX,A
        SUB *PX,*QX-,B
        STH A,ASM,*PX+
        SUB *PX,*QX,A
        ST B,*QX
        ||LD *QX+,B      
        ST A,*PX
        ||ADD *PX+0%,A   
        ST A,*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
        ADD *(PX),A                       
        STLM A,QX
        MVDK d_grps_cnt,GROUP_COUNTER
group:
        MVMD BUTTERFLY_COUNTER,BRC        
        RPTBD butterflyend-1
        LD *WR,T
        MPY *QX+,A
        MACR *WI+0%,*QX-,A
        ADD *PX,16,A,B
        ST B,*PX
        ||SUB *PX+,B          
        ST B,*QX
        ||MPY *QX+,A          
        MASR *QX,*WR+0%,A         
        ADD *PX,16,A,B
        ST B,*QX+             
        ||SUB *PX,B
        LD *WR,T
        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
        SUB #1,A,B
        STLM B,BUTTERFLY_COUNTER
        STL A,1,d_data_idx
        LD d_grps_cnt,A
        STL A,ASM,d_grps_cnt
        LD d_twid_idx,A
        STL A,ASM,d_twid_idx
        BANZD stage,*STAGE_COUNTER-
        MVDK d_twid_idx,AR0
fft_end:
***  Compute the power spectrum ***
        STM     #fft_data,AR2
        STM     #fft_data,AR3
        STM     #fft_out,AR4
        STM     #K_FFT_SIZE*2-1,BRC
        RPTB    power_end-1
        SQUR    *AR2+,A
        SQURA   *AR2+,A
        STH     A,*AR4+
power_end:
        STM     #fft_out,AR4
        RPT     #K_FFT_SIZE-1
        PORTW   *AR4+,PA0

here:   B       here
        .end

⌨️ 快捷键说明

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