import numpy as np
import matplotlib.pyplot as plt

def convolve(signal, convolution):
	# Flipping the convolution mask
	convolution = convolution[::-1]

	# Half of the convolution window
	pad = int(np.floor(len(convolution) / 2))

	# Signal each point is an anchor, so we extend 2*int(pad)
	padded_signal = np.zeros(len(signal) + 2 * int(pad) + 1)
	padded_signal[1:-2] = signal

	padded_signal= np.pad(signal,(pad,pad + 1), mode="wrap")
	# Generating indices for the window
	window = np.arange(-pad, pad + 1, 1)

	return [np.sum(padded_signal[window+i]*convolution)
			for i in range(0, len(padded_signal) - 1)]

signal = np.sin(np.linspace(0, 2*np.pi*10, 500))
plt.figure(figsize= (15,5))

def peak_detection(signal):
	plt.plot(signal)
	result = convolve(signal, [1, 0, -1])
	plt.axhline(linewidth=1, color='black')
	plt.plot(range(len(signal)), result[1:-1])
	zero_crossings = np.where(np.diff(np.sign(result)))[0]
	plt.scatter(zero_crossings[1:] - 1, signal[zero_crossings[1:]],
			marker='x',color='red')
	plt.show()
	return zero_crossings

peak_detection(signal)
