Как применить 2d FFT к 1d представлению изображения - PullRequest
0 голосов
/ 19 апреля 2020

Я работаю над реализацией в 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)?

...