1d свертка Фурье python

#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, '--') Вы заметите, что выходные данные не имеют одинаковой длины. Более того, начало (левая сторона сюжета) сильно отличается между ними. Или, может быть, я не понимаю, почему это эквивалентно?