docs: def psf_general(vx_size=(1,1,1), fwhm=(5, 5, 6), hradius=8, scale=2):
      '''
      Separable kernels for convolution executed on the GPU device
      The outputted kernels are in this order: z, y, x
      '''
      xSig = (scale*fwhm[0]/vx_size[0]) / (2*(2*np.log(2))**.5)
      ySig = (scale*fwhm[1]/vx_size[1]) / (2*(2*np.log(2))**.5)
      zSig = (scale*fwhm[2]/vx_size[2]) / (2*(2*np.log(2))**.5)
  
      # get the separated kernels
      x = np.arange(-hradius,hradius+1)
      xKrnl = np.exp(-(x**2/(2*xSig**2)))
      yKrnl = np.exp(-(x**2/(2*ySig**2)))
      zKrnl = np.exp(-(x**2/(2*zSig**2)))
  
      # normalise kernels
      xKrnl /= np.sum(xKrnl)
      yKrnl /= np.sum(yKrnl)
      zKrnl /= np.sum(zKrnl)
  
      krnl = np.array([zKrnl, yKrnl, xKrnl], dtype=np.float32)
  
      # for checking if the normalisation worked
      # np.prod( np.sum(krnl,axis=1) )
  
      # return all kernels together
      return krnl