Дискретное преобразование Фурье (не БПФ) в Java - PullRequest
2 голосов
/ 04 марта 2011

Я делаю назначение для класса CSE в Java и реализую FFT и прямое DFT (с матричными вычислениями). Мой FFT работает нормально, но мой прямой DFT не работает. Моя матрица Фурье не содержит правильных значений, и я хочу знать, является ли она ошибкой пользователя, или проблема вместо этого лежит в классе Complex, который я использую ( org.apache.commons.math. комплекс ). С таким классом мейнстрима я представляю, что это просто ошибка пользователя, так что если кто-то может указать на это, это было бы здорово.

Мои вычисления матрицы Фурье работают следующим образом:

Complex[][] fmatrix = new Complex[cvector.length][cvector.length]; // Initialize Matrix
    for(int k = 0; k < n; k++) { 
        double val = -2.0 * k * Math.PI / n; // Calculate exponential value
        Complex w = new Complex(0.0,val); // Store that in a Complex value and set imaginary piece to the exponential value
        for (int l = 0; l < n; l++) {
            Complex powerof = new Complex((double) (k*l),0.0); // Calculate the power to take it to
            fmatrix[k][l] = w.exp().pow(powerof); // Take the exponent, then raise it to powerof
        }
    }

У меня есть некоторые элементы, извлеченные в переменные для целей отладки, но весь код должен работать из моего понимания.

Однако приведенный выше код для вектора длины n = 4 дает следующую матрицу:

      Mine                    Desired
[ 1,  1,  1, 1          [  1,  1,  1,  1
  1, -j, -1, j             1, -j, -1,  j
  1,  1,  1, 1     =/=     1, -1,  1, -1
  1, -j, -1, j ]           1,  j, -1, -j ]

Любая помощь очень ценится.

1 Ответ

6 голосов
/ 04 марта 2011

Я просто кратко взглянул на ваш код и решил сначала взглянуть на математику, потому что прошло некоторое время с тех пор, как я выполнял FFT и DFT (очень долго для DFT) Мне интересно об этой строке:

double val = -2.0 * k * Math.PI / n; // Calculate exponential value

Я не понимаю, почему есть k, поскольку уравнение, которое я вижу, равно -2 PI i / n, и я не думаю, что вам нужен i в сложном классе. Я сомневаюсь, что это ваша проблема, просто вопрос, который у меня был. Я отправлю еще раз, если найду что-нибудь еще.

...