# 5k et 500k

# Importation des modules et ouverture le l'interface :

import pycanum.main as pycan

import numpy

import math

import matplotlib.pyplot as plt

import time
import scipy as signal
import matplotlib.ticker as tck

import pylab
from scipy.optimize import curve_fit

sys = pycan.Sysam("SP5")







#On encapsule tout l'analyse de la réponse sinusoïdale dans une fonction dont les arguments sont : l'objet Sysam, la fréquence et l'amplitude de la sinusoïde à appliquer :



def analyser(sys,f,a):

    print("Frequence = %f"%f)

    ne =10

    T=1.0/f

    te=T/ne

    v1 = numpy.zeros(ne,numpy.double)

    for k in range(ne):

        phi = 2.0*math.pi/ne*k

        v1[k] = a*math.sin(phi)

    sys.config_sortie(1,te*10**6,v1,-1)

    sys.config_entrees([0,1],[10.0,10.0])

    np=10 # nombre de périodes de l'acquisition

    nea = ne*np

    duree = nea*te

    sys.config_echantillon(te*10**6,nea)

    sys.declencher_sorties(1,0)

    time.sleep(1)

    sys.acquerir()

    sys.stopper_sorties(1,0)

    t=sys.temps()

    u=sys.entrees()

    mu0 = numpy.mean(u[0])

    mu1 = numpy.mean(u[1])

    rms0 = numpy.std(u[0])

    rms1 = numpy.std(u[1])

    g = rms1/rms0

    gdb = 20.0*math.log10(g)

    print("GdB = %f"%(gdb))

    cosphi = numpy.mean((u[0]-mu0)*(u[1]-mu1))/(rms0*rms1)

    print("cosphi = %f"%cosphi)

    phi = math.acos(cosphi)*(-1)

    print("phi = %f deg"%phi)

    return gdb,cosphi,phi

            

#Choix des fréquences sur une échelle logarithmique et création des différents tableaux :



freq = numpy.logspace(start=2,stop=5.3,num=50)

gdb = numpy.zeros(freq.size,dtype=numpy.float32)

cosphi = numpy.zeros(freq.size,dtype=numpy.float32)

phi = numpy.zeros(freq.size,dtype=numpy.float32)

            

#Choix de l'amplitude et boucle de calcul :



amplitude = 0.1

for k in range(freq.size):

    gdb[k],cosphi[k],phi[k] = analyser(sys,freq[k],amplitude)

sys.fermer()



#Modélisation de la courbe



def func(gdb,a,b):

    return 20*numpy.log10(abs(a/(1-1j*freq/(b))))



popt, pcov =signal.optimize.curve_fit(func, freq, gdb,bounds=(0, [10000., 100000.]))



            

#Tracé du diagramme de Bode :



pylab.figure()

pylab.semilogx(freq,gdb,'k+')



plt.plot(freq, func(freq, *popt), 'k-',label='fit: a=%5.3f, b=%5.3f' % tuple(popt))

plt.title('Diagramme de Bode en gain du système amplificateur inverseur pour ')

pylab.xlabel("f (Hz)")
plt.yticks(numpy.arange(10,65, 10))
ax=plt.gca()
ax.yaxis.set_minor_locator(tck.MultipleLocator(base=1))



pylab.ylabel("GdB")

plt.grid(b=True, which='major', color='#000000', linestyle='-')

plt.grid(b=True, which='minor', color='#000000', linestyle='--')



pylab.show()

