|  | 
 
| /****************************************************************************/ /*                                                                          */
 /*              基2 时间抽取 快速傅里叶变换 / 快速傅里叶逆变换              */
 /*                                                                          */
 /*              2014年08月25日                                              */
 /*                                                                          */
 /****************************************************************************/
 #include <stdio.h>                  // C 语言标准输入输出函数库
 #include <math.h>                   // C 数学函数库
 
 #include "mathlib.h"                // DSP 数学函数库
 #include "dsplib.h"                 // DSP 函数库
 
 /****************************************************************************/
 /*                                                                          */
 /*              宏定义                                                      */
 /*                                                                          */
 /****************************************************************************/
 // 软件断点
 #define SW_BREAKPOINT     asm(" SWBP 0 ");
 
 // 采用点数
 #define Tn  16
 // 采样频率
 #define Fs  256.0
 
 // π 及 浮点数极小值
 #define PI                3.14159
 #define F_TOL             (1e-06)
 
 /****************************************************************************/
 /*                                                                          */
 /*              全局变量                                                    */
 /*                                                                          */
 /****************************************************************************/
 // 快速傅里叶变换测试
 #pragma DATA_ALIGN(Input, 8);
 float Input[Tn];
 
 #pragma DATA_ALIGN(CFFT, 8);
 float CFFT[2*Tn]={0,0,-9,9,9,-9,-9,-9,9,9,-9,9,9,-9,-9,-9,0,0,-9,9,9,9,-9,-9,9,-9,-9,9,9,9,-9,-9};
 
 
 #pragma DATA_ALIGN(CFFT_In, 8);
 float CFFT_In[2*Tn];
 
 #pragma DATA_ALIGN(CFFT_Out, 8);
 float CFFT_Out[2*Tn];
 
 #pragma DATA_ALIGN(Cw, 8);
 float Cw[2*Tn];
 
 #pragma DATA_ALIGN(Cmo, 8);
 float Cmo[Tn];
 
 /****************************************************************************/
 /*                                                                          */
 /*              函数声明                                                    */
 /*                                                                          */
 /****************************************************************************/
 void bit_rev(float* x, int n);
 void gen_w_r2(float* w, int n);
 
 void FFTTest(void);
 
 /****************************************************************************/
 /*                                                                          */
 /*              主函数                                                      */
 /*                                                                          */
 /****************************************************************************/
 int main(void)
 {
 // FFT 测试
 FFTTest();
 
 // 断点
 SW_BREAKPOINT;
 }
 
 /****************************************************************************/
 /*                                                                          */
 /*              快速傅里叶变换测试                                          */
 /*                                                                          */
 /****************************************************************************/
 // 比特位反转
 void bit_rev(float* x, int n)
 {
 int i,j,k;
 float rtemp,itemp;
 j=0;
 
 for(i=1;i<(n-1);i++)
 {
 k=n>>1;
 
 while(k<=j)
 {
 j-=k;
 k>>=1;
 }
 
 j+=k;
 
 if(i<j)
 {
 rtemp=x[j*2];
 x[j*2]=x[i*2];
 x[i*2]=rtemp;
 itemp=x[j*2+1];
 x[j*2+1]=x[i*2+1];
 x[i*2+1]=itemp;
 }
 }
 }
 
 // 产生旋转因子
 void gen_w_r2(float* w, int n)
 {
 int i;
 
 float e=PI*2.0/n;
 
 for(i=0;i<(n>>1);i++)
 {
 w[2*i]=cossp(i*e);
 w[2*i+1]=sinsp(i*e);
 }
 }
 
 // 快速傅里叶变换
 void FFTTest(void)
 {
 
 
 // 保留一份 FFT 输入副本
 memcpy(CFFT_In, CFFT, 2*Tn*sizeof(float));
 
 gen_w_r2(Cw, Tn);
 
 
 bit_rev(CFFT_In, Tn);
 
 
 // IFFT 计算
 DSPF_sp_icfftr2_dif(CFFT_In, Cw, Tn);
 memcpy(CFFT_Out, CFFT_In, 2*Tn*sizeof(float));
 
 for(i=0;i<Tn;i++)
 {
 CFFT_Out[i]=CFFT_Out[i]/Tn;
 }
 
 
 }
 
 
 | 
 |