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

📄 fft.asm

📁 这是一个用汇编语音编写的dsp的各种点数的fft变换,很使用.
💻 ASM
字号:
******************************************************************
***            N(8-1024) points FFT Program                    ***
******************************************************************
               .title          "fft.asm"
               .mmregs
               .copy           "coeff.inc"
               .copy           "fftin.dat"
;               .copy           "fftin64.dat"
               .def            _c_int00
sine:          .usect          "sine",512
cosine:        .usect          "cosine",512
d_input:       .usect          "d_input",2048
fft_data:      .usect          "fft_data",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   8           ;N=8
K_LOGN                  .set   3           ;LOG(N)=LOG(8)=3
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
                .text
_c_int00:
                SSBX         FRCT
                STM          #STACK+10,SP
                STM          #d_input,AR1            ;input the 2N data
*                STM          #fft_data,AR1            ;input the 2N data
                RPT          #2*K_FFT_SIZE-1         ;from PA1
                MVPD         d_input1,*AR1+
*                PORTR        PA1,*AR1+
                STM          #sine,AR1               ;move coeft 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           #0,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 + -