function esim1 % ESIM1 Demo LTI-suodatuksesta % % Esitellään sirinäinen signaali ja suodatetaan sitä niin, % että jäljelle jää lankapuhelimen kaista alle 3300 Hz. % Jukka Parviainen, parvi@hut.fi, 12.9.2002 % Tiedostot saatavilla % http://www.cis.hut.fi/Opinnot/T-61.246/Demo/esim1.shtml % % Alkutoimenpiteet: tarkista että esityskoneessasi on % kaiuittimet tai salin kyseessä ollen audioliitäntä. % Lataa tiedostot työhakemistoon tai aseta Matlabissa % addpath-komennolla polku tunnetuksi. % Kutista Matlab-työikkuna suhteellisen pieneksi ruudun alareunaan, % sijoita piirtoikkuna, esimerkiksi ensimmäisen vaiheen jälkeen, % sopivaan paikkaan, että se näkyy. % % Tiedostot: esim1.m, esim1_input.wav % % HUOM! Demoluonteen takia suurin osa _oikeasta_ laskennasta % tehdään aivan koodin alussa. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% close all; % sulkee kaikki ikkunat clc; % puhdistaa ruudun fprintf(1,'****************************************\n'); fprintf(1,'****************************************\n'); fprintf(1,'************** esim1.m ***************\n'); fprintf(1,'****************************************\n'); fprintf(1,'**** Suomen Virallinen Suodatusdemo ***\n'); fprintf(1,'****************************************\n'); fprintf(1,'\n\n'); fprintf(1,'** Odota hetki...\n\n'); % Luetaan äänisignaali sisään Matlabiin [y, fs, nbits] = wavread('esim1.wav'); Wp = 2*3000/fs; % Päästökaistan loppu Ws = 2*3300/fs; % Estokaistan alku Rp = 0.2; Rs = 40; [N,Wn] = ellipord(Wp, Ws, Rp, Rs); [b,a] = ellip(N, Rp, Rs, Wn); [hh,ww]=freqz(b,a,1024,fs); % suotimen amplitudi- ja vaihevaste Y = fft(y,2^14); % Lasketaan spektriä 2^14 ensimm. pisteestä, % jotta ei vie liikaa aikaa... ysuod = filter(b,a,y); % Tehdään suodatus valmiiksi Ysuod = fft(ysuod,2^14); % Lasketaan vastaavasti spektriä vasteesta fprintf(1,'** Paina ENTER...\n\n'); pause; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clc; fprintf(1,'Kuunnellaan ESIM1:n sirinäistä ää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; w = linspace(0, fs, length(Y)); subplot(311); 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 korkeataajuista sirinää.\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 h = waitbar(0,'Lasketaan suotimen kertoimia...'); for i=1:20, pause(0.02); waitbar(i/20,h) end close(h) 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'); fprintf(1,'\n Konvoluutioteoreema: aikatason konvoluutio on taajuustason tulo\n'); 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'); % Seuraava pelkkää pluffia h = waitbar(0,'Suodatetaan...'); for i=1:40, pause(0.03); waitbar(i/40,h) end close(h) 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'); figure(2), clf; alku = 44800; loppu = 45000; plot(t(alku:loppu), y(alku:loppu)); hold on; ku3 = plot(t(alku:loppu), ysuod(alku:loppu), '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(alku) t(loppu) 1.1*min(y(alku:loppu)) 1.1*max(y(alku:loppu))]); fprintf(1,'** LOPPU. Paina ENTER.\n\n'); pause; % Tällä voi vielä kirjoittaa signaalin ulos tiedostoon: %wavwrite(ysuod, fs, nbits, 'esim1_output.wav'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%