import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
u = np.linspace(-1,1,100)
x = np.minimum(1-u, 1+u)
shifts = np.arange(-6,8,2)
plt.figure(figsize=(12,2))
U = np.concatenate([u+i for i in shifts])
X = np.tile(x,[len(shifts)])
plt.plot(U, X, 'k')
plt.xticks(np.arange(-7,7.1));
plt.xlim([-5,5])
plt.ylim([0,1]);
def round_to_even(x):
return np.round(x/2)*2
plt.figure(figsize=(12,6))
plt.plot(U, X, 'k')
plt.plot(U, round_to_even(U))
plt.xlim([-5,5])
plt.ylim([-4,4])
z = np.linspace(-0.5, 0.5, 100)
filters = {
'tophat': np.ones(20),
'cos': np.cos(2*np.pi*z) ,
'sin': np.sin(2*np.pi*z) ,
'sawtooth': (z+0.5)
}
filters = {k:np.pad(v, [100-len(v)//2, 100-len(v)//2], mode='constant') for k,v in filters.items()}
plt.figure(figsize=(6,6))
for name, filt in filters.items():
plt.plot(np.linspace(-1,1,200), filt, label=name)
plt.legend();
plt.xlim([-1,1])
x_extended = np.tile(x,[3])
plt.figure(figsize=(12,6))
for i in range(1,3):
plt.subplot(1,2,i)
plt.plot(u, x, label ='original', linewidth=2, color='k')
for name, filt in filters.items():
conv = np.convolve(x_extended, filt, 'same')[len(u):-len(u)]
conv = 2*(conv-np.min(conv))/(np.max(conv) - np.min(conv)) - 1
if i == 2:
conv = round_to_even(conv)
plt.plot(u, conv, label='conv w/ %s'%name)
plt.legend();
plt.xticks(np.arange(-1,1.1));
plt.xlim([-1,1])
plt.ylim([-1,1])
X_extended = np.tile(x,[len(shifts)+2])
plt.figure(figsize=(20,4))
for i in range(1,3):
plt.subplot(1,2,i)
plt.plot(U, X, label ='original', linewidth=2, color='k')
for name, filt in filters.items():
conv = np.convolve(X_extended, filt, 'same')[len(u):-len(u)]
conv = 2*(conv-np.min(conv))/(np.max(conv) - np.min(conv)) - 1
if i == 2:
conv = round_to_even(conv)
plt.plot(U, conv, label='conv w/ %s'%name)
plt.legend();
plt.xticks(np.arange(-5,5.1));
plt.xlim([-5,5])
plt.ylim([-1,1])
plt.figure(figsize=(12,2))
plt.plot(U, X,'k')
plt.plot(U, X*(1-X))
plt.xticks(np.arange(-7,7.1));
plt.xlim([-7,7])
plt.figure(figsize=(12,6))
plt.plot(U, X, 'k')
plt.plot(U, U + X*(1-X))
plt.plot(U, round_to_even(U + X*(1-X)))
plt.xticks(np.arange(-7,7.1));
plt.xlim([-7,7])