2011-09-15 3 views
1

В настоящее время я пишу небольшой инструмент, который должен помочь мне проверить правильность моих правильно рассчитанных векторов Фурье. Теперь мне нужен n-й корень единства, указанный omega = exp(2*pi*i/n). Может ли кто-нибудь объяснить мне, как представить это omega как complex в C++?Представление комплексных чисел в 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

Любое конкретное предложение, как вычислить пи? Будет ли '' 4 * atan (1.0) '' достаточно? –

+1

Вы можете либо жестко закодировать его, либо просто использовать 'M_PI'. – Mysticial

+0

Использование Visual Studio 2010 в Windows 8 с Microsoft C++ Compiler. Включение '' cmath.h'' не предоставляет '' M_PI''! –

2

Ну, действительные и мнимые части фактора Twiddle омега всего:

double angle = 2*pi/n; 

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

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

Существует функция, которая возвращает комплексное число в полярных координатах:

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

, где rho это величина, а theta угол в радианах. В этом случае rho всегда 1,0.

const double pi = 3.141592653589793238462643383279; 
double omega = polar(1.0, 2*pi*i/n); 
Смежные вопросы