我正在尝试使用 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 打开)