Как вы можете указать длину FFT в cv :: dft как в Python numpy.fft.rfft - PullRequest
0 голосов
/ 23 января 2019

Я успешно выполнил БПФ в python, используя numpy.fft.rfft (). Теперь я хочу перенести этот код на C ++.

После изучения этих тем Как я могу перенести код, который использует numpy.fft.rfft, с python на C ++? , я могу использовать cv :: dft для выполнения FFT. Однако проблема в том, что с numpy.fft.rfft () есть дополнительные параметры, которые имеют длину fft , и я не могу найти ее в cv.

Мой код Python выглядит следующим образом:

window_frame = np.array([1,2,3,4])
fft_length = 10
np.abs(np.fft.rfft(window_frame, int(fft_length)))

Результат:

[10. , 8.16620583 , 4.25325404, 2.51258479 , 2.62865556 , 2.] 

Длина равна (fft_length / 2) + 1.

В C ++ я выполняю следующий код:

std::vector<double> t;
cv::dft(window_frame, t)

Результат:

[10. -2., 2., -2.]

Как мне достичь того же результата, что и в версии Python?


Обновлен:

Я пробовал следующее решение:

  1. Я изменяю размер входного окна "frame_frame" до fft_length (дополненного нулями)
  2. Выполнить cv :: dft для нового ввода
  3. Измените размер вывода (fft_length / 2) + 1

    std :: vector t; window_frame.resize (fft_length); cv :: dft (window_frame, t); t.resize ((fft_length / 2) +1);

    * * 1 041

Результат:

[10 2.30902 -7.83297 -4.04508 -1.31433 1.19098 2.21238 1.54508 -2.12663 -2]

, что аналогично версии Python при применении np.fft.rfft ()

[10 + 0j, 2.309 - 7.832j, -4.045 - 1.3143j, 1.19098 + 2.212j, 1.54508 -2.126j, -2 + 0j]

Теперь, как я могу выполнить np.abs на этих данных? У первого и последнего элемента есть только реальная часть?

1 Ответ

0 голосов
/ 23 января 2019

При установке длины БПФ в вашем коде Python входной сигнал обрезается или дополняется нулями до требуемой длины перед применением алгоритма БПФ.

В C ++ вы можете, например, сделать

windows_frame.resize(fft_length, 0);
cv::dft(windows_frame, t);

OpenCV имеет свой собственный уникальный способ представления действительной частотной области, он отличается от того, что производит NumPy.NumPy выводит комплексные значения N / 2 + 1 (обратите внимание! Здесь используется целочисленное деление).OpenCV выводит N реальных значений. Прочитайте документы , чтобы выяснить, как интерпретировать вывод cv::dft для вещественного ввода и вывода.Короче говоря, первый элемент массива соответствует нулевой частотной составляющей (которая всегда является действительной величиной), а последующие элементы массива соответствуют действительной и мнимой компонентам первой половины частотного спектра.Для массивов четного размера последний элемент массива соответствует частотному компоненту N / 2 (который всегда является действительным значением).Для массивов нечетного размера частотный компонент N / 2 также сложен, и оба его компонента присутствуют (хотя это не указано явным образом в документации).

  • Четный размер: [r0, r1, i1, r2, i2, ... rN/2]
  • Нечетный размер: [r0, r1, i1, r2, i2, ... rN/2 iN/2]
...