В настоящее время я пытаюсь написать алгоритм преобразования Фурье.Я начал с простого алгоритма DFT, как описано в математическом определении:
public class DFT {
public static Complex[] Transform(Complex[] input) {
int N = input.Length;
Complex[] output = new Complex[N];
double arg = -2.0 * Math.PI / (double)N;
for (int n = 0; n < N; n++) {
output[n] = new Complex();
for (int k = 0; k < N; k++)
output[n] += input[k] * Complex.Polar(1, arg * (double)n * (double)k);
}
return output;
}
}
Поэтому я протестировал этот алгоритм с помощью следующего кода:
private int samplingFrequency = 120;
private int numberValues = 240;
private void doCalc(object sender, EventArgs e) {
Complex[] input = new Complex[numberValues];
Complex[] output = new Complex[numberValues];
double t = 0;
double y = 0;
for (int i = 0; i < numberValues; i++) {
t = (double)i / (double)samplingFrequency;
y = Math.Sin(2 * Math.PI * t);
input[i] = new Complex(y, 0);
}
output = DFT.Transform(input);
printFunc(input);
printAbs(output);
}
Преобразование работает нормально, но только еслиnumberValues - это кратное значение частоты дискретизации (в данном случае: 120, 240, 360, ...).Вот мой результат для 240 значений:
http://s1.directupload.net/images/110928/n3m8hqg6.jpg
Преобразование просто работает нормально.
Если я пытаюсь вычислить 280 значений, я получаю этот результат:
http://s7.directupload.net/images/110928/qizoiqbt.jpg
Почему я получаю неверный результат, если я изменяю количество вычисленных значений?Я не уверен, что моя проблема - это проблема с моим кодом или неправильное понимание математического определения ДПФ.В любом случае, кто-нибудь может мне помочь с моей проблемой?Спасибо.