Двухмерная справка FFTW

В настоящее время я пытаюсь вычислить fft изображения с помощью fftw_plan_dft_2d.

Чтобы использовать эту функцию, я линеаризую данные изображения в массив in и вызываю функцию, упомянутую выше (и подробно описанную ниже).

ftw_plan fftw_plan_dft_2d(int n0, int n1,
                            fftw_complex *in, fftw_complex *out,
                            int sign, unsigned flags);

Функция изменяет сложный массив out с размером, равным количеству пикселей в исходном изображении.

Знаете ли вы, является ли это правильным способом вычисления 2D FFT изображения? Если да, то что представляют собой данные внутри out? IE Где находятся значения высокой и низкой частоты в массиве?

Спасибо, djs22


person djs22    schedule 16.03.2011    source источник


Ответы (2)


Двухмерное БПФ эквивалентно применению одномерного БПФ к каждой строке изображения за один проход, за которым следует одномерное БПФ для всех столбцов выходных данных первого прохода.

Выход 2D FFT такой же, как и результат 1D FFT, за исключением того, что у вас есть комплексные величины в измерениях x, y, а не только одно измерение. Пространственная частота увеличивается с индексом x и y, как и ожидалось.

В руководстве по FFTW есть раздел (здесь), который охватывает организацию выходных данных двухмерного БПФ от реального к сложному, если вы его используете.

person Paul R    schedule 16.03.2011
comment
Спасибо за ответ. Проблема, с которой я сталкиваюсь, заключается в том, что это 2D FFT возвращает массив 1D. Его достаточно легко перенастроить в двумерный массив соответствующего размера, но я все еще не совсем уверен, как работать с данными. ‹br/› Я почти уверен, что это будет означать, что мой низкочастотный контент будет в верхнем левом углу, а более высокочастотный контент будет в правом нижнем углу? ‹br/› Относительно раздела в руководстве; как вы сказали, это явно для реальной и сложной функции, но, к сожалению, я использую fftw_plan_dft_2d. - person djs22; 16.03.2011
comment
@ djs22: ОК - массив на самом деле не одномерный, это n0 x n1 в основном порядке строк - см. Раздел 2.2 руководства FFTW. - person Paul R; 16.03.2011

Это. Попробуйте вычислить 2 плана:

plan1 = fftw_plan_dft_2d(image->rows, image->cols, in, fft, FFTW_FORWARD, FFTW_ESTIMATE); 
plan2 = fftw_plan_dft_2d(image->rows, image->cols, fft, ifft, FFTW_BACKWARD, FFTW_ESTIMATE);

Вы получите исходные данные в ifft.

Надеюсь, поможет :)

person João Faria    schedule 19.05.2012