⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c程序.txt

📁 快速傅立叶算法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 + -