📄 untitled1.c
字号:
#include <msp430x16x.h>
PUBLIC asmFFT
RSEG CODE
asmFFT; //什么意思?????????????????
;--------------------------------------------------------------
;----------------传递C语言中定义的变量名称标号-----------------------------------
;--------------------------------------------------------------
extern x2
extern maxOfGrade; //FFT计算过程中总共需要计算的级数
extern totalOfNum; //参与FFT计算的数据点数
extern gradeOverFlowFlag; //级运算结束后,根据这位判断同级中最大的数是否超出Q13表示范围,如果超过了就将这一级的运算结果整体右移2位
extern counterOfFFTShiftTimes; //整个FFT计算完成后,总共移位的次数。
extern tempDataOfOverFlowJudge; //蝶形因子计算完成后,需要判断结果是否超出Q13,判断过程中的变量,就是放在该临时变量中。
extern gradeOfW; //旋转因子级系数,初始值为数据总点数,第一级开始就除以2,以后每开始一级都除以2;用于和factorOfW相乘,产生正余弦表偏移向量
extern numOfGrade; //级数,128点就分为7级
extern maxOfW; //最大旋转因子系数,在同一级计算中,是根据旋转因子系数进行循环的,所有的旋转因子计算完成后,该级就计算完成了
;extern stepOfBf; //同级运算中,对于一个蝶形因子,低位运算单元与高位运算单元的距离
stepOfBf EQU maxOfW ; //stepOfBf和maxOfW指向同一内存单元,
extern stepBetweenW; //同级运算中,对于具有相同旋转因子的蝶形单元将被放在一起计算,该内存中存放在这些蝶形单元之间跨距
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
extern factorOfW; //存放旋转因子系数,是根据旋转因子系数进行循环的,所有的旋转因子计算完成后,该级就计算完成了
extern shiftOfLowBf; //存放蝶形因子低位偏移量,然后蝶形因子就根据该偏移量找到对应的内存单元中存放的蝶形因子系数,在蝶形运算过程中,同级相同蝶形因子计算过程中,一个蝶形单元运算完成后,该偏移量将加上该级的蝶形运算单元跨距,开始新的同旋转单元蝶形因子计算。
extern shiftOfW; //存放着旋转因子偏移量,根据该偏移量查找旋转因子
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
extern shiftOfHighBf;
extern L1VCOS;
extern L1VSIN;
extern L1RCOS;
extern L1RSIN;
extern tableVOfFFT;数组虚部
extern fft_num
tableROfFFT equ fft_num
;extern tableROfFFT ;数组实部
;20080826:该正余弦表在文件提前写入了,需要由其他文件产生了
;extern sin_table ;正余弦表
;extern cos_table ;
;--------------------------------------------------------------
;----------------FFT单元定义-----------------------------------
;--------------------------------------------------------------
;------------------------级循环单元----------------------------
;;级一层使用的内存单元
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;---------------------------定义256个字节的单元用于存放FFT数据的实部和虚部-------------------------------
;tableROfFFT EQU 354h
;-------------------------------------------------------通用寄存器使用列表-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;R4----&shiftOfLowBf,低位蝶形因子偏移量
;R5----&shiftHighBf,高位蝶形因子偏移量
;R6----&shiftOfW.旋转因子偏移量
;R7,R8----FFT计算过程中用来存储计算过程的中间变量。
;R8-----用来做fft实部虚部数据清零循环计数器
;--------------------------------------------------
;----------- 主程序区 -------------
;--------------------------------------------------
PUSH.W R11
PUSH.W R10
PUSH.W R9
PUSH.W R8
PUSH.W R7
PUSH.W R6
PUSH.W R5
PUSH.W R4
initFFTParameters
CLR.W R11
CLR.W R10
CLR.W R9
CLR.W R8
CLR.W R7
CLR.W R6
CLR.W R5
CLR.W R4
clr.w &numOfGrade;
mov.w #1,&stepBetweenW ;同级中不同旋转因子之间距离,初始化为1,每次开始新的级内运算都需要乘以2
mov.w &totalOfNum,&gradeOfW ;
CLR.W &counterOfFFTShiftTimes ;将上次计算的次数清0
jmp BITREV
;----------------- 码位整序 ------------------
fftRoutinStart
gradeLoop ;级层循环,
cmp &maxOfGrade,&numOfGrade;判断所有级是否都算完,如果没有就跳转到级运算设置
jl gradeSet
;程序运行结束时候,弹出使用各个寄存器,使程序恢复到调用前的状态。
POP.W R4
POP.W R5
POP.W R6
POP.W R7
POP.W R8
POP.W R9
POP.W R10
POP.W R11
RET
;--------------------------------------------------
;----------------- 级层设置 ------------------
;--------------------------------------------------
gradeSet ;级层运算设置
mov.w &stepBetweenW ,&maxOfW ;最大旋转因子系数就等于(上1级)具有相同旋转因子蝶形单元之间的距离
rla &stepBetweenW ;开始设置同级中旋转因子的距离
rra &gradeOfW ;设置旋转因子级系数
inc &numOfGrade ;级数加1
clr.w &factorOfW ;将旋转因子系数清0,开始同级中不同旋转因子循环
clr.w &gradeOverFlowFlag; ;将上次的标志清0
;级运算结束后,根据这位判断同级中最大的数是否超出Q13表示范围,如果超过了就将这一级的运算结果整体右移2位
wLoop ;旋转因子循环
cmp &maxOfW,&factorOfW ;判断同级中是否旋转因子都计算完毕,没有就跳转到旋转因子计算,完毕就跳转到级层循环。
jl caculateW
tst.w &gradeOverFlowFlag ;判断是否有超出Q13,如果有,就将数据整体右移两位
jeq wLoopRet
clr.w &gradeOverFlowFlag; ;将的标志清0
;级运算结束后,根据这位判断同级中最大的数是否超出Q13表示范围,如果超过了就将这一级的运算结果整体右移2位
inc.w &counterOfFFTShiftTimes ;右移次数加1
CALL #SHUJUYIWEI
wLoopRet jmp gradeLoop
caculateW ;计算旋转因子
mov.w &factorOfW,&shiftOfLowBf //旋转因子系数就是该旋转因子的初始偏移量
dint ;关闭中断,开始根据旋转因子级系数和旋转因子系数计算旋转因子偏移量
mov.w &factorOfW,&MPY
mov.w &gradeOfW,&OP2
MOV.W &RESLO,&shiftOfW
eint ;计算完毕,重新开启中断
inc &factorOfW ;旋转因子级系数加1
bfLoop ;蝶形因子循环
cmp &totalOfNum,&shiftOfLowBf ;判断同级中具有相同的旋转因子的蝶形单元是否都计算完毕,低位蝶形因子与数据总数比较,低于就跳转到蝶形单元计算,高于就跳转到旋转因子循环处。
jl caculateBf
jmp wLoop
caculateBf
MOV.W &shiftOfLowBf,R7
add &stepOfBf,R7
mov.w R7,&shiftOfHighBf
mov.w &shiftOfLowBf,R4
mov.w &shiftOfHighBf,R5
mov.w &shiftOfW,R6
;由于表中是以字存储的,所以查表的偏移量都需要乘以2来对应字存储的表。
rla R4
rla R5
rla R6
;DINT ;关闭中断,启动乘法器运算
;L1V*COS
mov.w tableVOfFFT(R5),&MPYS
mov.w cos_table(R6),&OP2
RLA &RESLO
RLC &RESHI
RLA &RESLO
RLC &RESHI //结果左移2位??????
mov.w &RESHI,&L1VCOS
;L1V*SIN
MOV.W tableVOfFFT(R5),&MPYS
MOV.W sin_table(R6),&OP2
RLA &RESLO
RLC &RESHI
RLA &RESLO
RLC &RESHI
mov.w &RESHI,&L1VSIN
;L1R*COS
MOV.W tableROfFFT(R5),&MPYS
MOV.W cos_table(R6),&OP2
RLA &RESLO
RLC &RESHI
RLA &RESLO
RLC &RESHI
mov.w &RESHI,&L1RCOS
;L1R*SIN
MOV.W tableROfFFT(R5),&MPYS
MOV.W sin_table(R6),&OP2
RLA &RESLO
RLC &RESHI
RLA &RESLO
RLC &RESHI
mov.w &RESHI,&L1RSIN
;EINT 开启中断
YUANWEICUNCHU
L1V mov.w &L1VCOS,R8
sub.w &L1RSIN,R8
mov.w tableVOfFFT(R4),R7
sub.w R8,R7
;对计算结果取绝对值
;判断计算结果正负
;当为正时候,就不去反,当为负时候,就取反。//为什么要取反?????
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -