C语语言言数数据据结结构构算算法法之之实实现现快快速速傅傅立立叶叶变变换换
C语语言言数数据据结结构构算算法法之之实实现现快快速速傅傅立立叶叶变变换换
本实例将实现二维快速傅立叶变换,同时也将借此实例学习 c语言实现矩阵的基本操作、复数的基本掾作,复习所学过的动态
内存分配、文件操作、结构指针的函数调 等内容。
很久以来,傅立叶变换一直是许多领域,如线性系统、光学、概率论、量子物理、天线、数字图像处理和信号分析等的一个基本
分析工具,但是即便使 计算速度惊人的计算机计算离散傅立叶变换所花费的时间也常常是难以接受的,因此导致了快速傅立叶
变换 (FFT)的产生。
本实例将对一个二维数组进行正、反快速傅立叶变换。正傅立叶变换时dfft()函数先调 fft()按行对数组进行变换,再对结果调
fft()按列进行变换,此时完成了快速傅立叶变换,再调 rdfft()函数进行傅立叶逆变换。如果程序设计正确的话,变换的结果应
与原数组相同。
实例代码:
#include
#include
#include
#define PI 3.14159265358979323846
st uct COMPLEX
{
float e;
float im;
} cplx , * Hfield , * S , * R , * w;
int n , m;
int ln , lm;
void initiate ();
void dfft ();
void dfft ();
void show esult ();
void fft (int l , int k);
int eve se (int t , int k);
void W (int l);
int loop (int l);
void conjugate ();
void add (st uct COMPLEX * x , st uct COMPLEX * y , st uct COMPLEX * z);
void sub (st uct COMPLEX * x , st uct COMPLEX * y , st uct COMPLEX * z);
void mul (st uct COMPLEX * x , st uct COMPLEX * y , st uct COMPLEX * z);
st uct COMPLEX * H ead(int i , int j);
void Hw ite (int i , int j , st uct COMPLEX x);
void main ()
{
initiate ();
p intf("\n原始数据:\n");
show esult();
getcha ();
dfft ();
p intf("\n快速复利叶变换后的结果:\n");
show esult ();
getcha ();
dfft ();
p intf("\n快速复利叶逆变换后的结果:\n");
show esult ();
getcha ();
f ee (Hfield);
}
void initiate ()
{//程序初始化操作,包括分配内存、读入要处理的数据、进行显示等
FILE * df;
df = fopen ("data.txt" , " ");
fscanf (df , "%5d" , &n);
fscanf (df , "%5d" , &m);
if ((ln = loop (n)) == -1)
{
p intf (" 列数不是2的整数次幂 ");
exit (1);
}
if ((lm = loop (m)) == -1)
{
p intf (" 行数不是2的整数次幂 ");
exit (1);
}
Hfield = (st uct COMPLEX *