Я заметил, что numpy.convolve
производит странные результаты на достаточно сложных сигналах. Вот простой тестовый пример:Свертка сверток (свертка), кажется, создает огромную ошибку при сложных сигналах
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
def conv_np(x, win):
return np.convolve(x, win, 'valid')
def conv_dot(x, win):
Z = np.asarray([x[cnt:cnt+win.shape[0]] for cnt in range(x.shape[0]-win.shape[0]+1)])
return np.dot(Z, win)
# test 1
x = np.repeat([0., 1., 0.], 300)
win = signal.hamming(50)
plt.subplot(2,1,1)
plt.plot(conv_np(x, win) - conv_dot(x, win))
# test 2
x = np.random.random(size=(10000,))
win = x[4000:5000]
plt.subplot(2,1,2)
plt.plot(conv_np(x, win) - conv_dot(x, win))
plt.show()
Графики показывают разницу между numpy.convolve
и прямой реализации свертки с использованием точечной продукции. Верхний график предназначен для простого сигнала и окна (шаг и окно Hann). Нижний график предназначен для случайного сигнала, а окно является лишь частью этого сигнала.
Так что практически нет разницы между точечным продуктом и numpy
реализациями свертки для простого сигнала/окна, но для сложного сигнала/окна существует огромная разница.
Поскольку реализация продукта с точками можно рассматривать как истину, я интерпретирую эту разницу как ошибку numpy
. Пожалуйста, дайте мне знать, если я ошибаюсь или если есть способ сделать numpy
производить те же результаты, что и dot product.
Действительно. Большое спасибо! – alex