为了对一维阵列进行希尔伯特变换,必须:FFT阵列
将数组的一半加倍,另一半归零
逆FFT结果
我用的是PyCuLib。到目前为止我的代码def htransforms(data):
N = data.shape[0]
transforms = nb.cuda.device_array_like(data) # Allocates memory on GPU with size/dimensions of signal
transforms.dtype = np.complex64 # Change GPU array type to complex for FFT
pyculib.fft.fft(signal.astype(np.complex64), transforms) # Do FFT on GPU
transforms[1:N/2] *= 2.0 # THIS STEP DOESN'T WORK
transforms[N/2 + 1: N] = 0+0j # NEITHER DOES THIS ONE
pyculib.fft.ifft_inplace(transforms) # Do IFFT on GPU: in place (same memory)
envelope_function = transforms.copy_to_host() # Copy results to host (computer) memory
return abs(envelope_function)
我有一种感觉,这可能与Numba的CUDA接口本身有关。。。它允许像这样修改数组(或数组切片)的单个元素吗?我假设可能,因为变量transforms是一个numba.cuda.cudadrv.devicearray.DeviceNDArray,所以我认为它可能有一些与numpy的ndarray相同的操作。在
简而言之,使用Numba的device_arrays,在切片上做一个简单的操作最简单的方法是什么?我得到的错误是unsupported operand type(s) for *=: 'DeviceNDArray' and 'float'