资源简介
基于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
相关资源
- dsp2812上128点FFTc程序以及其CMD文件
- 用FFT对信号进行频谱分析
- 基于8051单片机的红外接收程序
- FFT混合基 文章 FFT混合基 文章
- 8051单片机教程第二十七课:单片机几
- 8051单片机教程第二十六课:矩阵式键
- labview FFT变换(频域分析).vi
- 基于Altera MegaCore实现FFT的方法
- 基于FPGA的快速并行FFT及应用
- 基于FPGA的移位寄存器流水线结构FFT处
- 在FPGA上优化实现复数浮点计算
- 基于十项余弦窗插值FFT的谐波相量算
- 基于FFT算法的电网谐波检测方法
- 基4-浮点-时域-FFT
- 用FFT进行频谱分析
- Altera最新FFT ip核使用手册
- 单片机与DSP中的基于DSP的FFT算法在无
- 128点的基2-FFT算法
- FFT并行MPI实现
- FFT(快速傅里叶变换)的FPGA实现
- FFT快速傅立叶变换)图文并茂
- fftw-3.3.4.tar.gz安装包
- NUFFT算法及说明
- STM32F103通过DMA传输进行快速FFT.rar
- fftw-3.2.1.rar
- myplot.rar
- verilog写的MCU8051单片机系统
- 数字信号处理-快速傅里叶变换FFT实验
- 64点FFT变换
- FFT FPGA VERILOG 可综合,申请加精
评论
共有 条评论