Представление комплексных чисел в C ++ для дискретного преобразования Фурье - PullRequest
1 голос
/ 16 сентября 2011

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

Ответы [ 3 ]

4 голосов
/ 16 сентября 2011

Использование Формула Эйлера :

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

Тогда легко:

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

(замените TWOPI на макрос, доступный в вашей системе, или просто на значение 2π, как вам удобно).

2 голосов
/ 16 сентября 2011

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

#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);
2 голосов
/ 16 сентября 2011

Ну, действительная и мнимая части омега-фактора твида - это просто:

double angle = 2*pi/n;

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

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