Не одно и то же изображение после cuda FFT и iFFT

Я пытаюсь предварительно сформировать FFT -> линейная фильтрация -> iFFT на 2D-изображении с помощью CUDA. Во-первых, в качестве теста я попытался сделать FFT и iFFt без каких-либо фильтров. После БПФ и iFFT изображение выглядит одинаково, но до операции значения пикселей изображения находились в диапазоне 0-255, а после БПФ и iFFT изображение содержит ~10^7 значений.

Тестовое изображение содержит числа с плавающей точкой, и размеры 512 x 360. Я предварительно формирую fft с помощью моей функции cuffSinogram, а iFFT - с помощью функции cuInversefftSinogram. Вот две функции, которые я написал:

#define NX 512 
#define NY 360

void cufftSinogram(cufftComplex* d_complex_Sinogram, float* d_real_sinogram){ 

cufftHandle plan; 


/* Create a 2D FFT plan. */ 
if (cufftPlan2d(&plan, NX, NY, CUFFT_R2C) != CUFFT_SUCCESS){ 
    fprintf(stderr, "CUFFT Error: Unable to create plan\n"); return;    
} 

if (cufftExecR2C(plan, (cufftReal*)d_real_sinogram, d_complex_Sinogram) != CUFFT_SUCCESS){ 
    fprintf(stderr, "CUFFT Error: Unable to execute plan\n"); return;   
} 

if (cudaDeviceSynchronize() != cudaSuccess){ 
    fprintf(stderr, "Cuda error: Failed to synchronize\n"); return; 
}   

cufftDestroy(plan);} 




void cuInversefftSinogram(float* d_real_sinogram, cufftComplex* d_complex_Sinogram){


cufftHandle plan; 


/* Create a 2D FFT plan. */ 
if (cufftPlan2d(&plan, NX, NY, CUFFT_C2R)  != CUFFT_SUCCESS){ 
    fprintf(stderr, "CUFFT Error: Unable to create plan\n"); return;    
} 

if (cufftExecC2R(plan, d_complex_Sinogram, d_real_sinogram) != CUFFT_SUCCESS){ 
    fprintf(stderr, "CUFFT Error: Unable to execute plan\n"); return;   
} 

if (cudaDeviceSynchronize() != cudaSuccess){ 
    fprintf(stderr, "Cuda error: Failed to synchronize\n"); return; 
}   

cufftDestroy(plan);} 

Одно оригинальное и измененное изображение TIFF можно найти здесь (я предлагаю открыть с imageJ)

1 ответ

Решение

Последовательности CUDA FFT->IFFT требуют, чтобы вы поделили результирующие значения на количество элементов в преобразовании, если вы хотите вернуться к исходным данным.

Из документации:

cuFFT выполняет ненормализованные FFT; то есть выполнение прямого БПФ для набора входных данных, за которым следует обратное БПФ для результирующего набора, дает данные, равные вводу, масштабированные по количеству элементов. Масштабирование любого преобразования на величину, обратную размеру набора данных, остается для пользователя, чтобы он выполнял его по своему усмотрению.

Другие вопросы по тегам