function skjdemo2
% SKJDEMO2 demoaa signaalin suodattamista.
%
% Käytetään signaalina samaa kohinaista puhetta. 
% Esitellään suhinainen signaali ja suodatetaan sitä niin,
% että jäljelle jää lankapuhelimen kaista 300 .. 3400 Hz.

% Jukka Parviainen, parvi@hut.fi, 21.1.2002, 15.1.2002, 17.1.2001
% Tiedostot saatavilla 
% http://www.cis.hut.fi/Opinnot/T-61.140/  -> Vinkkejä ja linkkejä

% Alkutoimenpiteet: tarkista että esityskoneessasi on 
% kaiuittimet tai salin kyseessä ollen audioliitäntä.
% Kutista Matlab-työikkuna suhteellisen pieneksi ruudun alareunaan,
% sijoita piirtoikkuna, esimerkiksi ensimmäisen vaiheen jälkeen,
% sopivaan paikkaan, että se näkyy.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

close all;      % sulkee kaikki ikkunat
clc;            % puhdistaa ruudun

fprintf(1,'****************************************\n');
fprintf(1,'****************************************\n');
fprintf(1,'************  SKJDEMO2.m  **************\n');
fprintf(1,'****************************************\n');
fprintf(1,'** Ajaako Hill maailmanmestaruudesta? **\n');
fprintf(1,'************    osa II    **************\n');
fprintf(1,'****************************************\n');
fprintf(1,'\n\n');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Seuraavat toimenpiteet tehdä demon vuoksi näin alussa, 
% vaikka ne oikeasti tehtäisiin vasta myöhemmin kun niitä 
% tarvitaan.

fprintf(1,'** Odota hetki...\n\n');

% Luetaan äänisignaali sisään Matlabiin
[y, fs, nbits] = wavread('skjdemo1.wav'); 

% Lasketaan signaalin spektri
Y = fft(y,2^14); % Lyhyt pätkä, jotta ei vie liikaa aikaa...

% Määritellään myöhemmin tarvittavan suotimen speksit
fpass = 2800;              % Päästökaistan loppu hertzeissä
fstop = 3300;              % Estokaistan alku hertzeissä
Wp = 2*fpass/fs;           % Matlabin skaalaus välille 0..1
Ws = 2*fstop/fs;
Rp = 0.2;
Rs = 40;

% Arvioidaan suotimen asteluku
[N,Wn] = ellipord(Wp, Ws, Rp, Rs);

% Toteutetaan suodin ja lasketaan sen taajuusvaste
[b,a] = ellip(N, Rp, Rs, Wn);
[hh,ww]=freqz(b,a,1024,fs);   % suotimen amplitudi- ja vaihevaste

% Suodatetaan 
ysuod = filter(b,a,y);  

% Suodatetun signaalin spektri
Ysuod = fft(ysuod,2^14);

fprintf(1,'** Paina ENTER...\n\n');
pause;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc;

fprintf(1,'Kuunnellaan DEMO1:n suhinaista ääntä.\n\n');

t = linspace(0, length(y)/fs, length(y));

soundsc(y, fs);  %Kuunnellaan

fprintf(1,'** Paina ENTER äänen kuuntelun jälkeen...\n\n');
pause;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc;

% Laskettu jo aiemmin!
% Y = fft(y,2^14); % Lyhyt pätkä, jotta ei vie liikaa aikaa...

% Piirretään alkuperäisen suhinaisen signaalin spektri ylimpään 
% ikkunaan
subplot(311);
w = linspace(0, fs, length(Y));
plot(w, abs(Y));
axis([0 fs/2 0 1.1*max(abs(Y))]);
grid on;
title(['Signaalin spektri 0..' num2str(fs/2) ' hertziä']);
xlabel('taajuus (Hz)');

fprintf(1,'Spektrissä on esitetty signaali taajuuskomponenttien avulla.\n\n');

fprintf(1,'** Paina ENTER...\n\n');
pause;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc;

fprintf(1,'Äänessä on paljon suhinaa.\n\n');

fprintf(1,'Tehdään alipäästösuodin, joka päästää läpi\n vain lankapuhelintaajuudet.\n\n');
fprintf(1,'Aikatason nopeat muutokset signaalissa\n vastaavat korkeita taajuuksia.\n');
fprintf(1,'Aikatason hitaat muutokset ovat matalia taajuuksia.\n\n');

fprintf(1,'** Paina ENTER...\n\n');
pause;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% Seuraava pelkkää pluffia demoa varten
h = waitbar(0,'Lasketaan suotimen kertoimia...');
for i=1:20,
  pause(0.02);
  waitbar(i/20,h)
end
close(h)

% Piirretään suotimen amplitudivaste keskimmäiseen ikkunaan
subplot(312);
ku = plot(ww,abs(hh).^2);
axis([0 ww(end) 0 1.05]);
set(ku,'LineWidth',2);
grid on;
title('Elliptinen alipäästösuodin H(z)');
subplot(311); xlabel('');
subplot(312); xlabel('taajuus (Hz)');

fprintf(1,'Toteutettiin elliptinen alipäästösuodin (kesk.).\n');
fprintf(1,'Tämä suodin käsittelee signaalia niin, \n');
fprintf(1,'että matalat taajuudet jäävät jäljelle\n\n');

fprintf(1,'** Paina ENTER...\n\n');
pause;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc;

fprintf(1,'Suodatetaan suhinainen signaali...\n\n');

% Aikatason konvoluutio!
%fprintf(1,'\n');
%fprintf(1,'                 --------------\n');
%fprintf(1,'                 |            |\n');
%fprintf(1,'      x[n] ----> |    h[n]    | ---->  y[n] = h[n] * x[n]\n');
%fprintf(1,'                 |            |\n');
%fprintf(1,'                 --------------\n');
%fprintf(1,'\n');
% Taajuustason kertolasku!
fprintf(1,'\n');
fprintf(1,'                 --------------\n');
fprintf(1,'                 |            |\n');
fprintf(1,'  X(e^jw)  ----> |  H(e^jw)   | ---->  Y(e^jw) = H(e^jw) . X(e^jw)\n');
fprintf(1,'                 |            |\n');
fprintf(1,'                 --------------\n');
fprintf(1,'\n');
fprintf(1,'\n');

% Suodatus on tehty jo yllä.
% ysuod = filter(b,a,y);  

% Seuraava pelkkää pluffia demoa varten
h = waitbar(0,'Suodatetaan...');
for i=1:40,
  pause(0.03);
  waitbar(i/40,h)
end
close(h)

% Suotimen spekri laskettu jo yllä.
% Ysuod = fft(ysuod,2^14);

% Piirretään suodatetun signaalin spektri alimpaan kuvaan
w = linspace(0, fs, length(Ysuod));
subplot(313);
plot(w, abs(Ysuod));
grid on;
axis([0 fs/2 0 1.1*max(abs(Y))]);
title('Suodatetun signaalin spektri');
subplot(312), xlabel('');
subplot(313), xlabel('taajuus (Hz)');

fprintf(1,'Kuunnellaan seuraavaksi suodatettu ääni.\n\n');

fprintf(1,'** Paina ENTER...\n\n');
pause;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc;

soundsc(ysuod,fs);

fprintf(1,'Kuulostaako suodatettu signaali "paremmalta"?\n\n');

fprintf(1,'** Paina ENTER äänen kuuntelun jälkeen...\n\n');
pause;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Mitä on tapahtunut aikatasossa?!

clc

fprintf(1,'Piirretään vielä alkuperäinen ja suodatettu\n');
fprintf(1,'signaali aikatasoon\n\n');

clf;
plot(t(15000:15300), y(15000:15300));  
hold on;
ku3 = plot(t(15000:15300), ysuod(15000:15300), 'r');
set(ku3,'LineWidth',2);
title('Alkuperäinen ja suodatettu signaali x(t)');
xlabel('aika (sekunnit)');
ylabel('voimakkuus');
legend({'Alkuperäinen','Suodatettu'});
grid on;
axis([t(15000) t(15300) 1.1*min(y(15000:15300)) 1.1*max(y(15000:15300))]);


fprintf(1,'** LOPPU. Paina ENTER.\n\n');
pause;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

