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

转载自酒窝蜗牛的博客

利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值