scipy.signal.

fftconvolve#

scipy.signal.fftconvolve(in1, in2, mode='full', оси=None)[источник]#

Свёртка двух N-мерных массивов с использованием БПФ.

Свертка in1 и in2 используя метод быстрого преобразования Фурье, с размером вывода, определяемым mode аргумент.

Обычно это намного быстрее, чем convolve для больших массивов (n > ~500), но может быть медленнее, когда требуется только несколько выходных значений, и может выводить только массивы с плавающей точкой (входные данные типа int или object будут приведены к float).

Начиная с v0.19, convolve автоматически выбирает этот метод или прямой метод на основе оценки того, какой из них быстрее.

Параметры:
in1array_like

Первый вход.

in2array_like

Второй вход. Должен иметь то же количество измерений, что и in1.

modestr {‘full’, ‘valid’, ‘same’}, необязательный

Строка, указывающая размер вывода:

full

Выходные данные — полная дискретная линейная свёртка входных данных. (По умолчанию)

valid

Выходные данные состоят только из тех элементов, которые не зависят от дополнения нулями. В режиме 'valid' либо in1 или in2 должен быть как минимум таким же большим, как другой, по каждому измерению.

same

Выходные данные имеют тот же размер, что и in1, центрированный относительно вывода 'full'.

осиint или array_like из ints или None, опционально

Оси, по которым вычисляется свертка. По умолчанию — по всем осям.

Возвращает:
выходмассив

N-мерный массив, содержащий подмножество дискретной линейной свертки in1 с in2.

Смотрите также

convolve

Использует алгоритм прямой свертки или свертки БПФ в зависимости от того, какой быстрее.

oaconvolve

Использует метод перекрытия с добавлением для выполнения свертки, что обычно быстрее, когда входные массивы большие и значительно различаются по размеру.

Примеры

Автокорреляция белого шума является импульсом.

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> sig = rng.standard_normal(1000)
>>> autocorr = signal.fftconvolve(sig, sig[::-1], mode='full')
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_mag) = plt.subplots(2, 1)
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('White noise')
>>> ax_mag.plot(np.arange(-len(sig)+1,len(sig)), autocorr)
>>> ax_mag.set_title('Autocorrelation')
>>> fig.tight_layout()
>>> fig.show()

Гауссово размытие, реализованное с использованием FFT-свертки. Обратите внимание на темные границы вокруг изображения из-за нулевого заполнения за его пределами. convolve2d функция позволяет использовать другие типы границ изображения, но работает значительно медленнее.

>>> from scipy import datasets
>>> face = datasets.face(gray=True)
>>> kernel = np.outer(signal.windows.gaussian(70, 8),
...                   signal.windows.gaussian(70, 8))
>>> blurred = signal.fftconvolve(face, kernel, mode='same')
>>> fig, (ax_orig, ax_kernel, ax_blurred) = plt.subplots(3, 1,
...                                                      figsize=(6, 15))
>>> ax_orig.imshow(face, cmap='gray')
>>> ax_orig.set_title('Original')
>>> ax_orig.set_axis_off()
>>> ax_kernel.imshow(kernel, cmap='gray')
>>> ax_kernel.set_title('Gaussian kernel')
>>> ax_kernel.set_axis_off()
>>> ax_blurred.imshow(blurred, cmap='gray')
>>> ax_blurred.set_title('Blurred')
>>> ax_blurred.set_axis_off()
>>> fig.show()
../../_images/scipy-signal-fftconvolve-1_00.png
../../_images/scipy-signal-fftconvolve-1_01.png