?? 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 + -