加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

利用cufft进行的图像傅里叶变换的注意事项

(2016-10-10 15:16:46)
分类: CUDA
利用cuda进行fft变换时,会有一些参数设置的规则,一下举例进行说明:

float *h_Data; //"h_": host,表示CPU内存
float *d_Data; //"d_":device,表示GPU内存
fComplex *d_DataSpectrum, //fComplex:为float复数形式,x为实数,y为复数
cufftHandle  fftPlanFwd,  fftPlanInv;  //Fwd表示正变换,Inv变换反变换
const int  dataH = 1024; //二维图像的高度
const int  dataW = 512;  //二维图像的宽度
int fftH = dataH; //dataH 不为2的幂次数,需要进行图像扩展
int fftW = dataW; //dataW 不为2的幂次数,需要进行图像扩展
h_Data = (float *)malloc(dataH   * dataW * sizeof(float)); //CPU端内存分配方式
checkCudaErrors(cudaMalloc((void **)&d_Data,   dataH   * dataW   * sizeof(float))); //GPU端内存开盘方式
checkCudaErrors(cudaMalloc((void **)&d_DataSpectrum,   fftH * (fftW / 2 + 1) * sizeof(fComplex))); //cufft中R2C变换要求输入为H*W,输出为H*(W/2+1),W必须保证为2的倍数

for (int i = 0; i < dataH * dataW; i++)
{
h_Data[i] = getRand();
} //对cpu中的内存块h_Data赋值,这里仅为说明,因此用getRand()函数进行随机数产生
checkCudaErrors(cufftPlan2d(&fftPlanFwd, fftH, fftW, CUFFT_R2C)); //设置fft变换的句柄,这里需要注意,传入的参数先为fftH,fftW,即先传高度值,再传宽度值,CUFFT_R2C表示从real实数变换到complex复数
checkCudaErrors(cufftPlan2d(&fftPlanInv, fftH, fftW, CUFFT_C2R)); //设置fft反变换的句柄,雷同正变换,传入的参数先为fftH,fftW,即先传高度值,再传宽度值,CUFFT_C2R表示从complex复数变换到real实数

checkCudaErrors(cudaMemcpy(d_Data,   h_Data,   dataH   * dataW *   sizeof(float), cudaMemcpyHostToDevice));//将CPU内存的数据块copy到GPU的显存中,cudaMemcpyHostToDevice表示从host端copy到device端,cudaMemcpyDeviceToHost表示从device端copy到host端

checkCudaErrors(cufftExecR2C(fftPlanFwd, (cufftReal *)d_Data, (cufftComplex *)d_DataSpectrum));//按照FFT正变换的句柄,进行图像数据的FFT变换,注意这里的句柄使用的是fftPlanFwd

//此处为其它在频域中操作的函数

checkCudaErrors(cufftExecC2R(fftPlanInv, (cufftComplex *)d_DataSpectrum, (cufftReal *)d_Data));//将在频域中处理的结果,再反变换回空间域中,注意这里的句柄使用的是fftPlanInv

//Release
checkCudaErrors(cufftDestroy(fftPlanInv)); //销毁句柄,对应cufftPlan2d
checkCudaErrors(cufftDestroy(fftPlanFwd));//销毁句柄,对应cufftPlan2d
checkCudaErrors(cudaFree(d_DataSpectrum));//GPU中内存释放,对应cudaMalloc
checkCudaErrors(cudaFree(d_Data));//GPU中内存释放,对应cudaMalloc
free(h_Data);//CPU中内存释放,对应malloc

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有