利用FFT成功实现拓扑识别(十二)–对FFT算法的理解5
DFT算法的另一种实现方式
DFT算法的实现是FFT的基础,除了前文利用欧拉公式展开后的计算方法外,还有不展开,利用cexp函数实现的方法,程序上更简洁,下面结合朋友们的要求,介绍一下。
复数在c语言中的使用
复数是 a+bi 形式的数,其中 a 和 b 是真数,在 C 代码中是浮点值,i 是根号 -1。a 被称作复数的实数部分,b 乘以 i 被称作虚数部分。前文我们采用自定义结构图的方法仿真了复数的计算,通过结构体的成员变量,我们可以直接操作实部和虚部。实际上,在c语言中,有专用的<complex.h>标准头文件,定义了用于处理复数的功能。并定义了3 个特化类型:complex、complex、complex。另外,还定义了相关的操作has:
在本文中,使用 complex来示例,使用上面的cexp函数来实现dft的计算,对其他特化类型的操作是基本相同的。实现方法如下:
int dft()
{
double _Complex X[N],x[N]; //定义输出和输入缓冲区,N为点数
int k,i;
int lsd;
for(i=0; i<N; i++)//产生输入序列
{
//数据采集代码或填充数据区代码
x[i] =。。。 。。。
printf(“%d\t%lf\n”,i,x[i]); //输出计算结果
}
for(k = 0; k < N; k++) //计算DFT
{
X[k] = 0;
for(i = 0; i < N; i++)
{
double _Complex tmp = x[i] * cexp(-I*(2pi/N)ik);
X[k] = X[k] + tmp;
}
printf(“%f\t%f\n”, k, cabs(X[k])); //输出幅度
}
}
是不是非常简单、清晰。