В настоящее время я пытаюсь написать некоторый алгоритм преобразования Фурье. Я начал с простого алгоритма ДПФ, как описано в математическом определении:
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);
}
Преобразование работает нормально, но только если числоValues кратно частоте дискретизации (в данном случае: 120, 240, 360,...). Вот мой результат для 240 значений:
Преобразование работает нормально.
Если я пытаюсь вычислить 280 значений, я получаю такой результат:
Почему я получаю неправильный результат, если меняю количество вычисленных значений? Я не уверен, является ли моя проблема здесь проблемой моего кода или непониманием математического определения DFT. В любом случае, может ли кто-нибудь помочь мне с моей проблемой? Спасибо.