離散フーリエ変換
なんとなく離散フーリエ変換をやってみたくてこんなプログラムを作ってみました。
#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(); }