# -*- coding: utf-8 -*- """ Created on Thu Apr 17 10:40:18 2014 @author: Matthieu """ import numpy as np from scipy import signal import matplotlib.pyplot as plt import os # pour manipuler les répertoires ################################## ### définition du signal d'entrée ################################## a=5.0 # rapport entre les fréquences t=np.linspace(0,3,5000) # durée du signal de 3 secondes cos1 = np.cos(2*np.pi*t) cos2 = np.cos(2*np.pi*a*t) cos3 = np.cos(2*np.pi*a*a*t) entree = cos1 + cos2 + cos3 ################################## ### définition des filtres de Butterworth ################################## # passe bas d'ordre 1 de fréquence de coupure 1 def bas1(x): return(1.0/(1.0+x*1j)) # passe bas d'ordre 2 de fréquence de coupure 1 def bas2(x): return(1.0/(1.0+np.sqrt(2)*x*1j-x*x)) # passe haut d'ordre 1 de fréquence de coupure a^2 def haut1(x): return(1j*(x/(a**2))/(1.0+(x/(a**2)*1j))) # passe haut d'ordre 2 de fréquence de coupure a^2 def haut2(x): return(-(x/a**2)**2/(1.0+np.sqrt(2)*(x/a**2)*1j-(x/a**2)**2)) # passe bande d'ordre 2 de fréquence de coupure a def bande1(x): return(bas1(x/a)*haut1(x*a)) # passe bande d'ordre 4 de fréquence de coupure a def bande2(x): return(bas2(x/a)*haut2(x*a)) ################################### ### réponse temporelle ################################### plt.figure() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,entree) plt.title(u"Signal d'entrée") plt.show() ################################### ### calcul de la réponse temporelle ################################### sortie_bas1 = abs(bas1(1))*np.cos(2*np.pi*t+np.angle(bas1(1))) \ + abs(bas1(a))*np.cos(2*np.pi*a*t+np.angle(bas1(a))) \ + abs(bas1(a*a))*np.cos(2*np.pi*a*a*t+np.angle(bas1(a*a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,sortie_bas1,'r') plt.title(u'Passe-bas peu sélectif') plt.show() sortie_bas2 = abs(bas2(1))*np.cos(2*np.pi*t+np.angle(bas2(1))) \ + abs(bas2(a))*np.cos(2*np.pi*a*t+np.angle(bas2(a))) \ + abs(bas2(a*a))*np.cos(2*np.pi*a*a*t+np.angle(bas2(a*a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,sortie_bas2,'r') plt.title(u'Passe-bas sélectif') plt.show() sortie_haut1 = abs(haut1(1))*np.cos(2*np.pi*t+np.angle(haut1(1))) \ + abs(haut1(a))*np.cos(2*np.pi*a*t+np.angle(haut1(a))) \ + abs(haut1(a*a))*np.cos(2*np.pi*a*a*t+np.angle(haut1(a*a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,sortie_haut1,'r') plt.title(u'Passe-haut peu sélectif') plt.show() sortie_haut2 = abs(haut2(1))*np.cos(2*np.pi*t+np.angle(haut2(1))) \ + abs(haut2(a))*np.cos(2*np.pi*a*t+np.angle(haut2(a))) \ + abs(haut2(a*a))*np.cos(2*np.pi*a*a*t+np.angle(haut2(a*a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,sortie_haut2,'r') plt.title(u'Passe-haut sélectif') plt.show() sortie_bande1 = abs(bande1(1))*np.cos(2*np.pi*t+np.angle(bande1(1))) \ + abs(bande1(a))*np.cos(2*np.pi*a*t+np.angle(bande1(a))) \ + abs(bande1(a*a))*np.cos(2*np.pi*a*a*t+np.angle(bande1(a*a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,sortie_bande1,'r') plt.title(u'Passe-bande peu sélectif') plt.show() sortie_bande2 = abs(bande2(1))*np.cos(2*np.pi*t+np.angle(bande2(1))) \ + abs(bande2(a))*np.cos(2*np.pi*a*t+np.angle(bande2(a))) \ + abs(bande2(a*a))*np.cos(2*np.pi*a*a*t+np.angle(bande2(a*a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,sortie_bande2,'r') plt.title(u'Passe-bande sélectif') plt.show() ################################## ### tracé effet fréquentiel ################################## plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.axis([0,a*a*1.1,0,1.1]) # On crée la bande de fréquence utilisée f=np.linspace(0,a*a*1.1,200) # on va jusqu'à 110 % de la fréquence max et on prend 200 points # Ceci est le spectre d'entrée for k in (1.0,a,a*a): plt.plot([k,k],[0,1],'r',linewidth=1) plt.title(u"Spectre du signal d'entrée") plt.show() # On superpose le gain du filtre plt.axis([0,a*a*1.1,0,1.1]) plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(f,abs(bas1(f))) plt.plot(f,abs(bas2(f))) plt.title(u"Gain des filtres passe-bas") plt.show() plt.clf() # Ceci est le spectre d'entrée for k in (1.0,a,a*a): plt.plot([k,k],[0,1],'r',linewidth=1) # On superpose le gain du filtre plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.axis([0,a*a*1.1,0,1.1]) plt.plot(f,abs(haut1(f))) plt.plot(f,abs(haut2(f))) plt.title(u"Gain des filtres passe-haut") plt.show() plt.clf() # Ceci est le spectre d'entrée for k in (1.0,a,a*a): plt.plot([k,k],[0,1],'r',linewidth=1) # On superpose le gain du filtre plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.axis([0,a*a*1.1,0,1.1]) plt.plot(f,abs(bande1(f))) plt.plot(f,abs(bande2(f))) plt.title(u"Gain des filtres passe-bande") plt.show() ################################## ### visualisation temporelle ################################## entree_temp_1 = np.cos(2*np.pi*t) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,entree_temp_1,'r') plt.show() sortie_temp_1 = abs(bande1(1))*np.cos(2*np.pi*t+np.angle(bande1(1))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.ylim((-1.0,1.0)) plt.plot(t,sortie_temp_1,'r') plt.show() entree_temp_2 = np.cos(2*np.pi*a*t) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,entree_temp_2,'r') plt.show() sortie_temp_2 = abs(bande1(a))*np.cos(2*np.pi*a*t+np.angle(bande1(a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.ylim((-1.0,1.0)) plt.plot(t,sortie_temp_2,'r') plt.show() entree_temp_3 = np.cos(2*np.pi*a*a*t) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.plot(t,entree_temp_3,'r') plt.show() sortie_temp_3 = abs(bande1(a*a))*np.cos(2*np.pi*a*a*t+np.angle(bande1(a*a))) plt.clf() plt.subplots_adjust(left=0.05,top=0.95,bottom=0.05,right=0.95) plt.ylim((-1.0,1.0)) plt.plot(t,sortie_temp_3,'r') plt.show()