離散フーリエ変換

なんとなく離散フーリエ変換をやってみたくてこんなプログラムを作ってみました。

#include 
#include 
using namespace std;

class Dft
{
public:
  int	m_sum;
  double* m_cos_coefficient;
  double* m_sin_coefficient;

public:
  Dft();
  ~Dft();
  void computing(double* f, int sum, double x);
  void display(void);
  void reconstruct(void);
  void reconstruct(double start, double end, int number_divid);
};

Dft::Dft()
{
  m_sum = 0;
  m_cos_coefficient=NULL;
  m_sin_coefficient=NULL;
}

Dft::~Dft()
{
  if( m_cos_coefficient!=NULL){
	delete  m_cos_coefficient;
  }
  if( m_sin_coefficient!=NULL){
	delete  m_sin_coefficient;
  }
}

void Dft::computing(double* f, int sum, double x)
{
  this->m_sum=sum;
  this->m_cos_coefficient = new double[sum];
  this->m_sin_coefficient = new double[sum];
  for( int i = 0; i < sum; i ++){
	this->m_cos_coefficient[i]=0.0;
	this->m_sin_coefficient[i]=0.0;
	double T = 2*(double)(i)*M_PI/(double)sum;
	for( int j = 0; j < sum; j ++){
	  double dx = (double)j*x;
	  this->m_cos_coefficient[i]+=f[j]*cos(dx*T);
	  this->m_sin_coefficient[i]+=f[j]*sin(dx*T);
	}
	this->m_cos_coefficient[i] /= 2.0*(double)(this->m_sum);
	this->m_sin_coefficient[i] /= 2.0*(double)(this->m_sum);
  }
}

void Dft::reconstruct(void)
{

  for( int i = 0; i < this->m_sum; i ++){
	double value = 0.0;
	for( int j = 0; j < this->m_sum; j ++){
	  double w = (double)(i);
	  	double T = 2*(double)j*M_PI/(double)this->m_sum;
	  value += m_cos_coefficient[j]*cos(w*T)+ m_sin_coefficient[j]*sin(w*T);
	}
	cout << (double)i << " " << value << endl;
  }
}

void Dft::reconstruct(double start, double end, int number_divid)
{
  double dx = (end - start)/(double)number_divid;
  for( int i = 0; i < number_divid; i ++){
	double value = 0.0;
	for( int j = 0; j < this->m_sum; j ++){
	  double T = 2*(double)j*M_PI/(double)this->m_sum;
	  double w = start + (double)(i)*(dx);
	  value += m_cos_coefficient[j]*cos(w*T)+ m_sin_coefficient[j]*sin(w*T);
	}
	cout << start + dx*i << " " << value << endl;
  }
}

int main(void)
{
  Dft dft;
  double tmp[] = {
	0,
	0,
	0,
	0,
	1,
	0,
	0,
	0,
	0,
	};

  dft.computing(tmp, sizeof(tmp)/8, 2.0);

  dft.reconstruct();
}