我试图预先形成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打开)
答案 0 :(得分:3)
CUDA FFT-> IFFT序列要求您将结果值除以转换中的元素数,如果要返回原始数据。
cuFFT执行非标准化FFT;也就是说,对输入数据集执行前向FFT,然后对得到的集合进行逆FFT,产生等于输入的数据,按元素数量进行缩放。通过数据集大小的倒数来缩放变换,留给用户按照适合的方式执行。