2016-03-13 2 views
3

Я заметил, что 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() 

И вот результат: Difference between numpy and dot product implementation of convolution.

Графики показывают разницу между numpy.convolve и прямой реализации свертки с использованием точечной продукции. Верхний график предназначен для простого сигнала и окна (шаг и окно Hann). Нижний график предназначен для случайного сигнала, а окно является лишь частью этого сигнала.

Так что практически нет разницы между точечным продуктом и numpy реализациями свертки для простого сигнала/окна, но для сложного сигнала/окна существует огромная разница.

Поскольку реализация продукта с точками можно рассматривать как истину, я интерпретирую эту разницу как ошибку numpy. Пожалуйста, дайте мне знать, если я ошибаюсь или если есть способ сделать numpy производить те же результаты, что и dot product.

ответ

2

Правильно реализовать свертку с точечным продуктом you need to reflect the kernel. Если переопределить conv_dot как:

def conv_dot(x, win): 
    Z = [x[cnt:cnt+win.size] for cnt in range(x.size-win.size+1)] 
    return np.dot(Z, win[::-1]) # the [::-1] is the only real change 

Вы увидите, что ошибки теперь ничтожна, как и ожидалось, в большинстве 2e-13 в апробированием я сделал со своим вторым примером.

+0

Действительно. Большое спасибо! – alex

Смежные вопросы