当前位置:文档之家› 汇编语言实现的FFT算法

汇编语言实现的FFT算法

汇编下的FFT算法实现;----------------------------------------------------------- ; 快速付里叶变换子程序;; 入口 : 一维四字节浮点数数组的首地址 ;;; 以 2 为基β的值,信号抽样的点数 = 2^β;;; 出口 : 在原数组的位置保存结果的值;;; 补充说明 :;; 1. 该子程序所需 RAM 的容量为 2^β*12 字节,另外需要;; 少量的堆栈作为临时变量的存储空间;;; 2. 所需 RAM 空间以输入的首地址为基址,向增加的方向;; 扩展;;; 应用举例 :;; PUSH #0A000H ; 数组首地址压栈; PUSH #6 ; β值压栈; CALL FFT;;----------------------------------------------------------- PROC FFTFFT: LD FFT_CX,2[SP]LD FFT_AX,#0001H ;SHL FFT_AX,FFT_CL ; 计算采样点数PUSH FFT_AX ; 将采样点数压栈SHL FFT_AX,#1 ;LD FFT_BX,6[SP] ; 根据采样点数,ADD FFT_BX,FFT_AX ; 计算出其余PUSH FFT_BX ; 三个被占用ADD FFT_BX,FFT_AX ; 空间的首地址;PUSH FFT_BX ; 并依次将首地址SHL FFT_AX,#1 ;ADD FFT_BX,FFT_AX ; 压栈;PUSH FFT_BX ;LD FFT_CX,6[SP]LD FFT_FX,#2LOOP1:CLR FFT_AXSUB FFT_EX,FFT_CX,#1LD FFT_BX,FFT_EXLD FFT_DX,10[SP]LOOP2:SHL FFT_AX,#1 ;SHR FFT_EX,#1 ; 产生倒序数ADDC FFT_AX,0 ;DJNZW FFT_DX,LOOP2 ;SHL FFT_AX,#2SHL FFT_BX,#2 ; FFT_AX : 产生源地址 ADD FFT_AX,12[SP] ; FFT_BX : 产生目的地址 ADD FFT_BX,2[SP] ; 输入数据按倒序排列BMOV FFT_AX,FFT_FX ;DJNZW FFT_CX,LOOP1 ;LD FFT_AX,12[SP]LD FFT_BX,4[SP]LD FFT_DX,#0080HST FFT_DX,[FFT_AX]+ST 0,[FFT_AX]ST 0,[FFT_BX]+ST 0,[FFT_BX]LD FFT_AX,#0DB82H ; 计算分度值SUB FFT_AX,10[SP] ; 即,(2*π)/(2^β)PUSH #490FH ; 的值PUSH FFT_AX ;LD FFT_BX,SPLD FFT_EX,16[FFT_BX]ADD FFT_EX,#4 ;PUSH [FFT_BX] ;PUSH 2[FFT_BX] ; 计算分度的余弦,PUSH FFT_EX ; 结果存入PR[1]CALL FCOS4 ;LD FFT_BX,SPPUSH [FFT_BX] ;PUSH 2[FFT_BX] ; 计算分度的正弦PUSH #FFT_AX ;CALL FSIN4 ; 分度值已完成使命,ADD SP,#4 ; 故收回其使用空间LD FFT_EX,4[SP] ; 将结果取负,ADD FFT_EX,#4 ; 存入PI[1];XOR FFT_BX,#8000H ; 同时,FFT_AX.FFT_BX ST FFT_AX,[FFT_EX] ; 保存PI[1]的ST FFT_BX,2[FFT_EX] ; 值LD FFT_EX,12[SP] ;ADD FFT_EX,#4 ; 取出PR[1]的值PUSH 2[FFT_EX] ; 压入堆栈,作为PUSH [FFT_EX] ; 后面计算的常数使用PUSH FFT_BX ; 将PI[1]的值压入堆栈,PUSH FFT_AX ; 作为后面计算的常数使用SUB SP,#8 ; 予留四个字空间LD FFT_CX,#2LOOP3:PUSH FFT_CX ; FFT_CX : 相当于I的值SUB FFT_DX,FFT_CX,#1 ; FFT_DX : 相当于J的值 SHL FFT_DX,#2ADD FFT_DX,30[SP]LD FFT_BX,SPADD FFT_EX,FFT_BX,#6PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 14[FFT_BX]PUSH 16[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_CX,[SP]SUB FFT_DX,FFT_CX,#1SHL FFT_DX,#2ADD FFT_DX,22[SP]LD FFT_BX,SPADD FFT_EX,FFT_BX,#2PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 10[FFT_BX]PUSH 12[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPLD FFT_EX,[SP]SHL FFT_EX,#2ADD FFT_EX,30[SP]PUSH 6[FFT_BX]PUSH 8[FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_BX]PUSH FFT_EXCALL FSUB4LD FFT_BX,SPLD FFT_CX,[SP]SUB FFT_DX,FFT_CX,#1SHL FFT_DX,#2ADD FFT_DX,30[SP]ADD FFT_EX,SP,#6PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 10[FFT_BX]PUSH 12[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPLD FFT_CX,[SP]SUB FFT_DX,FFT_CX,#1SHL FFT_DX,#2ADD FFT_DX,22[SP]ADD FFT_EX,SP,#2PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 14[FFT_BX]PUSH 16[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPLD FFT_EX,[SP]SHL FFT_EX,#2ADD FFT_EX,22[SP]PUSH 6[FFT_BX]PUSH 8[FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_BX]PUSH FFT_EXCALL FADD4LD FFT_DX,24[SP]SHR FFT_DX,#1POP FFT_CXINC FFT_CXCMP FFT_CX,FFT_DXJC NEXT1JMP LOOP3NEXT1:ADD SP,#16PUSH FFT_DXLOOP5:PUSH FFT_DX ; 产生一个奇偶交替的SHL FFT_DX,#1 ; 计数序列SUB FFT_CX,FFT_DX,#1 ; FFT_CX : 奇数序列SUB FFT_DX,#2 ; FFT_DX : 偶数序列SHL FFT_CX,#2 ;SHL FFT_DX,#2 ;ADD FFT_CX,6[SP] ; FFT_CX : FR[OLD]的首地址ADD FFT_DX,6[SP] ; FFT_DX : FR[EVEN]的首地址PUSH FFT_CX ;PUSH 2[FFT_DX] ; VR在堆栈中的存放PUSH [FFT_DX] ; 顺序为高位在前,低位在后LD FFT_BX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH [FFT_CX]PUSH 2[FFT_CX]PUSH FFT_DXCALL FADD4LD FFT_CX,4[SP]LD FFT_BX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH [FFT_CX] ;PUSH 2[FFT_CX] ; 完成第一级PUSH FFT_CX ; 蝶形单元的CALL FSUB4 ; 运算ADD SP,#6 ; 该循环退出时,POP FFT_DX ; [SP]的值仍然DJNZW FFT_DX,LOOP5 ; 保存N/2NFFT2:LD FFT_EX,2[SP] ; DO FI[I]=0.0 UNTIL I=64,1,I-- LD FFT_CX,8[SP]LOOP55:PUSH FFT_CXDEC FFT_CXSHL FFT_CX,#2ADD FFT_CX,FFT_EXST 0,[FFT_CX]ST 0,2[FFT_CX]POP FFT_CXDJNZW FFT_CX,LOOP55NEXT22:PUSH #2PUSH [SP]LD FFT_AX,16[SP]DEC FFT_AXLOOP6:PUSH FFT_AXLD FFT_AX,6[SP]SHR FFT_AX,#1ST FFT_AX,6[SP]LD FFT_AX,4[SP]ST FFT_AX,2[SP]SHL FFT_AX,#1ST FFT_AX,4[SP]LD FFT_CX, 6[SP]LOOP7:PUSH FFT_CXLD FFT_CX,4[SP]LOOP8:PUSH FFT_CXLD FFT_AX,[SP]DEC FFT_AXLD FFT_EX,10[SP]MULU FFT_CX,FFT_AX,FFT_EXSHL FFT_CX,#2PUSH FFT_CX ; NILD FFT_BX,4[SP]DEC FFT_BXLD FFT_EX,10[SP]MULU FFT_CX,FFT_BX,FFT_EXADD FFT_CX,FFT_AXLD FFT_DX,FFT_CXSHL FFT_CX,#2PUSH FFT_CX ; NKLD FFT_CX,12[SP]SHR FFT_CX,#1ADD FFT_CX,FFT_DXSHL FFT_CX,#2PUSH FFT_CX ; NJLD FFT_AX,30[SP] ; PR的首地址LD FFT_BX,20[SP] ; FR的首地址ADD FFT_AX,4[SP]ADD FFT_BX,[SP] ;SUB SP,#4 ; 先调整堆栈指针LD FFT_EX,SP ; 再进行浮点数运算 PUSH [FFT_AX] ; 在并发环境下PUSH 2[FFT_AX] ; 至关重要PUSH [FFT_BX] ;PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_AX,26[SP] ; PI的首地址LD FFT_BX,22[SP] ; FI的首地址ADD FFT_AX,8[SP] ;ADD FFT_BX,4[SP] ; 先调整堆栈指针 SUB SP,#4 ; 再进行浮点数运算LD FFT_EX,SP ; 在并发环境下PUSH [FFT_AX] ; 至关重要PUSH 2[FFT_AX] ;PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPSUB SP,#4LD FFT_EX,SPPUSH 4[FFT_BX]PUSH 6[FFT_BX]PUSH [FFT_BX]PUSH 2[FFT_BX]PUSH FFT_EXCALL FSUB4 ; PODDRLD FFT_AX,42[SP] ; PR的首地址 LD FFT_BX,30[SP] ; FI的首地址 ADD FFT_AX,16[SP]ADD FFT_BX,12[SP]ADD FFT_EX,SP,#8PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_BX]PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_AX,34[SP] ; PI的首地址 LD FFT_BX,32[SP] ; FR的首地址 ADD FFT_AX,16[SP]ADD FFT_BX,12[SP]ADD FFT_EX,SP,#4PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_BX]PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPSUB SP,#4LD FFT_EX,SPPUSH 8[FFT_BX]PUSH 10[FFT_BX]PUSH 4[FFT_BX]PUSH 6[FFT_BX]PUSH FFT_EXCALL FADD4 ; PODDILD FFT_BX,FFT_AX ADD FFT_AX,16[SP] ADD FFT_BX,18[SP] LD FFT_EX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_EX]PUSH 6[FFT_EX]PUSH FFT_AXCALL FSUB4LD FFT_AX,34[SP] LD FFT_BX,FFT_AX ADD FFT_AX,16[SP] ADD FFT_BX,18[SP] LD FFT_EX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH [FFT_EX]PUSH 2[FFT_EX]PUSH FFT_AXCALL FSUB4LD FFT_AX,36[SP] ADD FFT_AX,18[SP] LD FFT_EX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH 4[FFT_EX]PUSH 6[FFT_EX]PUSH FFT_AXCALL FADD4LD FFT_AX,34[SP] ADD FFT_AX,18[SP] LD FFT_EX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_EX]PUSH 2[FFT_EX]PUSH FFT_AXCALL FADD4ADD SP,#22POP FFT_CXDJNZW FFT_CX,NEXT3 POP FFT_CXDJNZW FFT_CX,NEXT4 POP FFT_AXJMP NEXT6NEXT3:JMP LOOP8NEXT4:JMP LOOP7NEXT5:JMP LOOP6NEXT6:ADD SP,#6LD FFT_CX,6[SP] LOOP9:PUSH FFT_CXDEC FFT_CXSHL FFT_CX,#2LD FFT_AX,4[SP] ADD FFT_AX,FFT_CX SUB SP,#4LD FFT_BX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH FFT_BXCALL FMUL4LD FFT_AX,6[SP] LD FFT_CX,4[SP] DEC FFT_CXSHL FFT_CX,#2ADD FFT_AX,FFT_CX SUB SP,#4LD FFT_BX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH FFT_BXCALL FMUL4LD FFT_BX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_BX]PUSH 6[FFT_BX]PUSH #FFT_AXCALL FADD4ADD SP,#8LD FFT_CX,[SP]DEC FFT_CXSHL FFT_CX,#2ADD FFT_EX,FFT_CXPUSH FFT_AXPUSH FFT_BXPUSH FFT_EXCALL FSQRTPOP FFT_CXDJNZW FFT_CX,LOOP9LD FFT_AX,8[SP]ST FFT_AX,12[SP]ADD SP,#12RETPROCEND:END;===========================================================签名:路漫漫其修远兮,吾将上下而求索艾诺仪器公司。

相关主题