本帖最后由 beyond696 于 2012-3-21 20:00 编辑
首先声明程序不是我写的,我只是拿来用,顺便把使用的方法介绍给大家,当然老鸟就直接可以跳过了,程序验证过没有问题,我用它实现了音乐频谱,可以看看我之前发的音乐频谱视频连接。附件里面是源程序。
再次感谢无私奉献给我们程序的人......
性能:
64点 :1.50299ms(CPU时钟72M)
128点 :3.09864ms(CPU时钟72M)
使用方法指导:
1,需要两个文件,fft_fp.c和fft_fp.h
2,根据需求修改fft_fp.h中的采样点数FFT_N,采样点数以宏定义的方式定义
3,外部声明两个全局变量,已经在fft_fp.c中定义
extern struct compx s[FFT_N]; //FFT输入和输出:从S[0]开始存放,根据大小自己定义
extern float SIN_TAB[FFT_N/4+1]; //正弦信号表
4,调用create_sin_tab(float *sin_t)函数将正弦信号数据表生成在内存中,比如这样调用create_sin_tab(SIN_TAB);
5,采样数据,将ADC采样的数据按自然序列放在s的实部,虚部为0
6,调用FFT(struct compx *xin)函数开始计算,计算结果也存放在xin中,比如我们这样调用:FFT(s),结果存放在s中
7,计算每个频点的模值,计算方法如下:
for(i=1;i<FFT_N/2;i++){ //求变换后结果的模值,存入复数的实部部分
s.real=sqrt(s.real*s.real+s.imag*s.imag)/(i=0?FFT_N:FFT_N/2));
}
8,大功告成! |