Я успешно выполнил БПФ в 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?
Обновлен:
Я пробовал следующее решение:
- Я изменяю размер входного окна "frame_frame" до fft_length (дополненного нулями)
- Выполнить cv :: dft для нового ввода
Измените размер вывода (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 на этих данных? У первого и последнего элемента есть только реальная часть?