DFT离散傅立叶变换C++实现

原创 2015年07月08日 16:11:37

DFT的执行效率是O(n^2),FFT为O(log2n),但是它对点数没有限制。

/*
     离散傅立叶算法V1.0
	   含有:DFT,IDFT
         made by xyt
		  2015/7/5
*/
#ifndef _DFT_H
#define _DFT_H
#include<iostream>
#include<math.h>
using namespace std;
#define PI 3.14159265354
struct complex{
	double r,i;
};
complex multi(complex a,complex b){
	complex tmp;
	tmp.r=a.r*b.r-a.i*b.i;
	tmp.i=a.r*b.i+a.i*b.r;
	return tmp;
}
int fi(double in){
	if((in-(int)in)>0.5) return (int)in+1;
	else return (int)in;
}
/* 离散傅立叶正变换,输出[][2]数组实部在前,采样容量n可以任意正整数 */
void DFT(int *in,double **out,const int &n)
{
	int i,j;
	complex **W=new complex*[n];
	for(i=0;i<n;i++){
		W[i]=new complex[n];
	}
	complex *lis=new complex[(n-1)*(n-1)+1];
	lis[0].r=1;lis[0].i=0;
	lis[1].r=cos(2.0*PI/n);
	lis[1].i=-1.0*sin(2.0*PI/n);
	for(i=2;i<=(n-1)*(n-1);i++){
		lis[i]=multi(lis[1],lis[i-1]);
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			W[i][j]=lis[i*j];
		}
	}
	complex sum;
	for(i=0;i<n;i++){
		sum.r=0;sum.i=0;
		for(j=0;j<n;j++){
			sum.r+=in[j]*W[i][j].r;
			sum.i+=in[j]*W[i][j].i;
		}
		out[i][0]=sum.r;
		out[i][1]=sum.i;
	}
	for(i=0;i<n;i++) delete []W[i];
	delete []W;
	delete []lis;
}
/* 离散傅立叶逆变换 */
void IDFT(double **in,int *out,const int &n)
{
	int i,j;
	complex **W=new complex*[n];
	for(i=0;i<n;i++){
		W[i]=new complex[n];
	}
	complex *lis=new complex[(n-1)*(n-1)+1];
	lis[0].r=1;lis[0].i=0;
	lis[1].r=cos(2.0*PI/n);
	lis[1].i=sin(2.0*PI/n);
	for(i=2;i<=(n-1)*(n-1);i++){
		lis[i]=multi(lis[1],lis[i-1]);
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			W[i][j]=lis[i*j];
		}
	}
	complex sum;
	for(i=0;i<n;i++){
		sum.r=0;sum.i=0;
		for(j=0;j<n;j++){
			sum.r+=W[i][j].r*in[j][0]-W[i][j].i*in[j][1];
			sum.i+=W[i][j].i*in[j][0]+W[i][j].r*in[j][1];
		}
		out[i]=fi(sum.r/n);
	}
	for(i=0;i<n;i++) delete []W[i];
	delete []W;
	delete []lis;
}
#endif


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

从零开始学习FFT(快速傅里叶变换) 这也是我学习dft算法的心得,谢谢各位

本文是从最基础的知识开始讲解,力求用最通俗易懂的文字将问题将的通俗易懂,大神勿喷,多多指教啊,虽然说是从零学习FFT,但是基本的数学知识还是要有的,sin,cos,等。        FFT(快速傅里...

DFT算法的理解和实现,望各位高手指点指点(谢谢)

DFT的公式:      其中X(k)表示DFT变换后的数据,x(n)为采样的模拟信号,公式中的x(n)可以为复信号,实际当中x(n)都是实信号,即虚部为0,此时公式可以展开为:      ...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

复数(Complex)类及FFT的C++实现

===○专业造轮子○=== 因为一些原因需要额外编写傅里叶变换(Fourier Transform)的实现代码, 而傅里叶变换需要复数的支持,因此额外编写了一个复数类。 首先是复数类Complex...

C++实现FFT代码

void FFT(complexdouble>*TD,complexdouble>*FD,int r)//r为log2N,即迭代次数   {       LONG  &...
  • heycwn
  • heycwn
  • 2016-04-20 17:13
  • 2079

c++ DFT 二维傅里叶变换

最近写了一个计算图像
  • lcbwlx
  • lcbwlx
  • 2014-10-27 18:10
  • 1464

离散傅里叶变换C++代码

/* * myfft.h */ #ifndef __MYFFT_H__ #define __MYFFT_H__ #include typedef struct _my_complex {...
  • jfu22
  • jfu22
  • 2016-01-25 15:54
  • 1350

算法导论第三十(30)章多项式与快速傅里叶变换

主要是算法导论上的FFT笔记和作业题。

DFT(离散傅里叶变换)

/******************************************************************************* ** 程序名称:离散傅里叶变换(DFT...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)