Как выполнить FFT2D (быстрое преобразование Фурье 2D) цветовой компонент R, G, B

Я новичок в быстром преобразовании Фурье (БПФ) и не очень понимаю, как это вычисляется на языке программирования, таком как C++. Вот метод FFT2D

void FFT2D(Complex<double> *f, Complex<double> *F, int width, int height);
It takes an input image f of size width * height and output the transformed 
coefficients into F.

Советы. Пиксели изображения хранятся в виде трех отдельных цветовых плоскостей изображения (R, G, B), каждая из которых представлена ​​одномерным массивом комплексных чисел. Предположим, что размер изображения имеет ширину W и высоту H, тогда значения компонентов цвета (R, G и B) пикселей в положении изображения (m, n) можно найти как R[m + n * W], G( m + n * W) и B[m + n * W], где R, G, B — три массива комплексных чисел. Одномерный массив для преобразованных коэффициентов также представляется таким же образом.

Что мне нужно для реализации обработки только для одного цветового компонента, а шаблон программирования будет обрабатывать R, G, B отдельно на основе реализованных функций. Шаблон также дополнит изображение нулями, чтобы каждое входное изображение имело размер 2m * 2n.

If I called from another class, I have to pass R, G, B separately
Suppose: 
Complex<double> *R = new Complex<double>[width * height];
Let, width = 4096 and height 4096
FFT2D(R, output F, width, height) for compute “R” color component;
FFT2D(G, output F, width, height) for compute “G” color component;
FFT2D(B, output F, width, height) for compute “B” color component;

We have template of calculated FFT1D function:
void FFT1D(Complex<double> *fx, Complex<double> *Fu, int twoK, int stride)
Hint: it outputs the frequency coefficients in the array Fu.

FFT1D вызывает из функции FFT2D. Я нашел несколько разных типов кода на C, C++ и Java, а также C # FFT2D. Большинство из них реализовано с использованием структуры 2D-массива; они присваивают действительную и мнимую части структуре двумерного массива в цикле строк и столбцов. Однако в моем случае это одномерная структура массива цветового компонента.

Давайте напишем код внутри функции FFT2D:

Complex<double> *outPutMap = new Complex<double>[width * height];
 for (int i = 0; i < height; i++){
 #  for(int j = 0; j < width; j++){
 #     outPutMap[i + j * width] = f[i + j * width];
 #      I don’t understand how to implement in here for color component and how 
 #      it assign a value for real and imaginary part
 #   }
  }

Раньше при вызове FFTID также требовалось вычислить значение twoK, как в книге, M = 2K.

Если у вас есть какие-либо идеи или какие-либо ссылки, пожалуйста, дайте мне знать.

Спасибо

С уважением Ичиро


person user553710    schedule 21.11.2011    source источник
comment
Используйте библиотеку FFTW.   -  person J D    schedule 12.04.2012


Ответы (1)


Я бы посоветовал вам приобрести такую ​​книгу, как [Числовые рецепты][1] .

https://rads.stackoverflow.com/amzn/click/com/0521750334

БПФ, правило Симпсонов, алгоритм Фурье должны быть там. Я читал у автора по имени Раджарам... это было на C.

person Sujay Ghosh    schedule 21.11.2011
comment
На самом деле это не отвечает на вопрос, и процедура БПФ в числовых рецептах не особенно полезна. - person Paul R; 21.11.2011
comment
Sujay это не ответ, что я ищу. - person user553710; 21.11.2011
comment
-1 Numerical Recipes (2007) описывает спектральные методы, включая БПФ около 1976 года. С тех пор многое изменилось. Более актуальную информацию см. в документах FFTW. - person J D; 14.04.2012