资源简介
基于8051单片机的快速傅里叶变换,应用蝶形算法,降低成本,已试过无问题!!
代码片段和文件信息
//#include
#include “fft.h“
void Int_FFT(int X[]unsigned int FFT_Nchar windowtypechar RealFlagchar SignFlag)
{ int DotDiv=2048/FFT_N; //由于查的表是的角度步进为2*pi/2048;故如果FFT点数少于2048时应查的表的步进要加倍.
int FFT_HFNum; //FFT点数
int FFT_Level=0; //FFT的级数
int LCnt; //级数的计数器
int FFT_Seg; //当前级FFT中的段数
int SCnt; //段数计数器
int SeGBTF; //每段包含的碟形算子的个数
int ButterFlySCnt; //每段中碟形算子序号
int ButterFlyCnt; //碟形算子总的序号地址
int ButterFlyCpl; //碟形算子对的另外一个数据的地址
int Ele_Inteval; //每个碟形算子涉及的两个元素的间隔
// int RealDirCrtImagDirCrt;
#if MAC120
int Rx1buffRx2buffIx1buffIx2buff;
int RSxbuffISxbuff;
char SFRPAGBUFF;
#else
long Rx1buffRx2buffIx1buffIx2buff;
long RSxbuffISxbuff;
long MACBUFMACBUF1MACBUF2MACBUF3;
#endif
int Wnk;
int WnkInterval;//
int EXP2[16]={0x00010x00020x00040x00080x00100x00200x00400x0080
0x01000x02000x04000x08000x10000x20000x40000x8000
};//2的N次幂表.
/*120MCU时的页寄存器处理:
*/
#if MAC120
SFRPAGBUFF=SFRPAGE;
SFRPAGE=MAC0_PAGE;
#endif
/*FFT前期数据准备工作.
*/
if(SignFlag!=1)//如果为不是有符合数据需要转化为有符合数据.
for(LCnt=0;LCnt {FFT_Seg=X[LCnt];
SCnt=FFT_Seg-0x8000;
X[LCnt]=SCnt;
}
FFT_N=FFT_N/2; //用N/2点求是标准FFT数据量的1/2
FFT_HFNum=FFT_N;
FFT_Level=0;
for(;FFT_N!=0x0001;FFT_N=FFT_N>>1)FFT_Level++; //得到FFT级数
/*FFT加窗;
*/
#if MAC120
MAC0CF=0x01; //工作为乘法方式;
#endif
switch(windowtype)
{
case ‘h‘:if(RealFlag)
{
for(LCnt=0SCnt=0;SCnt {RSxbuff=X[SCnt];
#if MAC120
MAC0A=hammingwindow[LCnt];
MAC0B=RSxbuff;
X[SCnt]=MACW1;
#else
// MACBUF1=hammingwindow[LCnt];
MACBUF=MACBUF1*RSxbuff;
MACBUF=MACBUF>>16;
X[SCnt]=MACBUF;
#endif
SCnt++;
}
}
break;
case ‘T‘:break;
}
//if(Int16FullFlag)for(LCnt=0;LCnt>1;//如果输入为16位满刻度数据需要转换为15位以防溢出.
/*FFT碟形运算:
*/ /*
#if MAC120
#else
Rx1buff=0;
Rx2buff=0;
RSxbuff=0;
for(LCnt=0;LCnt {Rx1buff=X[LCnt];
RSxbuff= RSxbuff+Rx1buff;
}
#endif*/
/*****遍历所有级***********/
for(LCnt=0;LCnt {FFT_Seg=EXP2[LCnt]; //得到本级FFT需要计算的段数
SeGBTF=EXP2[FFT_Level-LCnt-1];//得到本级FFT中每段的算子个数
Ele_Inteval=EXP2[FFT_Level-LCnt];//得到每个碟形算子涉及的两个元素的距离*2
ButterFlyCnt=0; //碟形算子序号复位
#if MAC120
MAC0CF=0x01; //工作于乘法方式不是乘加方式
MAC0A=FFT_Seg;
MAC0B=2;
MAC0A=DotDiv;
MAC0B=MACW0;
WnkInterval=MACW0;//得到旋转因子的旋转间隔.WnkInterval=2*FFT_Seg*DotDiv;2是由于实数FFT时将N个点的FFT减少为N/2个点的FFT
//当FFT点数少于2048时步进为2048时的DotDiv(2048/FFT_N)倍.
MAC0CF=0x00; //工作于乘加方式
#else
WnkInterval=FFT_Seg*DotDiv;
WnkInterval=WnkInterval<<1;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
I.A.... 9606 2007-09-01 22:57 FFT.c
----------- --------- ---------- ----- ----
9606 1
- 上一篇:摄影测量连续法相对定向
- 下一篇:图像分割+GUI
相关资源
- 1024点FFT快速傅立叶变换,16位数据输
- 3780点FFT实现
- stm32DSP 库FFT
- LABVIEW中利用FFT求波形频率
- 基于FPGA的FFT算法设计与实现
- 5529ADC采样进行fft计算
- msp430f5529计算fft程序,可用
- fft算法1024
- DSP 基2 FFT算法的详细代码带注释本人
- uCOS-II_DDS_FFT
- 28点fft.rar
- 8051单片机altium元件库
- 基于FPGA的fft变换
- LED音乐频谱
- FFT算法的DSP实现.rar
- DSP算法实验大作业
- DSP 基2 FFT 算法详细代码带注释
- FFT滤波处理
- 2D FFT基于CUDA的并行处理
- 对矩阵进行快速傅里叶变换fft原理以
- 波形发生器 Proteus
- 基于msp430f149的FFT算法,结果在1602液晶
- FFT和APFFT比较程序
- tdc-gp2的测试程序
- 1024点FFT源程序VHDL
- 基于stm32的音乐频谱显示
- STM32的傅里叶算法
- msp430FFT程序
- 1024点FFT快速傅立叶变换(vhdl)
- FFT64+FPGA+verilogHDL
评论
共有 条评论