2011-09-15 26 views
1

私は現在、手動で計算されたフーリエベクトルが正しいかどうかを確認するのに役立つ小さなツールを書いています。今度は、omega = exp(2*pi*i/n)で指定されたn番目のUnityのルートが必要です。誰かがこのomegaをC++でcomplexとして表現する方法を私に説明できますか?離散フーリエ変換のためのC++での複素数の表現

答えて

4

使用Euler's formula

exp(2πi/n) = cos(2π/n) + i sin(2π/n) 

そして、それは簡単です:

complex<double> rootOfUnity(cos(TWOPI/n), sin(TWOPI/n)); 

(TWOPIを置き換えますあなたのシステム上で利用可能なマクロか、2πの値だけでフィットします)。

+0

どのようにpiを計算するのですか? '' 4 * atan(1.0) ''で十分でしょうか? –

+1

ハードコーディングすることも、 'M_PI'を使うこともできます。 – Mysticial

+0

Windows 8でVisual Studio 2010を使用し、Microsoft C++コンパイラを使用する。 '' cmath.h''は '' M_PI''を提供しません! –

2

まあ、回転因子オメガの実部と虚部だけである:

double angle = 2*pi/n; 

double real = cos(angle); 
double imaj = sin(angle); 

complex<double> omega(real, imaj); 
2

極座標を用いて複素数返す関数であり:rhoの大きさであり、そしてthetaはラジアン単位の角度である

#include<complex> 
complex polar(const T& rho) 
complex polar(const T& rho, const T& theta) 

この場合、rhoは常に1.0です。

const double pi = 3.141592653589793238462643383279; 
double omega = polar(1.0, 2*pi*i/n); 
関連する問題