2407FFT 128 点 FFT的sin 和 cos值存储表.docx
《2407FFT 128 点 FFT的sin 和 cos值存储表.docx》由会员分享,可在线阅读,更多相关《2407FFT 128 点 FFT的sin 和 cos值存储表.docx(17页珍藏版)》请在冰豆网上搜索。
2407FFT128点FFT的sin和cos值存储表
TMS320LF2407上实现快速傅里叶变换(FFT)
快速傅立叶变换(FFT)的原理
FFT的程序代码
(1)主程序
#include"f2407_c.h"
#include"math.h"
#defineN32//FFT变换的点数
externvoidfft(void);
externvoidresave(void);
interruptvoidphantom(void);
voidsysinit(void);
externintinput[2*N];//输入数据的存储数组
intindati[N]={0};
//-----------------------------------------------------------------------------------
//128点FFT所需的数据
//采样函数:
x=1/4+1/4cos(3*2*pi*f*t)+1/4cos(6*2*pi*f*t)+1/4cos(9*2*pi*f*t);
//f=50Hz
//-----------------------------------------------------------------------------------
/*intindatr[N]={16394,15871,14425,12398,10276,8584,7767,8088,9557,11913,14660,17155,18724,18802,17044,13411,8197,1995,-4389,-10071,-14231,-16255,-15844,-13057,-8309,-2296,4125,10079,14819,17843,18969,18342,16394,13739,11055,8950,7848,7921,9070,10961,13110,14992,16159,16334,5479,13792,11675,9640,8197,7741,8457,10264,12815,15554,17812,18939,18429,16034,11825,6203,-156,-6405,-11662,-15165,-16394,-15165,-11662,-6405,-156,6203,11825,16034,18429,18939,17812,15554,12815,10264,8457,7741,8197,9640,11675,13792,15479,16334,16159,14992,13110,10961,9070,7921,7848,8950,11055,13739,16393,18342,18969,17843,14819,10079,4125,-2296,-8309,-13057,-15844,-16255,-14231,-10071,-4389,1995,8197,13411,17044,18802,18724,17155,14660,11913,9557,8088,7767,8584,10276,12398,14425,15871,
};*/
//-----------------------------------------------------------------------------------
//32点FFT所需的数据
//采样函数:
x=1/4+1/4cos(3*2*pi*f*t)+1/4cos(6*2*pi*f*t)+1/4cos(9*2*pi*f*t);
//f=50Hz;pi=π;
//-----------------------------------------------------------------------------------
/*intindatr[N]={16384,10270,9551,18713,8192,-14222,-8304,14810,16384,7843,13102,15469,8192,12807,18418,-0156,-16384,-0156,18418,12807,8192,15469,13102,7843,16383,14810,-8304,-14222,8192,18713,9551,10270,
};*/
intindatr[N]={0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,0x0F801,
};
//-----------------------------------------------------------------------------------
//64点FFT所需的数据
//采样函数:
x=1/4+1/4cos(3*2*pi*f*t)+1/4cos(6*2*pi*f*t)+1/4cos(9*2*pi*f*t);
//f=50Hz
//-----------------------------------------------------------------------------------
/*intindatr[N]={16384,14416,10270,7762,9551,14651,18713,17034,8192,-4387,-14222,-15834,-8304,4123,14810,18957,16384,11049,7843,9064,13102,16149,15469,11668,8192,8452,12807,17801,18418,11818,-0156,-11655,-16384,-11655,-0156,11818,18418,17801,12807,8452,8192,11668,15469,16149,13102,9064,7843,11049,16383,18957,14810,4123,-8304,-15834,-14222,-4387,8192,17034,18713,14651,9551,7762,10270,14416,};*/
//---------------------------------------------------------------
//128点FFT的sin和cos值存储表
//---------------------------------------------------------------
/*constintsintab[N]={0x07fff,0x0,0x07fd9,0x0f9b9,0x07f62,0x0f375,0x07e9d,0x0ed38,
0x07d8a,0x0e708,0x07c2a,0x0e0e7,0x07a7d,0x0dad8,0x07885,0x0d4e1,
0x07642,0x0cf05,0x073b6,0x0c946,0x070e3,0x0c3aa,0x06dca,0x0be32,
0x06A6C,0x0B8E4,0x066CE,0x0B3C1,0x062F1,0x0AECD,0x05ED6,0x0AA0C,
0x05A81,0x0A57F,0x055F4,0x0A12A,0x05133,0x09D0F,0x04C3F,0x09932,
0x0471C,0x09594,0x041CD,0x09237,0x03C56,0x08F1F,0x036B9,0x08C4B,
0x030FB,0x089C0,0x02B1E,0x0877D,0x02527,0x08584,0x01F19,0x083D7,
0x018F8,0x08277,0x012C7,0x08164,0x00C8B,0x0809F,0x00647,0x08029,
0x00000,0x08001,0x0F9B9,0x08029,0x0F375,0x0809F,0x0ED39,0x08164,
0x0E708,0x08277,0x0E0E7,0x083D7,0x0DAD9,0x08584,0x0D4E2,0x0877D,
0x0CF05,0x089C0,0x0C947,0x08C4B,0x0C3AA,0x08F1F,0x0BE33,0x09237,
0x0B8E4,0x09594,0x0B3C1,0x09932,0x0AECD,0x09D0F,0x0AA0C,0x0A12A,
0x0A57F,0x0A57F,0x0A12A,0x0AA0C,0x09D0F,0x0AECD,0x09932,0x0B3C1,
0x09594,0x0B8E4,0x09237,0x0BE33,0x08F1F,0x0C3AA,0x08C4B,0x0C947,
0x089C0,0x0CF05,0x0877D,0x0D4E2,0x08584,0x0DAD9,0x083D7,0x0E0E7,
0x08277,0x0E708,0x08164,0x0ED39,0x0809F,0x0F375,0x08029,0x0F9B9
};*/
//---------------------------------------------------------------
//64点FFT的sin和cos值存储表
//---------------------------------------------------------------
/*constintsintab[N]={0x7FFF,0x0000,0x7F61,0xF375,0x7D89,0xE708,0x7A7C,0xDAD9,0x7640,0xCF05,0x70E1,0xC3AA,0x6A6C,0xB8E4,0x62F1,0xAECD,
0x5A81,0xA57F,0x5133,0x9D0F,0x471C,0x9594,0x3C56,0x8F1F,
0x30FB,0x89C0,0x2527,0x8584,0x18F8,0x8277,0x0C8B,0x809F,
0x0000,0x8001,0xF375,0x809F,0xE708,0x8277,0xDAD9,0x8584,
0xCF05,0x89C0,0xC3AA,0x8F1F,0xB8E4,0x9594,0xAECD,0x9D0F,
0xA57F,0xA57F,0x9D0F,0xAECD,0x9594,0xB8E4,0x8F1F,0xC3AA,
0x89C0,0xCF05,0x8584,0xDAD9,0x8277,0xE708,0x809F,0xF375,};*/
//---------------------------------------------------------------
//32点FFT的sin和cos值存储表
//---------------------------------------------------------------
constintsintab[N]={
0x7FFF,0x0000,0x7D89,0xE708,0x7640,0xCF05,0x6A6C,0xB8E4,
0x5A81,0xA57F,0x471C,0x9594,0x30FB,0x89C0,0x18F8,0x8277,
0x0000,0x8001,0xE708,0x8277,0xCF05,0x89C0,0xB8E4,0x9594,
0xA57F,0xA57F,0x9594,0xB8E4,0x89C0,0xCF05,0x8277,0xE708,
};
externinttable128[];
externintnom;//当nom=1时,FFT需要归一化处理
main()
{inti;
doublex=0,y;
nom=1;//需要归一化处理
sysinit();
for(i=0;i<=255;i++)input[i]=0;//清除输入数据
resave();//把原始的输入数据反序排列
*PCDATDIR=(*PCDATDIR&0x0FF00)|0x01;
fft();//进行FFT运算
*PCDATDIR=*PCDATDIR&0x0FF00;
}
voidinterruptphantom(void)
{
return;
}
voidsysinit(void)
{
*SCSR1=0x81FE;
*WDCR=0x0E8;
*IFR=0x0FF;
*IMR=0x0;
WSGR=0;
*MCRB=0;
*PCDATDIR=0x100;
}
(2)反序排列子程序
.def_resave
//基2时间抽取的128点FFT算法需要定义的各量
//N.set128
//基2时间抽取的64点FFT算法需要定义的各量
//N.set64
//基2时间抽取的32点FFT算法需要定义的各量
N.set32
.global_resave
.global_input
.global_indatr
.global_indati
_resave:
//-------------------------------------------------------------------
//与C语言兼容的代码部分
//-------------------------------------------------------------------
POPD*+
SARAR0,*+
SARAR1,*
LARAR0,*+,AR3
//------------------------------------------------------------------
//反序排列程序部分
//------------------------------------------------------------------
LARAR2,#_input
LARAR3,#_indatr
LARAR0,#N
LARAR4,#(N-1)
RESAV1
LACC*+,0,AR2
SACL*BR0+,AR4
BANZRESAV1,*-,AR3
//-------------------------------------------------------------------
//与C语言兼容的程序代码部分
//-------------------------------------------------------------------
MAR*,AR1
SBRK#2
LARAR0,*-
PSHD*
RET
(3)FFT应用子程序
//-------------------------------------------------------------------------------------------------
//函数名:
voidfft(void)
//功能:
实现32、64或128采样点的快速傅立叶变换
//入口条件:
//_sintab存放FFT运算中用到的sin和cosin函数值
//_input存放FFT运算中用到的数据,包括实部和虚部,按二进制反序排列
//注意:
由于“*BR0+”间接寻址方式对_input的地址有特殊的要求,
//所以最好将数组_input放置在一个独立的块中,如B1块。
//_nom当_nom=0时,本函数将不对运算结果进行归一化。
反之,将对每
//一步运算结果进行归一化处理,避免溢出,但是,它会使运算精度降低。
//N常数,参与FFT运输的点数,用户可根据需要选择,例如,需要进行128点
//FFT时,请在本函数中做出如下选择:
//N.set128
//M.set7
//依此类推。
//出口条件:
//_input存放FFT的运算结果
//本函数可供C调用,请用户在C主程序中作以下声明:
//externvoidfft(void);
//constintsintab[N]={...};N为128、64或32
//externint_input[2*N];
//externintnom;
//--------------------------------------------------------------------------------------------------
.def_fft
//基2时间抽取的128点FFT算法需要定义的各量
//N.set128//点数
//M.set7//N=2**M
//基2时间抽取的64点FFT算法需要定义的各量
//N.set64//点数
//M.set6//N=2**M
//基2时间抽取的32点FFT算法需要定义的各量
N.set32//点数
M.set5//N=2**M
_input.usect".data0",2*N//输入数据
//.bss_sintab,N//SIN和COSIN函数的存储表
.bss_nom,1//当_nom=1时,FFT需要归一化处理,为0时则不需要
.global_fft
.global_sintab
.global_input
.global_nom
.text
_fft:
//--------------------------------------
//与C语言兼容的代码部分
//--------------------------------------
POPD*+//存储返回地址ADDRESS
SARAR6,*+//存储AR6
SARAR7,*+//存储AR7
SARAR0,*+//存储AR0
SARAR1,*//堆栈分布情况:
ADDRESS/AR6/AR7/AR0/AR1
//ARP=AR1,AR1:
AR1
LARAR0,#08h
LARAR3,*0+,AR3//AR3:
FP,SP=SP+size(size=frame的长度)
//ARP=AR3
LARAR2,*//AR2:
AR1
LARAR7,#_nom//AR7指向_nom
//-----------------------------------------
//初始化一些寄存器
//-----------------------------------------
SPLK#(N-1),*+
SPLK#(M-1),*+
//堆栈分布情况:
ADDRESS/AR6/AR7
///AR0/N/M/Y(其中Y为没有确定的量)
//ARP=AR3,AR2:
N,AR3:
Y
SPLK#1,*+,AR2//ID=1,ARP=AR2
//堆栈分布情况:
ADDRESS/AR6/AR7/AR0///N/M/ID/YARP=AR2,AR2:
N,AR3:
//-----------------------------------------
//FFT运算处理部分
//-----------------------------------------
SETCOVM//使能溢出模式
SETCSXM//符号扩展使能
SPM1//PREG寄存器的输出左移一位,
//自动将两个Q15相乘后化为Q15的格式
LACC*+,AR3
ADD#1
SACL*+,1,AR2//IW=2*(N+1)
//堆栈分布情况:
ADDRESS/AR6/AR7
///AR0/N/M/ID/IW/Y
//ARP:
AR2,AR2:
M,AR3:
Y,
LARAR5,*+//AR5=M,ARP:
AR2,AR2:
ID,
//AR3:
Y,AR5=M
LOOP3
LARAR6,#_input//AR6:
input-->Ri,ARP:
AR2,
//AR2:
ID,AR3:
Y,AR5=M,AR6:
input
LACC*,1
SACL*+//ID=ID*2,ARP:
AR2,AR2:
IW,
//AR3:
Y,AR5=M,AR6:
input
LACC*,15
SACH*//IW=IW/2
LACC*-,15,AR3
SACH*+,AR2//C2=IW/2
//堆栈分布情况:
ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/Y
//ARP:
AR2,AR2