cuda FFT和iFFT后的图像不同

cuda FFT和iFFT后的图像不同,cuda,fft,cufft,Cuda,Fft,Cufft,我试图用CUDA在2D图像上进行FFT->斜坡滤波->iFFT。首先,作为测试,我尝试在没有任何滤波器的情况下进行FFT和iFFt。在FFT和iFFT之后,图像似乎相同,但在操作之前,图像像素值在0-255之间,在FFT和iFFT之后,图像包含约10^7个值 测试图像包含浮点数,尺寸为512 x 360。我用“袖口正弦图”函数进行fft,用“CUINVERSEFFT”函数进行iFFT。这是我写的两个函数: #define NX 512 #define NY 360 void cufftSin

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

测试图像包含浮点数,尺寸为512 x 360。我用“袖口正弦图”函数进行fft,用“CUINVERSEFFT”函数进行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打开)

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

从:

cuFFT执行非标准化FFT;也就是说,对输入数据集执行正向FFT,然后对结果集执行反向FFT,生成的数据等于输入,并按元素数量进行缩放。按数据集大小的倒数缩放任一变换都留给用户执行


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

从:

cuFFT执行非标准化FFT;也就是说,对输入数据集执行正向FFT,然后对结果集执行反向FFT,生成的数据等于输入,并按元素数量进行缩放。按数据集大小的倒数缩放任一变换都留给用户执行


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

从:

cuFFT执行非标准化FFT;也就是说,对输入数据集执行正向FFT,然后对结果集执行反向FFT,生成的数据等于输入,并按元素数量进行缩放。按数据集大小的倒数缩放任一变换都留给用户执行


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

从:

cuFFT执行非标准化FFT;也就是说,对输入数据集执行正向FFT,然后对结果集执行反向FFT,生成的数据等于输入,并按元素数量进行缩放。按数据集大小的倒数缩放任一变换都留给用户执行


投票结束。因此期望:“寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:“另请参阅CUFFT中的FFT->IFFT要求您(向下)返回原始数据所需的元素数。可能您只需将结果除以(512*360)。谢谢,这就是问题所在。请投票关闭。因此期望:“寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:“另请参阅CUFFT中的FFT->IFFT要求您(向下)返回原始数据所需的元素数。可能您只需将结果除以(512*360)。谢谢,这就是问题所在。请投票关闭。因此期望:“寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:“另请参阅CUFFT中的FFT->IFFT要求您(向下)返回原始数据所需的元素数。可能您只需将结果除以(512*360)。谢谢,这就是问题所在。请投票关闭。因此期望:“寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:“另请参阅CUFFT中的FFT->IFFT要求您(向下)返回原始数据所需的元素数。可能您只需将结果除以(512*360)。谢谢,这就是问题所在。