Python Forum
Convolution with numpy - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Data Science (https://python-forum.io/forum-44.html)
+--- Thread: Convolution with numpy (/thread-2304.html)



Convolution with numpy - Tina - Mar-06-2017

Hello everyone, 

I am trying to convolute 2 signals in the time-domain:

the first when is a gaussien function and the second one is a zero array but has an impulse at x1 and an increasing ramp between x2 and x3. Both peaks of the impulse and the increasing ramp have maximum 1. 

when I try to convolute both with 
 np.convolve(gaussian, signal, 'same')
 I only get a non-zero signal for the increasing ramp. Python seams to ignore the convolution with the impulse. but when I set the ramp to zero and redo the convolution python convolves with the impulse and I get the result. 

So separately, means : Convolution with impulse --> works
                                 Convolution with increasing ramp till 1 --> works
                                 Convolution with a signal containing both  : Impulse AND ramp --> does not work, shows just result of convolution with ramp.

Can anyone help?
Thank you in advance


RE: Convolution with numpy - sparkz_alot - Mar-06-2017

I am in no way an expert about any of this, but what type of output do you get if you use mode "full" instead of "same"?


RE: Convolution with numpy - zivoni - Mar-06-2017

Neither I am an expert about signal processing, but out of curiosity I tried it and np.convolve convoluted happily.

import numpy as np
from scipy.signal import gaussian
import matplotlib.pyplot as plt

def convoluplot(signal, kernel):
    fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True)
    ax1.plot(signal)
    ax1.set_title('Signal')
    ax2.plot(kernel)
    ax2.set_title('Filter')
    filtered = np.convolve(signal, kernel, "same") / sum(kernel)
    ax3.plot(filtered)
    ax3.set_title("Convolution")
    fig.show()

signal = np.zeros(500)
signal[100:150] = 1
signal[250:400] = np.linspace(0,1,150)
kernel = gaussian(100, 10)

convoluplot(signal, kernel)
Spoiled  image of output:

When kernel was "padded" with zeros, it "zeroed" part of input signal. Perhaps try shorter filtering window or sparkz's advice to use full mode to avoid cutting?



RE: Convolution with numpy - Tina - Mar-07-2017

(Mar-06-2017, 03:38 PM)zivoni Wrote: Neither I am an expert about signal processing, but out of curiosity I tried it and np.convolve convoluted happily.

import numpy as np
from scipy.signal import gaussian
import matplotlib.pyplot as plt

def convoluplot(signal, kernel):
    fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True)
    ax1.plot(signal)
    ax1.set_title('Signal')
    ax2.plot(kernel)
    ax2.set_title('Filter')
    filtered = np.convolve(signal, kernel, "same") / sum(kernel)
    ax3.plot(filtered)
    ax3.set_title("Convolution")
    fig.show()

signal = np.zeros(500)
signal[100:150] = 1
signal[250:400] = np.linspace(0,1,150)
kernel = gaussian(100, 10)

convoluplot(signal, kernel)
Spoiled  image of output:

When kernel was "padded" with zeros, it "zeroed" part of input signal. Perhaps try shorter filtering window or sparkz's advice to use full mode to avoid cutting?
Thank you very much ! I will!

(Mar-06-2017, 02:25 PM)sparkz_alot Wrote: I am in no way an expert about any of this, but what type of output do you get if you use mode "full" instead of "same"?

unfortunately I get the same thing. But thank you very much for your reply !