function esim12
% ESIM12 demoaa digitaalista signaalia.
%
% Käytetään signaalina puhetta. Esitellään jatkuva signaali
% x(t), huomataan, että se on tietokoneessa pelkkiä numeroita,
% joita voidaan käsitellä yksinkertaisin tavoin. Tehdään 
% muutama tällainen operaatio.
%
% Lataa tiedostot esim12.m (tämä) ja esim12.wav.
% Aja demo komennolla "esim12".
%
% Siirrä kuvaikkuna niin, että näet sen samaan aikaan
% Matlabin työikkunan kanssa.

% Jukka Parviainen, parvi@hut.fi, 24.1.2004, 15.1.2002, 17.1.2001.
% Tiedostot saatavilla 
% http://www.cis.hut.fi/Opinnot/T-61.246/Demo/

% 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,'************    ESIM12.m  **************\n');
fprintf(1,'****************************************\n');
fprintf(1,'** Ajaako Hill maailmanmestaruudesta? **\n');
fprintf(1,'************    osa I     **************\n');
fprintf(1,'****************************************\n');
fprintf(1,'\n\n');

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

% Luetaan äänisignaali sisään Matlabiin
[y, fs, nbits] = wavread('esim12.wav'); 
% y:ssä on näytejono
% fs on näytteenottotaajuus
% nbits kertoo kuinka monta bittiä käytetään 
%   yhden numeron esittämiseen WAV-tiedostossa

resample_downto_8kHz = 0;   % Jos kone ei toimi muulla kuin 8192 Hz:llä
if resample_downto_8kHz
  y = resample(y, 8192, fs);
  fs = 8192;
end;

win = linspace(1,0,length(y));
y2 = y.*win'; % vaimentaminen, fade out

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


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

clc;

fprintf(1,'Tutkitaan äänisignaalia x(t), joka\n');
fprintf(1,'muuttuu ajan t mukana.\n');
fprintf(1,'Signaalin arvot voidaan piirtää.\n\n');

fprintf(1,'Kuvasta nähdään, että näyte on noin %d sekuntia pitkä.\n\n', round(length(y)/fs));

%t = linspace(0, length(y)/fs, length(y));
% aika-akseli t:
t = [0 : length(y)-1] / fs;

ku1 = plot(t, y);      % voidaan piirtää
title('Signaali x(t)');
% siis oikeasti digitaalinen x[n]
xlabel('aika (sekunnit)');
ylabel('voimakkuus');
grid on;
axis([0 t(end) 1.1*min(y) 1.1*max(y)]);

fprintf(1,'Voit zoomata ruudulla valitsemalla yläpalkista\n');
fprintf(1,'suurennuslasin ja vetää hiiren nappi pohjassa kapean ikkunan.\n');
fprintf(1,'Oikealla hiiren näppäimellä pääset takaisinpäin.\n\n');

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

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

%aa = 273500;
%ab = 274900;
aa = round(0.6*length(y));
ab = aa+2399;

axis([t(aa) t(ab) 1.2*min(y(aa:ab)) 1.2*max(y(aa:ab))]);
% set(ku1,'Linewidth',2);

fprintf(1,'Nyt zoomattuna on 2400 näytettä,\n');
fprintf(1,'mikä vastaa %3.2f sekunnin ajanjaksoa.\n\n', 2400/fs);

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

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

clc;

fprintf(1,'Tietokoneessa esitettävä signaali on digitaalista.\n\n');

ba = 20501;
bb = 20550;
stem(t(ba:bb),y(ba:bb));  % digitaalinen
title('Sekvenssi x[n]');
xlabel('aika (sekunnit)');
ylabel('voimakkuus');
grid on;
axis([t(ba) t(bb) 1.2*min(y(ba:bb)) 1.2*max(y(ba:bb))]);
tt0 = text(t(ba), y(ba), ['x[' num2str(ba) ']']);
tt4 = text(t(ba+5), 1.05*min(y(ba:bb)), ['x[' num2str(ba) '] = ' num2str(y(ba))]);
tt1 = text(t(ba+10), y(ba+10), ['x[' num2str(ba+10) ']']);
tt2 = text(t(ba+20), y(ba+20), ['x[' num2str(ba+20) ']']);
tt3 = text(t(ba+30), y(ba+30), ['x[' num2str(ba+30) ']']);
tt5 = text(t(ba+35), 1.05*min(y(ba:bb)), ['x[' num2str(ba+30) '] = ' num2str(y(ba+30))]);

fprintf(1,'Diskreettiä sekvenssiä eli lukujonoa kuvataan\n');
fprintf(1,'merkinnällä x[n], jossa n on indeksinumero.\n');
fprintf(1,'Piirroksissa käytetään usein "nuppineulaa".\n\n');

fprintf(1,'Kuvaan on piirretty %d näytettä signaalin keskeltä.\n',bb-ba+1);
fprintf(1,'Sekvenssi koostuu arvoista\n');
fprintf(1,'{x[%d], x[%d], x[%d], ..., x[%d]}\n\n', ba,ba+1,ba+2,bb);

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

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

clc;

fprintf(1,'Usein tällainen digitaalinen sekvenssi\n');
fprintf(1,'{x[%d], x[%d], x[%d], ..., x[%d]}\n', ba,ba+1,ba+2,bb);
fprintf(1,'esitetään kuitenkin "jatkuvana signaalina"\n');
fprintf(1,'yhdistämällä kukin "nuppineula" suoralla viivalla\n');
fprintf(1,'ja tämän jälkeen jättämällä näkyviin vain jatkuva viiva.\n\n');

fprintf(1,'Tämä tehdään vain helpottamaan katsojaa visuaalisesti.\n\n');

hold on;
pp1 = plot(t(ba:bb),y(ba:bb),'k');  % analoginen
hold off;

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


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

clc;

delete(pp1);

fprintf(1,'Digitaaliseen sekvenssiin voi siis liittyä\n');
fprintf(1,'fysikaalinen suure, näytteenottotaajuus,\n');
fprintf(1,'joka kertoo kuinka monta näytettä esiintyy\n');
fprintf(1,'yhden sekunnin aikana. Näytteenottotaajuuden fs\n');
fprintf(1,'yksikkö on Hertz (Hz = 1/s). Tässä fs = %d Hz.\n\n', fs);

fprintf(1,'Toisaalta näytteenottotaajuuden käänteisluku on\n');
fprintf(1,'näyteväli Ts. Näytteiden välinen etäisyys on \n');
fprintf(1,'1/fs = 1/%d = %8.7f sekuntia.\n\n', fs, 1/fs);

%fprintf(1,'Tässä esimerkissä siis %d näytettä mahtuu\n', bb-ba);
%fprintf(1,'%d/%d=%4.3f sekuntiin.\n\n', bb-ba, fs, (bb-ba)/fs);

fprintf(1,'Indeksi %d vastaa näytteenottotaajuudella %d Hz\n', ba, fs);
fprintf(1,'ajan hetkeä %7.5f alla olevan laskukaavan mukaisesti\n\n', ba/fs);
fprintf(1,'      %-5d      x sekuntia\n', ba);
fprintf(1,'      -----  = -------------\n');
fprintf(1,'      %-5d      1 sekuntia\n\n',fs);

fprintf(1,'Signaaliarvot ovat tietokoneessa siis pelkkiä lukuarvoja!\n\n');

fprintf(1,'** Paina ENTER nähdäksesi kyseiset numerot...\n\n');
pause;

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

y(10501:20600)  %printtaa pelkkiä numeroita

fprintf(1,'\n\n - siis vain pelkkiä numeroita, mutta kuunnellaan ne!\n\n');

fprintf(1,'Tässä vaiheessa kaiuttimet tai kuulokkeet ovat olennaiset.\n\n');

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

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

clc;

%plot(t(1:10:end),flipud(y(1:10:end))); %näytetetään vain osa nopeuttamiseksi
%title('x(t) - Matti ja Keke ');
%xlabel('aika (sekunnit)'); 
%ylabel('voimakkuus');
%grid on;
%axis([0 t(end) 1.1*min(y) 1.1*max(y)]);

soundsc(y, fs);  %..mutta kuuntele! 
%y(10501:20600)   % eli vain numeroita, mutta kun kaiuttimesta 

fprintf(1,'Koska sekvenssi koostuu pelkistä numeroista\n');
fprintf(1,'voidaan niitä soittaa eri nopeuksilla\n\n');

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


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

clc;

fprintf(1,'Soitetaan näytteitä eri nopeudella, toisin sanoen,\n');
fprintf(1,'muutetaan näytteenottotaajuutta/näyteväliä tahallisesti\n');
fprintf(1,'Sen sijaan, että soitetaan %d näytettä sekunnissa,\n', fs);
fprintf(1,'soitetaankin K * %d näytettä.\n\n', fs);

fprintf(1,'Anna kerroin K (väliltä 0.5 .. 2), esimerkiksi 1.3\n');
kerroin = input('Anna nopeutus/hidastuskerroin K: ');
fprintf(1,'\n\n');

if ((kerroin < 0.49) | (kerroin > 2.01))
    warning('Käytetään kerrointa 1.3');
    kerroin = 1.3;
end;
soundsc(y, kerroin*fs);

fprintf(1,'Numerojonoa voi käsitellä monin eri tavoin...\n\n');

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

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

clc;

fprintf(1,'...vaimennetaan (fade-out) ääntä ajan myötä.\n\n');

% win = linspace(1,0,length(y));
% y2 = y.*win'; % vaimentaminen, fade out
plot(t,y2);
title('"Fade-out", vaimennettu signaali x_f(t)');
xlabel('aika (sekunnit)'); 
ylabel('voimakkuus');
grid on;
axis([0 t(end) 1.1*min(y2) 1.1*max(y2)]);

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

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

clc;

soundsc(y2,fs); 

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

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

clc;

fprintf(1,'Koska sekvenssi on vain lukuja x[n], \n');
fprintf(1,'voidaan järjestys vaihtaa vastakkaiseksi x[N-n].\n\n');

soundsc(flipud(y),fs);  % käännetään pystyvektori toisinpäin
                        % jos vaakavektori, niin "fliplr"

%plot(t(1:10:end),flipud(y(1:10:end))); 
%käännetään, ja näytetetään vain osa nopeuttamiseksi
%title('Käännetty  signaali x_i(t) = x(-t)');
%xlabel('aika (sekunnit)'); 
%ylabel('voimakkuus');
%grid on;
%axis([0 t(end) 1.1*min(y2) 1.1*max(y2)]);

fprintf(1,'** LOPPU ** \n\n\n');

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