汇编语言实现的FFT算法.docx
- 文档编号:29897189
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:17
- 大小:16.67KB
汇编语言实现的FFT算法.docx
《汇编语言实现的FFT算法.docx》由会员分享,可在线阅读,更多相关《汇编语言实现的FFT算法.docx(17页珍藏版)》请在冰豆网上搜索。
汇编语言实现的FFT算法
汇编下的FFT算法实现
;-----------------------------------------------------------
;快速付里叶变换子程序
;
;入口:
一维四字节浮点数数组的首地址;
;
;以2为基β的值,信号抽样的点数=2^β;
;
;出口:
在原数组的位置保存结果的值;
;
;补充说明:
;
;1.该子程序所需RAM的容量为2^β*12字节,另外需要
;
;少量的堆栈作为临时变量的存储空间;
;
;2.所需RAM空间以输入的首地址为基址,向增加的方向
;
;扩展;
;
;应用举例:
;
;PUSH#0A000H;数组首地址压栈
;PUSH#6;β值压栈
;CALLFFT
;
;-----------------------------------------------------------
PROCFFT
FFT:
LDFFT_CX,2[SP]
LDFFT_AX,#0001H;
SHLFFT_AX,FFT_CL;计算采样点数
PUSHFFT_AX;将采样点数压栈
SHLFFT_AX,#1;
LDFFT_BX,6[SP];根据采样点数,
ADDFFT_BX,FFT_AX;计算出其余
PUSHFFT_BX;三个被占用
ADDFFT_BX,FFT_AX;空间的首地址;
PUSHFFT_BX;并依次将首地址
SHLFFT_AX,#1;
ADDFFT_BX,FFT_AX;压栈;
PUSHFFT_BX;
LDFFT_CX,6[SP]
LDFFT_FX,#2
LOOP1:
CLRFFT_AX
SUBFFT_EX,FFT_CX,#1
LDFFT_BX,FFT_EX
LDFFT_DX,10[SP]
LOOP2:
SHLFFT_AX,#1;
SHRFFT_EX,#1;产生倒序数
ADDCFFT_AX,0;
DJNZWFFT_DX,LOOP2;
SHLFFT_AX,#2
SHLFFT_BX,#2;FFT_AX:
产生源地址
ADDFFT_AX,12[SP];FFT_BX:
产生目的地址
ADDFFT_BX,2[SP];输入数据按倒序排列
BMOVFFT_AX,FFT_FX;
DJNZWFFT_CX,LOOP1;
LDFFT_AX,12[SP]
LDFFT_BX,4[SP]
LDFFT_DX,#0080H
STFFT_DX,[FFT_AX]+
ST0,[FFT_AX]
ST0,[FFT_BX]+
ST0,[FFT_BX]
LDFFT_AX,#0DB82H;计算分度值
SUBFFT_AX,10[SP];即,(2*π)/(2^β)
PUSH#490FH;的值
PUSHFFT_AX;
LDFFT_BX,SP
LDFFT_EX,16[FFT_BX]
ADDFFT_EX,#4;
PUSH[FFT_BX];
PUSH2[FFT_BX];计算分度的余弦,
PUSHFFT_EX;结果存入PR[1]
CALLFCOS4;
LDFFT_BX,SP
PUSH[FFT_BX];
PUSH2[FFT_BX];计算分度的正弦
PUSH#FFT_AX;
CALLFSIN4;分度值已完成使命,
ADDSP,#4;故收回其使用空间
LDFFT_EX,4[SP];将结果取负,
ADDFFT_EX,#4;存入PI[1];
XORFFT_BX,#8000H;同时,FFT_AX.FFT_BX
STFFT_AX,[FFT_EX];保存PI[1]的
STFFT_BX,2[FFT_EX];值
LDFFT_EX,12[SP];
ADDFFT_EX,#4;取出PR[1]的值
PUSH2[FFT_EX];压入堆栈,作为
PUSH[FFT_EX];后面计算的常数使用
PUSHFFT_BX;将PI[1]的值压入堆栈,
PUSHFFT_AX;作为后面计算的常数使用
SUBSP,#8;予留四个字空间
LDFFT_CX,#2
LOOP3:
PUSHFFT_CX;FFT_CX:
相当于I的值
SUBFFT_DX,FFT_CX,#1;FFT_DX:
相当于J的值
SHLFFT_DX,#2
ADDFFT_DX,30[SP]
LDFFT_BX,SP
ADDFFT_EX,FFT_BX,#6
PUSH[FFT_DX]+
PUSH[FFT_DX]
PUSH14[FFT_BX]
PUSH16[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_CX,[SP]
SUBFFT_DX,FFT_CX,#1
SHLFFT_DX,#2
ADDFFT_DX,22[SP]
LDFFT_BX,SP
ADDFFT_EX,FFT_BX,#2
PUSH[FFT_DX]+
PUSH[FFT_DX]
PUSH10[FFT_BX]
PUSH12[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_BX,SP
LDFFT_EX,[SP]
SHLFFT_EX,#2
ADDFFT_EX,30[SP]
PUSH6[FFT_BX]
PUSH8[FFT_BX]
PUSH2[FFT_BX]
PUSH4[FFT_BX]
PUSHFFT_EX
CALLFSUB4
LDFFT_BX,SP
LDFFT_CX,[SP]
SUBFFT_DX,FFT_CX,#1
SHLFFT_DX,#2
ADDFFT_DX,30[SP]
ADDFFT_EX,SP,#6
PUSH[FFT_DX]+
PUSH[FFT_DX]
PUSH10[FFT_BX]
PUSH12[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_BX,SP
LDFFT_CX,[SP]
SUBFFT_DX,FFT_CX,#1
SHLFFT_DX,#2
ADDFFT_DX,22[SP]
ADDFFT_EX,SP,#2
PUSH[FFT_DX]+
PUSH[FFT_DX]
PUSH14[FFT_BX]
PUSH16[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_BX,SP
LDFFT_EX,[SP]
SHLFFT_EX,#2
ADDFFT_EX,22[SP]
PUSH6[FFT_BX]
PUSH8[FFT_BX]
PUSH2[FFT_BX]
PUSH4[FFT_BX]
PUSHFFT_EX
CALLFADD4
LDFFT_DX,24[SP]
SHRFFT_DX,#1
POPFFT_CX
INCFFT_CX
CMPFFT_CX,FFT_DX
JCNEXT1
JMPLOOP3
NEXT1:
ADDSP,#16
PUSHFFT_DX
LOOP5:
PUSHFFT_DX;产生一个奇偶交替的
SHLFFT_DX,#1;计数序列
SUBFFT_CX,FFT_DX,#1;FFT_CX:
奇数序列
SUBFFT_DX,#2;FFT_DX:
偶数序列
SHLFFT_CX,#2;
SHLFFT_DX,#2;
ADDFFT_CX,6[SP];FFT_CX:
FR[OLD]的首地址
ADDFFT_DX,6[SP];FFT_DX:
FR[EVEN]的首地址
PUSHFFT_CX;
PUSH2[FFT_DX];VR在堆栈中的存放
PUSH[FFT_DX];顺序为高位在前,低位在后
LDFFT_BX,SP
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSH[FFT_CX]
PUSH2[FFT_CX]
PUSHFFT_DX
CALLFADD4
LDFFT_CX,4[SP]
LDFFT_BX,SP
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSH[FFT_CX];
PUSH2[FFT_CX];完成第一级
PUSHFFT_CX;蝶形单元的
CALLFSUB4;运算
ADDSP,#6;该循环退出时,
POPFFT_DX;[SP]的值仍然
DJNZWFFT_DX,LOOP5;保存N/2
NFFT2:
LDFFT_EX,2[SP];DOFI[I]=0.0UNTILI=64,1,I--
LDFFT_CX,8[SP]
LOOP55:
PUSHFFT_CX
DECFFT_CX
SHLFFT_CX,#2
ADDFFT_CX,FFT_EX
ST0,[FFT_CX]
ST0,2[FFT_CX]
POPFFT_CX
DJNZWFFT_CX,LOOP55
NEXT22:
PUSH#2
PUSH[SP]
LDFFT_AX,16[SP]
DECFFT_AX
LOOP6:
PUSHFFT_AX
LDFFT_AX,6[SP]
SHRFFT_AX,#1
STFFT_AX,6[SP]
LDFFT_AX,4[SP]
STFFT_AX,2[SP]
LDFFT_AX,4[SP]
SHLFFT_AX,#1
STFFT_AX,4[SP]
LDFFT_CX,6[SP]
LOOP7:
PUSHFFT_CX
LDFFT_CX,4[SP]
LOOP8:
PUSHFFT_CX
LDFFT_AX,[SP]
DECFFT_AX
LDFFT_EX,10[SP]
MULUFFT_CX,FFT_AX,FFT_EX
SHLFFT_CX,#2
PUSHFFT_CX;NI
LDFFT_BX,4[SP]
DECFFT_BX
LDFFT_EX,10[SP]
MULUFFT_CX,FFT_BX,FFT_EX
ADDFFT_CX,FFT_AX
LDFFT_DX,FFT_CX
SHLFFT_CX,#2
PUSHFFT_CX;NK
LDFFT_CX,12[SP]
SHRFFT_CX,#1
ADDFFT_CX,FFT_DX
SHLFFT_CX,#2
PUSHFFT_CX;NJ
LDFFT_AX,30[SP];PR的首地址
LDFFT_BX,20[SP];FR的首地址
ADDFFT_AX,4[SP]
ADDFFT_BX,[SP];
SUBSP,#4;先调整堆栈指针
LDFFT_EX,SP;再进行浮点数运算
PUSH[FFT_AX];在并发环境下
PUSH2[FFT_AX];至关重要
PUSH[FFT_BX];
PUSH2[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_AX,26[SP];PI的首地址
LDFFT_BX,22[SP];FI的首地址
ADDFFT_AX,8[SP];
ADDFFT_BX,4[SP];先调整堆栈指针
SUBSP,#4;再进行浮点数运算
LDFFT_EX,SP;在并发环境下
PUSH[FFT_AX];至关重要
PUSH2[FFT_AX];
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_BX,SP
SUBSP,#4
LDFFT_EX,SP
PUSH4[FFT_BX]
PUSH6[FFT_BX]
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSHFFT_EX
CALLFSUB4;PODDR
LDFFT_AX,42[SP];PR的首地址
LDFFT_BX,30[SP];FI的首地址
ADDFFT_AX,16[SP]
ADDFFT_BX,12[SP]
ADDFFT_EX,SP,#8
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_AX,34[SP];PI的首地址
LDFFT_BX,32[SP];FR的首地址
ADDFFT_AX,16[SP]
ADDFFT_BX,12[SP]
ADDFFT_EX,SP,#4
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSHFFT_EX
CALLFMUL4
LDFFT_BX,SP
SUBSP,#4
LDFFT_EX,SP
PUSH8[FFT_BX]
PUSH10[FFT_BX]
PUSH4[FFT_BX]
PUSH6[FFT_BX]
PUSHFFT_EX
CALLFADD4;PODDI
LDFFT_AX,36[SP]
LDFFT_BX,FFT_AX
ADDFFT_AX,16[SP]
ADDFFT_BX,18[SP]
LDFFT_EX,SP
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSH4[FFT_EX]
PUSH6[FFT_EX]
PUSHFFT_AX
CALLFSUB4
LDFFT_AX,34[SP]
LDFFT_BX,FFT_AX
ADDFFT_AX,16[SP]
ADDFFT_BX,18[SP]
LDFFT_EX,SP
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSH[FFT_EX]
PUSH2[FFT_EX]
PUSHFFT_AX
CALLFSUB4
LDFFT_AX,36[SP]
ADDFFT_AX,18[SP]
LDFFT_EX,SP
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSH4[FFT_EX]
PUSH6[FFT_EX]
PUSHFFT_AX
CALLFADD4
LDFFT_AX,34[SP]
ADDFFT_AX,18[SP]
LDFFT_EX,SP
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSH[FFT_EX]
PUSH2[FFT_EX]
PUSHFFT_AX
CALLFADD4
ADDSP,#22
POPFFT_CX
DJNZWFFT_CX,NEXT3
POPFFT_CX
DJNZWFFT_CX,NEXT4
POPFFT_AX
DJNZWFFT_AX,NEXT5
JMPNEXT6
NEXT3:
JMPLOOP8
NEXT4:
JMPLOOP7
NEXT5:
JMPLOOP6
NEXT6:
ADDSP,#6
LDFFT_CX,6[SP]
LOOP9:
PUSHFFT_CX
DECFFT_CX
SHLFFT_CX,#2
LDFFT_AX,4[SP]
ADDFFT_AX,FFT_CX
SUBSP,#4
LDFFT_BX,SP
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSHFFT_BX
CALLFMUL4
LDFFT_AX,6[SP]
LDFFT_CX,4[SP]
DECFFT_CX
SHLFFT_CX,#2
ADDFFT_AX,FFT_CX
SUBSP,#4
LDFFT_BX,SP
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSH[FFT_AX]
PUSH2[FFT_AX]
PUSHFFT_BX
CALLFMUL4
LDFFT_BX,SP
PUSH[FFT_BX]
PUSH2[FFT_BX]
PUSH4[FFT_BX]
PUSH6[FFT_BX]
PUSH#FFT_AX
CALLFADD4
ADDSP,#8
LDFFT_EX,14[SP]
LDFFT_CX,[SP]
DECFFT_CX
SHLFFT_CX,#2
ADDFFT_EX,FFT_CX
PUSHFFT_AX
PUSHFFT_BX
PUSHFFT_EX
CALLFSQRT
POPFFT_CX
DJNZWFFT_CX,LOOP9
LDFFT_AX,8[SP]
STFFT_AX,12[SP]
ADDSP,#12
RET
PROCEND:
END
;===========================================================
签名:
路漫漫其修远兮,吾将上下而求索
艾诺仪器公司
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实现 FFT 算法