512点FFT算法实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

N=512 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",512

STACK .usect "STACK",9

K_DATA_IDX_1 .set 2

K_DATA_IDX_2 .set 4

K_DATA_IDX_3 .set 8

K_TWID_TBL_SIZE .set 128

K_TWID_IDX_3 .set 32

K_FLY_COUNT_3 .set 4

*** N points FFT ***

K_FFT_SIZE .set 256 ;N

K_LOGN .set 9 ;LOG(N) =512 则N=9

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 ;AR2中装入第一个位倒序数据指针.asg AR3,ORIGINAL_INPUT ;AR3中放入输入地址

.asg AR7,DA TA_PROC_BUF ;AR7中放入处理后输出的地址

.text

Start:

SSBX FRCT

STM #STACK+9,SP

STM #d_input,AR1

RPT #2*K_FFT_SIZE-1

PORTR PA1,*AR1+

STM #sine,AR1 ;正弦系数表

RPT #255 ;

MVPD sine1,*AR1+

STM #cosine,AR1 ;

RPT #255 ;

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 ;定义FFT计算的组指针

.asg AR2,PX ;AR2指向蝶型运算的第一个数据指针.asg AR3,QX ;AR3指向蝶型运算的第二个数据指针.asg AR4,WR ;AR4指向余弦表的指针

.asg AR5,WI ;AR5指向正弦表的指针

.asg AR6,BUTTERFL Y_COUNTER ;AR6指向蝶形结的指针

.asg AR7,STAGE_COUNTER ;定义数据处理缓冲指针

* * * stage 1级蝶形运算,计算2点的FFT * * *

STM #0, BK ;让BK=0,使*ARn+0%=*ARn+0 why not=16? LD #-1, ASM ;每步输出时右移一位避免溢出

STM #fft_data, PX ;PX指向蝶型运算第一个数的实部

LD *PX,16,A ;AH:=Re[x(0)] AH=PR

STM #fft_data+K_DATA_IDX_1,QX ;QX point 蝶形运算第二个数的实部STM #K_FFT_SIZE/2-1,BRC ;stage 1 is N/2-1设置循环块计数器RPTBD stage1end-1

STM #K_DA TA_IDX_1+1,AR0

SUB *QX,16,A,B ;BH=Re[x(0)]-Re[x(4)] BH=PR-QR

ADD *QX,16,A ;AH=Re[x(0)]+ Re[x(4)] AH=PR+QR

STH A,ASM,*PX+ ;PRV=(PR+QR)/2

ST B,*QX+ ;QRV=(PR-QR)/2

||LD *PX,A ;AH=PI

SUB *QX,16,A,B ;BH=Im[x(0)]-Im[x(4)] BH=PI-QI

ADD *QX,16,A ;AH=Im[x(0)]+Im[x(4)] AH=PI+QI

STH A,ASM,*PX+0 ;PIV=(PI+QI)/2

ST B,*QX+0% ;PIV=(PI-QI)/2;BK=0 why here circle access ?

||LD *PX,A AH为下一个PR

stage1end:

* * * Stage 2 第二级计算4点的FFT* * *

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_DA TA_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+ ;PIV=(PI+QI)/2

STH B,ASM,*QX+ ;PIV=(PI-QI)/2

;2nd butterfly

MAR *QX+ ;QX中地址加1

ADD *PX,*QX,A ;AH=PR+QI

SUB *PX,*QX-,B ;BH=PR-QI

STH A,ASM,*PX+ ; PRV=(PI+QI)/2

SUB *PX,*QX,A ;AH=PR-QI

ST B,*QX ;QRV=(PI-QI)/2

||LD *QX+,B ;BH=QR very important, " BH= {Re[x(2)]- Re[x(6)]} ",=1 ST A,*PX ; PIV=(PI-QR)/2

||ADD *PX+0%,A ; AH=PI+QR

ST A,*QX+0% ;QIV=(PI+QR)/2

||LD *PX,A ;AH=PR

Stage2end:

* * * Stage 3 through Stage logN * * *

STM #K_TWID_TBL_SIZE,BK ;为旋转因子表格的大小值

相关文档
最新文档