2

我需要在正方形、2 的幂、complex64 数组上执行大量 2D FFT。我想使用 pyfftw 包装器来尽可能快地做到这一点。

我正在通过 Ubuntu 18.04 运行 Anaconda,并使用“conda install -c conda-forge pyfftw”下载了 pyfftw 包

我已经设法在我的系统上运行 2D FFT,但我的一阶近似代码不起作用,我的“解决方法”似乎是在添加冗余代码。

我想知道我是否正在设置数组、fft_objects 并正确执行 FFT。

pix = 256
mid = np.int(pix/2)
arr1 = np.zeros((pix,pix)).astype('complex64')

# make a rectangular "aperture"
arr1[ mid-8:mid+8 , mid-16:mid+16 ] = 1.0+0.0j

pyfftw_threads = 4

# "declare" input and output buffers to be used for the forward transform
forward_input_buffer = pyfftw.empty_aligned((pix,pix), dtype='complex64')
forward_output_buffer = pyfftw.empty_aligned((pix,pix), dtype='complex64')

# create the forward transform object using these buffers
forward_fft_object = pyfftw.FFTW(forward_input_buffer, forward_output_buffer, axes=(0,1), direction='FFTW_FORWARD', flags=('FFTW_MEASURE', ), threads=pyfftw_threads)

好的,现在,文档(在 pyfftw.FFTW 类中的 Arguments 下)说,

“这些数组的内容将在初始化期间被规划过程破坏。”

所以这告诉我我需要将数据从“arr1”复制到 forward_input_buffer 数组中(此时我们不关心输出缓冲区,因为我们即将计算该数据)

所以,

forward_input_buffer = np.copy( arr1 )
forward_fft_object.execute()

应该计算矩形数组(我们复制到输入缓冲区)的 FFT 并将输出放入 forward_output_buffer。但是,这不起作用。forward_output_buffer 数据不变。这就是我感到困惑的地方。相反,要让它发挥作用,你必须做,

forward_input_buffer = np.copy( arr1 )
forward_fft_object.update_arrays(forward_input_buffer, forward_output_buffer)
forward_fft_object.execute()

这确实有效。但现在我有一个问题。np.copy 命令肯定是多余的吧?相反,我可以这样做,

forward_fft_object.update_arrays(arr1, forward_output_buffer)
forward_fft_object.execute()

但是我的问题是;update_arrays 命令是否将argument1 (arr1) 的内容复制到原始实例化缓冲区(forward_input_buffer) 中?或者该命令是否告诉 forward_fft_object 现在查看 arr1 的输入数据?

如果我制作的其他大小、dtype 等相同的数组(我的代码可能使用 arr1、arr2、arr3 ......即输入的许多不同数组)不是 n 字节对齐或 simd 对齐怎么办?

编辑(我意识到最后一点不清楚):

如果我必须对大量不同的数据(但总是相同的大小,dtype)执行大量 2D FFT。在那种情况下,我必须这样做,

forward_input_buffer = np.copy( current_data_array )
forward_fft_object.update_arrays(forward_input_buffer, forward_output_buffer)
forward_fft_object.execute()

但这似乎很冗长,所以我想知道我是否正确使用了 pyfftw 函数。

4

0 回答 0