2407FFT 128 点 FFT的sin 和 cos值存储表.docx

上传人:b****8 文档编号:10982638 上传时间:2023-02-24 格式:DOCX 页数:17 大小:21.19KB
下载 相关 举报
2407FFT 128 点 FFT的sin 和 cos值存储表.docx_第1页
第1页 / 共17页
2407FFT 128 点 FFT的sin 和 cos值存储表.docx_第2页
第2页 / 共17页
2407FFT 128 点 FFT的sin 和 cos值存储表.docx_第3页
第3页 / 共17页
2407FFT 128 点 FFT的sin 和 cos值存储表.docx_第4页
第4页 / 共17页
2407FFT 128 点 FFT的sin 和 cos值存储表.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

2407FFT 128 点 FFT的sin 和 cos值存储表.docx

《2407FFT 128 点 FFT的sin 和 cos值存储表.docx》由会员分享,可在线阅读,更多相关《2407FFT 128 点 FFT的sin 和 cos值存储表.docx(17页珍藏版)》请在冰豆网上搜索。

2407FFT 128 点 FFT的sin 和 cos值存储表.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1