网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C5000 >> 文章正文
  DSP程序:CCS环境下的FFT程序(以8点的为例做了详细解析)         ★★★ 【字体:
DSP程序:CCS环境下的FFT程序(以8点的为例做了详细解析)
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-22    

 

******************************************************************
***            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

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    定时器实验代码
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号