Ответ 1
Мои дни сложной математики - это способы позади меня прямо сейчас, поэтому я могу что-то пропустить. Однако мне кажется, что вы делаете следующую строку:
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 );
}
}
Используется специальный класс Complex (как и до 4.0). Большая часть математики похожа на то, что вы реализовали, но внутренняя итерация выполняет дополнительные математические операции над реальными и мнимыми частями.
ДАЛЬНЕЙШЕЕ ОБНОВЛЕНИЕ: После некоторой реализации и тестирования я обнаружил, что приведенный выше код и код, предоставленные в вопросе, дают одинаковые результаты. Я также нашел, основываясь на комментариях, какая разница между тем, что генерируется из этого кода, и тем, что производится WolframAlpha. Разница в результатах заключается в том, что, по-видимому, Вольфрам применяет нормировку 1/sqrt (N) к результатам. В Wolfram Link предоставляется, если каждое значение умножается на Sqrt (2), то значения те же, что и те, которые генерируются вышеуказанным кодом (в сторону округления ошибок). Я проверил это, передав 3, 4 и 5 значениям в Wolfram и обнаружил, что мои результаты были разными по Sqrt (3), Sqrt (4) и Sqrt (5). На основе Discrete Fourier Transform информация, предоставленная wikipedia, упоминает нормализацию, чтобы сделать преобразования для DFT и IDFT унитарными. Это может быть проспект, что вам нужно посмотреть, чтобы изменить код или понять, что может делать Вольфрам.