DFT与FFT运算效率的比较

文章目录

  • 一,运算量的比较
  • 二,程序运算时间比较

一,运算量的比较

N点DFT共需要N^ 2次复数乘法和N(N-1)次复数加法,当N很大时,计算量很大。
N点FFT, N = 2 M N=2^M N=2M,进行M次分解,构成了从x(n)到X(k)的M级迭代计算,每级由N/2个蝶形运算组成,完成一个蝶形计算需一次乘法和两次复数加法。
M级运算总的复数乘次数为:
C M = N / 2 ∗ M = N / 2 ∗ l o g 2 N C_M=N/2*M=N/2*log_2N CM=N/2M=N/2log2N
复数加次数为:
C A = N ∗ M = N ∗ l o g 2 N C_A=N*M=N*log_2N CA=NM=Nlog2N
当N远大于1时,FFT的运算量远小于DFT。
例如当 N = 2 10 N=2^{10} N=210=1024时
N 2 N 2 l o g 2 N = 1048576 5120 = 204.8 \frac{N^2}{\frac{N}{2}log_2N}=\frac{1048576}{5120}=204.8 2Nlog2NN2=51201048576=204.8
这样就使运算效率提高200多倍。

二,程序运算时间比较

首先计算进行DFT所需时间,程序如下:

#include 
#include 
#include
#include

#define pi 3.1415926535

int N;
typedef struct
{
    double real,imag;
} complex;//复数结构体,定义实部,虚部

complex dft_out[9000];//用于存储dft计算结果
complex dft_mid[9000];//用于存储实部和虚部计算的值
double Amplitude[9000];//幅值
int main(int argc, char *argv[])
{
    N = atoi(argv[1]);  //命令行参数argv[1]为输入的N值,可以通过输入,控制N的值
	int n,k;
    double f;
	double time_start,time_end;
    time_start=clock();   //开始计时
    for(k=0; k

运行结果:
DFT与FFT运算效率的比较_第1张图片
FFT计算时间,代码如下:

#include 
#include 
#include 
#include

#define PI 3.1415926535 //定义宏变量PI

int main()
{ 
	int i,j;
	double time_start,time_end;//定义计时的变量
    double pr[64],pi[64],fr[64],fi[64],t[64];//pr表示采样数据的实部,pi表示采样数据的虚部,fr表示离散傅里叶变换结果的实部,fi表示离散傅里叶变换结果的虚部。
	for (i=0; i<=63; i++)  //生成输入信号
    { 
		pr[i]=0.6*sin(2*PI*500*i)+0.6*sin(2*PI*50*i); pi[i]=0.0; //依次将值赋值给pr,pi赋值为0
	}
    time_start=clock();   //开始计时
    kfft(pr,pi,64,6,fr,fi,0,1);  //调用FFT函数
	time_end=clock();    //计时结束
	for (i=0; i<64; i++)
    { 
        printf("%d\t%lf\n",i,pr[i]); //输出结果
    }
	printf("进行FFT运算时间为:%.10f ms\n",time_end-time_start);  //输出所需时间
}

运行结果:
DFT与FFT运算效率的比较_第2张图片
由结果可知,进行DFT运算时间远大于进行FFT所需时间,FFT运算效率明显高于DFT。

你可能感兴趣的:(DFT与FFT运算效率的比较)