Мои дни, когда я занимался сложной математикой, сейчас отстают от меня, поэтому я могу что-то упустить сам. Однако мне кажется, что вы делаете следующую строку:
transformed += data[i]*Complex.FromPolarCoordinates(1, argument*i);
когда это, вероятно, должно быть больше похоже на:
transformed += data[i]*Math.Pow(Math.E, Complex.FromPolarCoordinates(1, argument*i));
Если вы не включили это в метод FromPolarCoordinates()
UPDATE:
Я нашел следующий фрагмент кода в библиотеке AForge.NET Framework , и он показывает, что выполняются дополнительные операции Cos / Sin, которые не обрабатываются в вашем коде. Этот код можно найти в полном контексте в методе Sources \ Math \ FourierTransform.cs: DFT.
for ( int i = 0; i < n; i++ )
{
dst[i] = Complex.Zero;
arg = - (int) direction * 2.0 * System.Math.PI * (double) i / (double) n;
// sum source elements
for ( int j = 0; j < n; j++ )
{
cos = System.Math.Cos( j * arg );
sin = System.Math.Sin( j * arg );
dst[i].Re += ( data[j].Re * cos - data[j].Im * sin );
dst[i].Im += ( data[j].Re * sin + data[j].Im * cos );
}
}
Он использует собственный сложный класс (как это было до версии 4.0). Большая часть математики похожа на то, что вы реализовали, но внутренняя итерация выполняет дополнительные математические операции над действительной и мнимой частями.
ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ:
После некоторой реализации и тестирования я обнаружил, что приведенный выше код и код, приведенный в вопросе, дают одинаковые результаты. На основании комментариев я также обнаружил, что разница между тем, что генерируется из этого кода, и тем, что генерируется WolframAlpha. Разница в результатах заключается в том, что кажется, что Вольфрам применяет нормализацию 1 / sqrt (N) к результатам. В предоставленной ссылке Wolfram, если каждое значение умножается на Sqrt (2), тогда значения такие же, как и значения, сгенерированные вышеприведенным кодом (за исключением ошибок округления). Я проверил это, передав 3, 4 и 5 значений в Wolfram, и обнаружил, что мои результаты были различны по Sqrt (3), Sqrt (4) и Sqrt (5) с уважением. Основываясь на информации дискретного преобразования Фурье , предоставленной википедией, в нем упоминается нормализация, чтобы сделать преобразования для DFT и IDFT унитарными. Это может быть путь, по которому вам нужно смотреть вниз, чтобы либо изменить свой код, либо понять, что может делать Вольфрам.