void build_psf_fft(int width, int height, float ffwhm_x)
{
    PSFR = Mat::zeros(ImageR.size(), CV_32F);
   

    int hs = fwhm_x * 0.3; 
    Mat kernelX = getGaussianKernel(hs * 10, ffwhm_x);
    Mat kernelY = getGaussianKernel(hs * 10, ffwhm_x);
    Mat kernel = kernelX * kernelY.t(); 
    //Mat kernel;


    //Mat kernel;
    //resize(psf_file, kernel, Size(0, 0), 23.0/fwhm_x, 23.0/fwhm_x, INTER_AREA);
   
    hs = kernel.cols; 
    
    int dy = height - hs;
    int dx = width - hs;

    pow(kernel, power/100.0, kernel); 
    imshow("kernel", kernel * 235);
    copyMakeBorder(kernel, PSFR,
		   dy/2,
		   dy-(dy/2),
		   dx/2,
		   dx-(dx/2),
		   BORDER_CONSTANT, Scalar::all(0.0));

    //imshow("kernel", PSFR);
 
    PSFR.convertTo(PSFR, CV_32F);
    PSFI = Mat::zeros(PSFR.size(), CV_32F);
 
    Mat psf_planes[] = {PSFR, PSFI};
   

    gPSFR.upload(PSFR);
    gPSFI.upload(PSFI); 
    
    Scalar psum = cuda::sum(gPSFR);
    cuda::multiply(gPSFR, 1.0 / psum[0], gPSFR);
    
    psum = cuda::sum(gPSFR);
    Mat complexPSF;
   
    cuda::GpuMat gpPSF;
 
    merge(psf_planes, 2, complexPSF);
    gpPSF.upload(complexPSF);
    cuda::dft(gpPSF, gpPSF, gpPSF.size());
    gpPSF.download(complexPSF); 
    split(complexPSF, psf_planes);
    //imshow("fft", PSFR);
}