📄 c程序.txt
字号:
#include <math.h>
const float 2PI= 2.0*3.14159265f; // 常数2PI定义
const int MAX_N = 256; // 最大DFT点数
N=256;
M=9;
//*----*----*----*----*----*----*----*----*----*----*----*----*
FFT算法模块接口定义
*----*----*----*----*----*----*----*----*----*----*----*----*//
///////////////////////////////////////////
// Function name : BitReverse
// Description : 二进制倒序操作
// Return type : int
// Argument : int src 待倒读的数
// Argument : int size 二进制位数
int BitReverse(int src, int size) //奇偶分解
{
int tmp = src;
int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}
//////////////////////////////////////////////////
// Function name : Reorder
// Description : 数据二进制整序
// Return type : void
// Argument : ADC[MAX_N] 待整序数组
// Argument : int N FFT点数
// Argument : int M 点数的2的幂次
void Reorder(ADC[MAX_N], int N, int M)
{
new_ADC[MAX_N];
for (int i=0; i<N; i++)
{new_ADC[i] = ADC[BitReverse(i, M)]; // 重新存入原数据中(已经是二进制整序过了的数据)
X[i] = new_ADC[i]; }
}
//////////////////////////////////////////////////
// Function name : CalcW
// Description : 计算旋转因子
// Return type : void
// Argument : int N FFT的点数
// Argument : int flag 正逆变换标记
void CalcW(double *re, double *im,int N)
{
for (int i=0; i<N/2; i++)
{
bcarg = -2PI*i/N;
aw = cos(bcarg);
re[i]=aw;
bw = sin(bcarg);
im[i]=bw;
}
}
/////////////////////////////////////////////////
// Function name : FFT_1D_Kernel
// Description : FFT算法核心
// Return type : void
// Argument : Comp* x 数据
// Argument : int M 幂次
// Argument : int flag 正逆变换标记
void FFT_1D(double *ADC[MAX_N], int M, int flag)
{
X[N];
Reorder(N, M); //整序
CalcW(N,M); // 旋转因子计算
Y[256];
// 级内群数
int GroupNum = N/2; // 第一级的群数为N/2
// 群内蝶形单元数
int CellNum = 1; // 第一级的群内蝶形单元数为1
// 处理各级
for (int i=0; i<M; i++)
{
// 处理各群
for (int j=0; j<GroupNum; j++)
{
// 处理各蝶形单元
for (int k=0; k<CellNum; k++)
{
// (1) 计算出当前蝶形单元所含元素在数据数组中的位置
// 第一元素位置
int Pos1 = CellNum * j * 2 + k ; // 已经处理了前 j 群,每群有 CellNum 个单元, 每单元有 2 个元素
// 第二元素位置
int Pos2 = Pos1 + CellNum;
// (2) 计算旋转因子与单元的第二元素的复数乘积
atemp = re[k*GroupNum] * X[Pos2] - im[k*GroupNum] * Y[Pos2];
btemp = re[k*GroupNum] * Y[Pos2] + im[k*GroupNum] * X[Pos2];
// (3) 计算最终结果, 并存入到数组的原先位置
X[Pos2] = X[Pos1] - atemp;
Y[Pos2] = Y[Pos1] - btemp;
X[Pos1] = X[Pos1] + atemp;
Y[Pos1] = Y[Pos1] + btemp;
}
}
GroupNum >>= 1; // 级别增加, 则相应的群数减少一半
CellNum <<= 1; // 级别增加, 则相应的群内单元数增加一倍
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -