Я пытаюсь реализовать дискретное преобразование Фурье, но оно не работает. Я, вероятно, где-то написал ошибку, но я ее еще не нашел.
На основе следующей формулы:
Эта функция выполняет первый цикл, перебирая 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;
Обратное ДПФ не будет иметь -1
в аргументе, в то время как обычное ДПФ имеет в аргументе -1
.
var arguments = sign * 2.0 * Math.PI * k / data.Length;
- аргумент алгоритма. Эта часть:
, затем последняя часть
преобразована + = data [i] * Complex.FromPolarCoordinates (1, аргумент * i);
Я думаю, что тщательно скопировал алгоритм, поэтому я не вижу, где Я совершил ошибку ...
Как показал в своем ответе Адам Гритт, AForge.net предлагает прекрасную реализацию этого алгоритма. Я, наверное, смогу решить эту проблему за 30 секунд, просто скопировав их код. Однако я все еще не Я не знаю, что я сделал неправильно в своей реализации.
Мне действительно любопытно, в чем мой недостаток и что я неправильно интерпретировал.