一个简单的不能再简单的DFT小Demo

版权声明:本文为博主原创文章,转载请加入原文链接,谢谢。。 https://blog.csdn.net/shawncheer/article/details/87881903

参考自:http://www.alwayslearn.com/DFT%20and%20FFT%20Tutorial/DFTandFFT_TheDFT.html

我做了代码的实现。

#include<iostream>
#include<stdlib.h>
#include<math.h>

#define N 4
#define PI 3.1415926

using namespace std;


struct cplx{
	float real;
	float imag;
};

// Input number of the sample point .
// Input pointer of the malloc memory.
// void.
void get_cplx(int num, cplx* W_N_kn ){
	for(int i=0; i<num; i++){
		(W_N_kn[i]).real=cos(-2*PI*i*1.0/4);
		(W_N_kn[i]).imag=sin(-2*PI*i*1.0/4);
	}
    return;
}

int main(){
	float x_t[N]={0, 1, 0, -1};
	
	cplx* W_N_kn=(cplx*)malloc(sizeof(cplx)*N);
	cplx* F_n=(cplx*)malloc(sizeof(cplx)*N);

	int num=N;
	get_cplx(num, W_N_kn);
	for(int i=0;i<num;i++){
		cout<<"for i:"<<i<<endl;
		cout<<W_N_kn[i].real<<"\t"<<W_N_kn[i].imag<<endl;
	}
	for(int i=0;i<num; i++){
		(F_n[i]).real=0;
		(F_n[i]).imag=0;
		cout<<"i="<<i<<endl;
		for(int j=0;j<num; j++){
			(F_n[i]).real=(F_n[i]).real+x_t[j]*(W_N_kn[j*i]).real;
			(F_n[i]).imag=(F_n[i]).imag+x_t[j]*(W_N_kn[j*i]).imag;
			cout<<j<<"\t"<<x_t[j]<<"\t"<<W_N_kn[j*i].real<<"\t"<<W_N_kn[j*i].imag<<endl;
			cout<<"x_t[j]*(W_N_kn[j*i]).real:"<<x_t[j]*(W_N_kn[j*i]).real<<"\tx_t[j]*(W_N_kn[j*i]).imag:"<<x_t[j]*(W_N_kn[j*i]).imag<<endl;
		}
	}

	for(int i=0;i<num/2;i++){
		cout<<" for: "<<i<<endl;
		cout<<(F_n[i]).real<<endl;
		cout<<(F_n[i]).imag<<endl;
		cout<<sqrt((F_n[i]).real*(F_n[i]).real+(F_n[i]).imag*(F_n[i]).imag)<<endl;;
	}

	free(W_N_kn);
	free(F_n);
	return 0;



}

猜你喜欢

转载自blog.csdn.net/shawncheer/article/details/87881903
今日推荐