Почему fft_object.update_arrays () необходима в pyfftw? - PullRequest
2 голосов
/ 11 апреля 2019

Мне нужно выполнить много 2D БПФ на квадратах, степени 2, комплексных 64 массивов. Я хотел бы использовать упаковщики pyfftw, чтобы сделать это как можно быстрее.

Я запускаю Anaconda через Ubuntu 18.04 и скачал пакет pyfftw, используя "conda install -c conda-forge pyfftw"

Мне удалось запустить 2D БПФ в моей системе, но мой код приближения первого порядка не сработал, и мой «обходной путь», похоже, добавляет избыточный код.

Я хотел бы знать, настраиваю ли я массивы, 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) гласит:

«Содержимое этих массивов будет уничтожено процессом планирования во время инициализации.»

так что это говорит мне, что мне нужно скопировать данные из "arr1" в массив forward_input_buffer (на данный момент нам не важен выходной буфер, потому что мы собираемся вычислить эти данные)

так

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

должен вычислить БПФ прямоугольного массива (который мы скопировали во входной буфер) и поместить вывод в 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 содержимое аргумента1 (arr1) в исходный буфер создания экземпляров (forward_input_buffer)? ИЛИ сообщает ли команде forward_fft_object, что теперь нужно искать входные данные для arr1?

что если другие массивы, которые я создаю, имеют одинаковый размер, тип d и т. Д. (Мой код может использовать arr1, arr2, arr3 ... т. Е. Множество различных массивов для ввода) не выровнены по n-байтам или не симметричны выровнены

edit (я понимаю, что последний бит неясен):

если мне нужно выполнить много 2D-БПФ для большого количества разных данных (но всегда одинакового размера, dtype). В этом случае я должен был бы сделать,

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

Но это кажется многословным, поэтому мне интересно, правильно ли я использую функции pyfftw.

...