Дискретное преобразование Фурье

В настоящее время я пытаюсь написать некоторый алгоритм преобразования Фурье. Я начал с простого алгоритма ДПФ, как описано в математическом определении:

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. В любом случае, может ли кто-нибудь помочь мне с моей проблемой? Спасибо.

26
задан Glorfindel 13 August 2019 в 03:21
поделиться