%% Simulation / Modélisation de systèmes linéaires
%   Module : Ingénierie Electronique 
%       pour le Traitement de l'Information
%--------------------------------------------------------------
%   Modélisation d'un filtre du premier ordre
%           et du deuxième ordre
%   Affichage des réponses en fréquence
%--------------------------------------------------------------
%   Auteur : Julien VILLEMEJANE
%   Date : 11/12/2020
%--------------------------------------------------------------
clear all;
close all;
%% Premier ordre
%   Fonction de transfert d'un filtre passe-bas du premier ordre 
%       --> H(jw) = 1 / (1 + jw/wc) 
R = 1e4;
C = 100e-9;
wc = 1/(R*C);

w = logspace(0,6,1001);    % vecteur des pulsations entre 10^0 et 10^6
tf_num = 1;
tf_den = 1 + 1*j * w/wc;

% Fonction de transfert
H = tf_num ./ tf_den;

% Diagramme de Bode
figure(1);
title('Filtre du premier ordre')
subplot(2,1,1);
semilogx(w, 20*log10(abs(H)));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Gain (dB)');
legend('Système étudié');
subplot(2,1,2);
semilogx(w, angle(H));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Phase (rd)');

%% Autre méthode - choix automatique des pulsations
tf_num = [1];
tf_den = [1/wc 1];
H = tf(tf_num, tf_den);

[mag, phase, w_out] = bode(H);
mag = squeeze(mag);
phase = squeeze(phase);
figure(2);
title('Filtre du premier ordre')
subplot(2,1,1);
semilogx(w_out, 20*log(mag));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Gain (dB)');
legend('Système étudié');
subplot(2,1,2);
semilogx(w_out, 2*pi*phase/360.0);
grid on;
xlabel('pulsation (rd/s)');
ylabel('Phase (rd)');

%% Autre méthode - choix imposé des pulsations
tf_num = [1];
tf_den = [1/wc 1];
H = tf(tf_num, tf_den);

[mag, phase, w_out] = bode(H, w);
mag = squeeze(mag);
phase = squeeze(phase);
figure(3);
title('Filtre du premier ordre')
subplot(2,1,1);
semilogx(w, 20*log(mag));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Gain (dB)');
legend('Système étudié');
subplot(2,1,2);
semilogx(w_out, 2*pi*phase/360.0);
grid on;
xlabel('pulsation (rd/s)');
ylabel('Phase (rd)');

%% Deuxième ordre / Passe-bas
%   Fonction de transfert d'un filtre passe-bas du second ordre 
%       --> H(jw) = A / (1 + jw/wc/Q + (jw/wc)^2) 
A = 1;
fc = 1000;      % fréquence de coupure
wc = 2*pi*fc;   
Q = 10;         % facteur qualité

f = logspace(0,6,1001);    % vecteur des fréquences entre 10^0 et 10^6
tf_num = A;
tf_den = 1 + 1*j * 2*pi*f/wc * 1/Q + (1*j*2*pi*f/wc).^2;

% Fonction de transfert
H = tf_num ./ tf_den;

% Diagramme de Bode
figure(4);
title('Passe-bas du second ordre')
subplot(2,1,1);
semilogx(f, 20*log(abs(H)));
grid on;
xlabel('fréquence (Hz)');
ylabel('Gain (dB)');
legend('Système étudié');
subplot(2,1,2);
semilogx(f, angle(H));
grid on;
xlabel('fréquence (Hz)');
ylabel('Phase (rd)');

%% Deuxième ordre / Passe-bande
%   Fonction de transfert d'un filtre passe-bas du second ordre 
%       --> H(jw) = A . jw/wc/Q / (1 + jw/wc/Q + (jw/wc)^2) 
A = 1;
fc = 1000;      % fréquence de coupure
wc = 2*pi*fc;   
Q = 10;         % facteur qualité

f = logspace(0,6,1001);    % vecteur des pulsations entre 10^0 et 10^6
tf_num = A * 1*j * 2*pi*f/wc * 1/Q;
tf_den = 1 + 1*j * 2*pi*f/wc * 1/Q + (1*j*2*pi*f/wc).^2;

% Fonction de transfert
H = tf_num ./ tf_den;

% Diagramme de Bode
figure(5);
subplot(2,1,1);
semilogx(f, 20*log(abs(H)));
grid on;
xlabel('fréquence (Hz)');
ylabel('Gain (dB)');
legend('Système étudié');
subplot(2,1,2);
semilogx(f, angle(H));
grid on;
xlabel('fréquence (Hz)');
ylabel('Phase (rd)');

%% Deuxième ordre / Passe-haut
%   Fonction de transfert d'un filtre passe-haut du second ordre 
%       --> H(jw) = A . (jw/wc)^2 / (1 + jw/wc/Q + (jw/wc)^2) 
A = 1;
fc = 1000;      % fréquence de coupure
wc = 2*pi*fc;   
Q = 10;         % facteur qualité

f = logspace(0,6,1001);    % vecteur des pulsations entre 10^0 et 10^6
tf_num = A * (1*j*2*pi*f/wc).^2;
tf_den = 1 + 1*j * 2*pi*f/wc * 1/Q + (1*j*2*pi*f/wc).^2;

% Fonction de transfert
H = tf_num ./ tf_den;

% Diagramme de Bode
figure(6);
subplot(2,1,1);
semilogx(f, 20*log(abs(H)));
grid on;
xlabel('fréquence (Hz)');
ylabel('Gain (dB)');
legend('Système étudié');
subplot(2,1,2);
semilogx(f, angle(H));
grid on;
xlabel('fréquence (Hz)');
ylabel('Phase (rd)');