#python #fft #convolution
#python #бпф #свертка
Вопрос:
Проблема
Я хочу написать очень простую 1d свертку с использованием преобразований Фурье. Мой код не дает ожидаемого результата.
Код
import numpy as np
import scipy
def fftconvolve(x, y):
''' Perso method to do FFT convolution'''
fftx = np.fft.fft(x)
ffty = np.fft.fft(y)
fftc = fftx * ffty
c = np.fft.ifft(fftc)
return c.real
square = [0,0,0,1,1,1,0,0,0,0] # Example array
output = fftconvolve(square, square)
output2 = scipy.signal.fftconvolve(square, square, mode='same')
Результат
На рисунке представлена свертка с использованием scipy (оранжевый) и моей функции (синий).
Вопрос
Почему два выхода разные?
Комментарии:
1. Это может представлять интерес: scicomp.stackexchange.com/questions/25950 /…
Ответ №1:
Вы становитесь намного ближе, если используете «полный» режим вместо «того же»!
import numpy as np
import scipy
def fftconvolve(x, y):
''' Perso method to do FFT convolution'''
fftx = np.fft.fft(x)
ffty = np.fft.fft(y)
fftc = fftx * ffty
c = np.fft.ifft(fftc)
return c.real
square = [0,0,0,1,1,1,0,0,0,0] # Example array
output = fftconvolve(square, square)
output2 = scipy.signal.fftconvolve(square, square, mode='full')
Комментарии:
1. На самом деле, я не уверен, что это правда. Если вы построите результаты:
import matplotlib.pyplot as plt plt.plot(output) plt.plot(output2, '--')
Вы заметите, что выходные данные не имеют одинаковой длины. Более того, начало (левая сторона сюжета) сильно отличается между ними. Или, может быть, я не понимаю, почему это эквивалентно?