#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import widgets


#Paramètres de la figure

fig=plt.figure(figsize=(12,10))

ax1 = plt.subplot(212)
ax1.set_xlim(0,2)
ax1.set_ylim(-1.2,1.2)

ax2 = plt.subplot(221)
ax2.set_xlim(0,2)
ax2.set_ylim(-1.2,1.2)

ax3 = plt.subplot(222)
ax3.set_xlim(0,5)
ax3.set_ylim(0,15)

#Paramètres de simulation

parameters = {'fe' : widgets.IntSlider(value=10, description='fréquence échantillonnage', min=1, max=50),
              'T'  : widgets.FloatSlider(value = 1, description='période', min = 0.2, max =2),
              'B'  : widgets.FloatSlider(value = 0.1, description='intensité du bruit', min =0., max =1)}


D = 200. # Duree d'observation


#Définition des fonctions : étape 1 former le signal et le visualiser

def pas_de_temps(fe):
    '''On définit les temps, un pour le signal échantillonné et l'autre pour le signal de départ'''
    N = int(D * fe) + 1
    return np.linspace(0., (N-1)/fe, N), np.linspace(0., D, 10000)

def signal(T,te,tp):
    '''On calcule le signal, ici sous forme de sinus (un signal échantillonné l'autre non)'''
    return np.cos(2. * np.pi * te / T), np.cos(2. * np.pi * tp / T)

#Définition des fonctions : étape 2 ajouter le bruit

def bruit(B,signal):
    return signal + np.random.normal(0, B, 10000)

#Definition des fonctions : étape 3 faire la fft

def fft(fe, signal):
    n = signal.size
    fourier = np.fft.fft(signal)
    freq_e = np.fft.fftfreq(n, d=1/fe)
    freq_p = np.fft.fftfreq(n, d=D/10000)
    return freq_e, fourier, freq_p


#plot et définition des widgets

def plot_data(fe,T,B):
    lines['Signal e'].set_data(pas_de_temps(fe)[0],signal(T,pas_de_temps(fe)[0], pas_de_temps(fe)[1])[0])
    lines['Signal p'].set_data(pas_de_temps(fe)[1],signal(T,pas_de_temps(fe)[0], pas_de_temps(fe)[1])[1])
    a['Signal b'].set_data(pas_de_temps(fe)[1],bruit(B, signal(T,pas_de_temps(fe)[0], pas_de_temps(fe)[1])[1]))
    a['fft e'].set_data(fft(fe,signal(T,pas_de_temps(fe)[0], pas_de_temps(fe)[1])[0])[0],fft(fe,signal(T,pas_de_temps(fe)[0], pas_de_temps(fe)[1])[0])[1].real)
    a['fft p'].set_data(fft(fe,signal(T,pas_de_temps(fe)[0], pas_de_temps(fe)[1])[1])[2],fft(fe,signal(T,pas_de_temps(fe)[0], pas_de_temps(fe)[1])[1])[1].real)
   


lines = {}
lines['Signal e'], = ax1.plot([], [],'r-',lw=2,label='Signal e')
lines['Signal p'], = ax1.plot([], [],'b--',lw=2,label='Signal p')
a = {}
a['Signal b'], = ax2.plot([], [],'g',lw=2,label='Signal b')
a['fft e'], = ax3.plot([], [],'r-',lw=2,label='fft e')
a['fft p'], = ax3.plot([], [],'b--',lw=2,label='fft p')

ax1.set_title("Signal d'entrée et signal échantillonné" )
ax2.set_title("Signal avec bruit")
ax3.set_title("Transformée de Fourier du signal d'entrée/échantillonné")

ax1.set_xlabel('temps (s)')
ax1.set_ylabel('Amplitude')
ax2.set_xlabel('temps (s)')
ax2.set_ylabel('Amplitude')
ax3.set_xlabel('fréquence (Hz)')
ax3.set_ylabel('Amplitude')



ax1.legend(loc="lower left")
ax2.legend(loc="lower left")
ax3.legend(loc="upper right")

param_widgets = widgets.make_param_widgets(parameters, plot_data, slider_box=[0.30, 0.0, 0.35, 0.05])
choose_widget = widgets.make_choose_plot(lines, box=[0.9,0.2,0.08, 0.2])
reset_button = widgets.make_reset_button(param_widgets,box=[0.01, 0.01, 0.08, 0.05])


# fourier = np.fft.fft(signal)
# n = signal.size
# freq = np.fft.fftfreq(n, d=dt)



# #plt.plot(freq, fourier.real)


# plt.xlabel("Temps $t$")
# plt.ylabel("Amplitude $x(t)$")
# plt.legend()

# ax = fig.add_subplot(2,2)
# plt.plot(tp, X, 'b*-')
# plt.grid()
# plt.ylabel("Amplitude $|X(f)|$")
# plt.xlabel("Frequence $f$")

if __name__=='__main__':
    plt.show()
