%TEKNILLINEN KORKEAKOULU
%Tietoliikennelaboratorio
%Seppo Saastamoinen 8.11.2007

%S-72.1110 SIGNAALIT JA JÄRJESTELMÄT S-07
%Laboratoriotyö 2: Suodattimien tutkiminen
%Makro: filter2007.m

%Nollataan muuttujat ja kuvat eli
clear all; close all;

Teekkari1 = 'Nimi Opiskelijanumero';
Teekkari2 = 'Nimi Opiskelijanumero';

%Tämän makron avulla suunnitellaan suodattimia työohjeen mukaan.

%Lähtökohtien määrittely:

Wp = [1000 3000]; %Päästökaistan rajataajuus tai -taajuudet.
Ws = [100 3900]; %Estokaistan rajataajuus tai -taajuudet.

[n,Wn] = buttord(Wp,Ws,3,20,'s'); %Suodattimen asteluku ja päästökaistan
%normalisoitu tai normalisoidut rajataajuudet.

%Lasketaan siirtofunktion H(s) osoittaja b(s) ja nimittäjä a(s)
%Laplace-muunnoksella, jossa s = jw.

[b,a] = butter(n,Wn,'s'); %Suodattimen siirtofunktio H(s)=b(s)/a(s).

f = (0:1:20000); %Taajuusvektorin f asetus.

%Lasketaan suodattimen taajuusvaste ja vaihekäyrä:
Hf = freqs(b,a,f);

%Lasketaan taajuusvasteen desibeliesitys (amplitudifunktio).
Af = 20*log10(abs(Hf)); %Af on suodattimen vahvistus.

%Muutetaan radiaanit asteiksi ja lasketaan vaihefunktio asteikolla
%-180...180 astetta.
Pf = (180/pi)*angle(Hf);

%Lasketaan vaihekertymä (vaihefunktio 2).
P1 = unwrap(angle(Hf));

%Lasketaan taajuuden derivaatta.
df = diff(f);

%Lasketaan vaihekertymän derivaatta.
dP = diff(P1);

%Lasketaan ryhmäkulkuaika (group delay).
G = (-1/(2*pi))*dP./df; %Vektorit jaetaan alkioittain. Siksi dP.

%Korjataan vektorin G pituus oikeaksi.
Gd = [0 G];

%Haetaan päiväys ja kellonaika tulostusta varten eli
h = fix(clock);

%Asetellaan tulostus.
subplot(3,1,1); %3 käyräesitystä pysty- ja 1 vaakasuunnassa.

plot(f,Af); %Piirretään taajuusvaste alla olevien ehtojen mukaan.
%Y-akseli on lineaarinen, X-akseli on logaritminen.
%Tarvittaessa saa X- eli taajuusakselin muuttaa lineaariseksi. Käytä silloin
%komentoa plot semilox:n sijaan.

%Kuvan otsikko voi olla monirivinen, kuten alla:

title({['Kurssi: S-72.1110 S-2007 Laboratoriotyö 2, osa A'];...
      ['n-asteinen Butterworth-kaistanpäästösuodatin 1000-3000 Hz'];...    
      ['Tekijät: ' Teekkari1 ' ja ' Teekkari2];...
      [int2str(h(3)) '.' int2str(h(2)) '.' int2str(h(1)) ' klo '...
          int2str(h(4)) ':' int2str(h(5)) ':' int2str(h(6))]});

grid on; %Asteikkoruudukko päälle.
axis([100 20000 -120 3]); %Akseliarvojen asetus x- ja y-suunnissa.
xlabel('Taajuus/Hz'); %x-akselin nimi.
ylabel('Vahvistus/dB'); %y-akselin nimi.
zoom on; %Sallii zoomauksen hiirellä. Kaksoisnäpäytys palauttaa
%alkuperäisen kuvan.

subplot(3,1,2); %Keskimmäinen käyräesitys.
plot(f,Pf); %Piirretään vaihekäyrä.
grid on;
axis([100 20000 -200 200]);
xlabel('Taajuus/Hz');
ylabel('Vaihevääristymä/astetta');
zoom on;

subplot(3,1,3); %Alin käyräesitys.
plot(f,Gd); %Piirretään ryhmäkulkuajan käyrä.
grid on;
axis([100 20000 -0.0001 0.005]);
xlabel('Taajuus/Hz');
ylabel('Ryhmäkulkuaika/s');
zoom on;

shg; %Tuo figure-esityksen päällimmäiseksi kuvaruudussa.
