[tr]/****************************************************************************/
/* */
/* 基2 时间抽取 快速傅里叶变换 / 快速傅里叶逆变换 */
/* */
/* 2014年08月25日 */
/* */
/****************************************************************************/
#include // C 语言标准输入输出函数库
#include // 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
{
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
{
CFFT_Out=CFFT_Out/Tn;
}
}
[/tr]
0
|
1个回答
|
|
|