Я работаю над реализацией в CUDA Двухдоменного изображения, снимающего шум , мне удалось преобразовать большую часть их кода Matlab в C ++, но я застрял в реализации fft2.
Код выполняет последовательность двусторонних фильтров и вейвлет-сжатия для фрагментов размера rxr для каждого пикселя изображения. Я назначил поток для каждого пикселя так, чтобы каждый патч изображения выполнялся параллельно графическим процессором.
Код выполняет что-то вроде этого
g = xp(i:i+2*r, j:j+2*r); // rxr patch centered on pixel 1
d = g - g(1+r, 1+r); // subtract patch center
k = exp(- d.^2 ./ (gamma_r * sigma2)) .* h; // bilateral kernel
G1 = ifftshift((g - gt) .* k)
G2 = fft2(G1);
Я могу скопировать все шаги, кроме G2. В своей докторской диссертации, автор статьи использует прореживание по частоте БПФ, я не особенно знаком с этим и не могу понять, как применить его функцию к моему коду.
__device__void st_fft(cuComplex*f, int n)
{
for (int m = n/2; m > 0; m >>= 1)
for (int r = 0 ; r < n; r += m*2)
for (int j = 0 ; j < m; j ++)
{
cuComplex a = f[r + j];
cuComplex b = f[r + j + m];
f[r + j] = cuCaddf(a, b);
f[r + j + m] = cuCmulf(cuCsubf(a, b),
make_cuFloatComplex(cospif(-(float) j/m), sinpif(-(float) j/m)));
}
}
Сначала сначала мой 2d патч, преобразованный в массив измерения r * r, не является степенью 2, и что наиболее важно, эта функция работает с 1d сигналом, но если я правильно понял, мне нужно сначала применить его к строкам, а затем к столбцы.
Каков наилучший способ применения fft к небольшим патчам изображений (я думаю, максимум 50x50), представленных в виде 1d-массива, для того, чтобы реплицировать или, по крайней мере, приблизиться к результатам FFT, созданный Matlab (который должен быть реализация FFTW3)?