0

我正在尝试使用 CUDA 在 2D 图像上执行 FFT -> 斜坡滤波 -> iFFT。首先,作为测试,我尝试在没有任何过滤器的情况下进行 FFT 和 iFFt。在 FFT 和 iFFT 之后,图像看起来相同,但在操作之前,图像像素值在 0-255 之间,而在 FFT 和 iFFT 之后,图像包含 ~10^7 值。

测试图像包含浮点数,尺寸为 512 x 360。我使用“cuffSinogram”函数执行 fft,使用“cuInversefftSinogram”函数执行 iFFT。这是我写的两个函数:

#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 打开)

4

1 回答 1

3

如果要返回原始数据,CUDA FFT->IFFT 序列要求您将结果值除以转换中的元素数。

文档中:

cuFFT 执行未归一化的 FFT;也就是说,对输入数据集执行正向 FFT,然后对结果集执行反向 FFT,得到的数据等于输入,按元素数量缩放。通过数据集大小的倒数缩放任一变换,留给用户执行。

于 2014-07-30T12:00:33.930 回答