Я пытаюсь реализовать дискретное преобразование Фурье, но он не работает. Я, наверное, где-то написал ошибку, но еще не нашел ее.
Исходя из следующей формулы:
Эта функция выполняет первый цикл, перейдя через X0 - Xn-1...
public Complex[] Transform(Complex[] data, bool reverse)
{
var transformed = new Complex[data.Length];
for(var i = 0; i < data.Length; i++)
{
//I create a method to calculate a single value
transformed[i] = TransformSingle(i, data, reverse);
}
return transformed;
}
И фактическое вычисление, вероятно, там, где ошибка.
private Complex TransformSingle(int k, Complex[] data, bool reverse)
{
var sign = reverse ? 1.0: -1.0;
var transformed = Complex.Zero;
var argument = sign*2.0*Math.PI*k/data.Length;
for(var i = 0; i < data.Length; i++)
{
transformed += data[i]*Complex.FromPolarCoordinates(1, argument*i);
}
return transformed;
}
Далее объяснение остальной части кода:
var sign = reverse ? 1.0: -1.0;
Обратный DFT не будет иметь -1
в аргументе, тогда как обычный DFT имеет аргумент -1
.
var argument = sign*2.0*Math.PI*k/data.Length;
является аргументом алгоритма. Эта часть:
то последняя часть
transformed += data[i]*Complex.FromPolarCoordinates(1, argument*i);
Я думаю, что я тщательно скопировал алгоритм, поэтому не вижу, где я ошибся...
Дополнительная информация
Как показал Адам Гритт в своем ответе, есть хорошая реализация этого алгоритма AForge.net. Возможно, я смогу решить эту проблему за 30 секунд, просто скопировав их код. Тем не менее, я до сих пор не знаю, что я сделал неправильно в моей реализации.
Мне действительно любопытно, где мой недостаток, и что я неправильно интерпретировал.