cuda FFT和iFFT之后的图像不一样

时间:2014-07-30 10:33:52

标签: cuda fft cufft

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

测试图像包含浮点数,尺寸为512 x 360.我使用我的" cuffSinogram"预先形成fft。功能,和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图像here(我建议用imageJ打开)

1 个答案:

答案 0 :(得分:3)

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

来自documentation

  

cuFFT执行非标准化FFT;也就是说,对输入数据集执行前向FFT,然后对得到的集合进行逆FFT,产生等于输入的数据,按元素数量进行缩放。通过数据集大小的倒数来缩放变换,留给用户按照适合的方式执行。