# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# %matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt

# # Transformada de Fourier 1D
#
# 1. Use scipy.fftpack para calcular la transformada de Fourier de la señal con valores reales guardada en `data.pkl`
# 1. Muestre el espectro de magnitud y el espectro de fase.
# 1. Determine las frecuencias más relevantes estudiando el espectro de magnitud y extraiga sus amplitudes y ángulos asociados
# 1. Reconstruya la señal "limpia" usando:
#
# $$
# y = \sum_{k=1}^K A_k \cos(2\pi t f_k + \phi_k) 
# $$
#
# donde $f_k, A_k, \phi_k$ son las $K$ frecuencias, amplitudes y ángulos que usted seleccionó

# +
import pickle
t, s, Fs = pickle.load(open("data.pkl", "rb"))

fig, ax = plt.subplots(figsize=(6, 3), tight_layout=True)
ax.plot(t, s, '.');
ax.set_xlabel('Tiempo [s]')
ax.set_ylabel('Señal');
# -



# # Match filter
#
# Un *match filter* es un filtro convolucional cuyo objetivo es detectar la presencia de una señal modelo o *template* dentro de otra señal
#
# En este experimento usaremos imágenes en escala de grises
#
# - La imagen denominada `template` corresponde al modelo
# - La imagen denominada `data` corresponde a la imagen de prueba, es decir la señal donde queremos detectar la presencia o ausencia de nuestro modelo
#
#

# +
template = plt.imread("template.png")

def get_data(s_noise=0.1):
    escena = plt.imread("mario1.png")
    return escena + s_noise*np.random.randn(*escena.shape)

data = get_data(s_noise=0.1)

fig, ax = plt.subplots(1, 2, figsize=(10, 4))
ax[0].imshow(template, cmap=plt.cm.Greys_r);
ax[1].imshow(data, cmap=plt.cm.Greys_r);
# -

# > El objetivo es programar un match filter que actue como un detector de monedas para Mario
#
# Para esto utilice la función de scipy [`correlate2d`](https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.signal.correlate2d.html). Instrucciones detalladas:
#
# 1. Obtenga versiones centradas de `data` y `template` restandoles sus respectivas medias media (puede usar `np.mean`)
# 1. Obtenga la correlación cruzada entre las señales usando `correlate2d`. Estudie el rango de valore que toma la correlación cruzada
# 1. En base al resultado anterior construya y muestre una máscara binaria que sea 1 donde hay una moneda y 0 donde no hay una moneda revele sólo la posición del template en la imagen. Puede usar el operador `>` con un valor umbral adecuadamente seleccionado. 
# 1. Encuentre el valor máximo de `s_noise`  con el cual es posible detectar el template usando el umbral seleccionado anteriormente



StarcoderdataJupyterScriptsDedupFiltered