Matlab-tietokoneharjoitus

Koko: px
Aloita esitys sivulta:

Download "Matlab-tietokoneharjoitus"

Transkriptio

1 Matlab-tietokoneharjoitus Tämän harjoituksen tavoitteena on: Opettaa yksinkertaisia piirikaavio- ja yksikkömuunnoslaskuja. Opettaa Matlabin perustyökaluja mittausten analysoimiseen. Havainnollistaa näytteenottotaajuuden, vahvistuksen ja resoluution merkitys. Selvittää loisteputken aiheuttama valaistusteho työpöydälle ja loisteputken säteilemän valon taajuus. Harjoituksessa on kursiivilla merkattuja kysymyksiä, joiden vastaukset tulee täyttää erilliseen vastauslomakkeeseen. 1. Tiedoston lukeminen. Avaa Matlab ja siellä uusi scripti. Matlabissa ohjelmointi kannattaa kirjoittaa scriptiin, jota on sitten helppo ajaa myöhemmin. Fotoresistorista on kerätty 10 sekunnin pituisia näytettä 40Hz:n ja 200Hz:n taajuuksilla ja lisäksi itse Labview:lla ottamasi näyte 2000Hz:n näytteenottotaajuudella. Käydään läpi kaksi eri tapaa tuoda dataa Matlabiin. Valitse ensin Import Data Matlabin työkaluriviltä, ja etsi Labview:ssa tallentamasi csv-tiedosto. Vaihda sarake-erottimeksi puolipiste ja desimaalierottimeksi piste kuvan 1 mukaisesti. Kuva 1. Datan tuominen Import Data -työkalulla. Työtilaasi pitäisi ilmestyä kaksi 20000x1 kokoista muuttujaa. Tallenna ne muuttujaan v2000 seuraavasti: v2000 = [VarName1,VarName2]; Seuraavaksi siirretään ohjelmallisesti kaksi muuta CSV-tiedostoa. Siirrä MyCoursesista ladatun kansion CSVtiedostot ja Matlab-funktiot nykyiseen Matlab-kansioosi. Näissä tiedostoissa on käytetty desimaalierottimena pilkkua, mutta Matlab käyttää desimaalierottimena pistettä. Lisäksi samalla rivillä olevat arvot on erotettu toisistaan puolipisteillä, kun Matlab haluaisi niiden olevan erotettuja pilkulla. Seuraavalla koodin avulla voit lukea väärässä muodossa olevan CSV-tiedoston suoraan muuttujiin. Lisää se scriptiisi. %% Luku CSV-tiedostoista %Muutetaan desimaalierottimen pilkut pisteiksi comma2point_overwrite('valo200.csv'); comma2point_overwrite('valo40.csv');

2 %Aloitetaan luku toiselta riviltä v200 = csvread('valo200.csv',1,0); v40 = csvread('valo40.csv',1,0); %Palautetaan tiedostot alkuperäiseen muotoon ongelmien välttämiseksi. point2comma_overwrite('valo200.csv'); point2comma_overwrite('valo40.csv'); %%- merkintä lisää uuden jakson. Tästä on se ilo, että komennolla ctrl+enter voit ajaa vain sen jakson scriptistäsi, jossa kursori sijaitsee. 2. Näytteenottotaajuuden vaikutus Tarkastellaan näytteitä aikatasossa. Äskettäin luotujen muuttujien ensimmäiset sarakkeet sisältävät mittaushetken ja toiset sarakkeet mittausarvon. Kopio seuraava pätkä scriptiisi, ja aja se. %% Näytteenottotaajuuden vaikutus plot(v2000(:,1),v2000(:,2)); plot(v200(:,1),v200(:,2),'c'); plot(v40(:,1),v40(:,2),'r'); axis([ ]); legend('fs = 2000','Fs = 200','Fs = 40'); Havaitaan, että näytteissä on aaltomaisuutta. Näytteet on otettu samassa koetilanteessa. Kysymys 1. Miksi pienemmillä näytteillä signaali on saha-aaltoa, ja miksi 40Hz:n näytteenottotaajuudella signaalin amplitudi on huomattavasti pienempää kuin kahdella muulla? Pienemmillä näytteillä näytteenottotaajuus on liian pieni, ja 40 Hz:n näyte on laskostunut. Pienempien näytteiden näytepisteiden vähyys aiheuttaa saha-aallon. Suuremmalla näytteenottotaajuudella kohinan määrä lisääntyy, mikä näkyy amplitudin kasvamisena ja aaltomaisuutena. Tutkitaan näytteitä Fourier-muunnoksella. Fourier-muunnos on matemaattinen työkalu, jonka avulla aikatason signaali voidaan siirtää taajuustasoon. Tässä yhteydessä ei käydä läpi muunnoksen matemaattisia perusteita, vaan opetellaan hyödyntämään Fourier-muunnosta signaalin taajuuksien etsimisessä. Matlabissa Fast Fourier Transform -menetelmää käytetään komennolla fft. Avaa työkaluriviltä Matlabin Help-dokumentti. Etsi dokumentista fft-funktio, ja suorita näytteille Fourier-muunnos dokumentin esimerkin ja alla olevan alustavan scriptin avulla. Huom! Tasajännitekomponentin jättäminen pois muunnoksesta selkiyttää kuvaajaa, kuten kohta tulet huomaamaan. %% FFT-analyysi T = 10; %Näytteenottoaika figure; %luodaan uusi kuvaaja % v2000, tasajännitekomponentti mukana L = length(v2000); %Näytteen pituus Y2000 = fft(v2000(:,2),nfft)/l; f2000 = Fs/2*linspace(0,1,NFFT/2+1); plot(f2000,2*abs(y2000(1:nfft/2+1)),'y');

3 % v2000 Y2000 = fft(v2000(:,2)-mean(v2000(:,2)),nfft)/l; f2000 = Fs/2*linspace(0,1,NFFT/2+1); Yf2000 = 2*abs(Y2000(1:NFFT/2+1)); plot(f2000,2*abs(y2000(1:nfft/2+1)),'b'); % v200 L = length(v200); Y200 = fft(v200(:,2)-mean(v200(:,2)),nfft)/l; f200 = Fs/2*linspace(0,1,NFFT/2+1); plot(f200,2*abs(y200(1:nfft/2+1)),'c'); % v40 L = length(v40); Y40 = fft(v40(:,2)-mean(v40(:,2)),nfft)/l; f40 = Fs/2*linspace(0,1,NFFT/2+1); plot(f40,2*abs(y40(1:nfft/2+1)),'r'); xlabel('taajuus (Hz)'); legend('fs = 2000, sis. tasajännitteen','fs = 2000','Fs = 200','Fs = 40'); axis([ ]); Kuvaajassa näkyy piikkeinä mittausnäytteistä erottuvat taajuudet. Mitä voit sanoa kuvaajan perusteella Fourier-muunnoksen muunnosalueesta (kaistasta)? Myöhemmin tulet oppimaan tämän yhteyden Nyqvistin rajataajuuteen. Määritä signaalissa esiintyvä ensimmäinen harmoninen taajuus. Taajuuden voit löytää esimerkiksi seuraavasti: %Etsitään ensimmäinen piikki [pks,locs] = findpeaks(yf2000,'minpeakheight',0.05,... 'MINPEAKDISTANCE',100); % % Ensimmäinen piikki löytyy taajuudella piikki = f2000(locs(end)); % Amplitudi tällä taajuudella Vpiikki = pks(end); Kysymys 2. Millä taajuudella loisteputki säteilee? 3. Resoluution merkitys Tutkitaan seuraavaksi näytteenottoresoluution merkitystä. Esimerkkinä lasketaan aikatason signaalista jännitteen peak-to-peak -amplitudi. Valmiit näytteet ovat kerätty käyttäen 14-bittistä Analog-to-Digital - muunninta. Näytteiden kvantisointivirhe on tällöin. (3) Muunnetaan ohjelmallisesti yksi näyte siten, kuin että se olisi muunnettu 8-bittisellä ADC:lla. Tutki kvantisointitasojen määrän vaikutusta seuraavalla koodilla: figure;

4 dis = 5/(2^8-1); v2000d = round(v2000(:,2)/dis)*dis; plot(v2000(:,1), v2000(:,2),'bo'); plot(v2000(:,1), v2000(:,2),'b'); plot(v2000(:,1),v2000d,'g+'); axis([ ]); legend('14-bit mittapisteet','14-bit interpoloitu käyrä','8-bit mittapisteet'); Seuraavassa koodissa on laskettu keskiarvot näytteiden huipuista ja pohjista, ja saatu peak-to-peak -jännite näiden erotuksena. Oletetaan, että virhettä aiheutuu ainoastaan kvantisoinnista. Lasketaan lopuksi alkuperäisen näytteen huippuarvojen keskiarvon keskivirhe. %% Peak-to-peak jännite aikatasosta %8-bit näytteelle [pks,locs] = findpeaks(v2000d); [btm,locm] = findpeaks(-v2000d); btm = -btm; ptop1 = mean(pks)-mean(btm); %alkuperäiselle näytteelle [pks2,locs] = findpeaks(v2000(:,2)); [btm2,locm] = findpeaks(-v2000(:,2)); btm2 = -btm2; ptop2 = mean(pks2)-mean(btm2); dis2 = 5/(2^14-1); %Alkuperäisestä näytteestä laskettu keskiarvon keskivirhe peak-to-peak %jännitteelle otoskeskihajonnan (std) avulla kakv = std(pks2-btm2)/sqrt(length(pks2)); fprintf('peak-to-peak jännite 8-bit muunnoksella: %0.4f +-%0.4f\n',ptop1,dis); fprintf('peak-to-peak jännite 14-bit muunnoksella: %0.4f +- %0.5f\n',ptop2,dis2); Kysymys 3. Mitä suuruusluokkaa eri resoluutioilla saadun tuloksen ero on? 10^-2 V 10^-3 V 10^-4 V Kysymys 4. Onko mielestäsi peak-to-peak jännitteen keskiarvon keskivirhe merkittävä verrattuna kvantisointivirheeseen? Keskiarvon keskivirhe on huomattavasti suurempi kuin kvantisointivirhe. Keskiarvon keskivirhe on samaa kokoluokkaa kuin kvantisointivirhe, ja se tulisi ottaa huomioon mittausepävarmuutta määritettäessä. Keskiarvon keskivirhe on huomattavasti pienempi kuin kvantisointivirhe. Kysymys 5. Vertaa peak-to-peak jännitettä aiemmin taajuustasosta laskettuun valon ensimmäisen harmonisen taajuuden amplitudiin (muuttuja Vpiikki). Mitä havaitset?

5 Vpiikki on noin puolet peak-to-peak jännitteestä. Vpiikki ja peak-to-peak jännite ovat likimain samat. Vpiikki on noin kaksinkertainen peak-to-peak jännitteeseen verrattuna. 4. Vahvistuksen merkitys Jatketaan 8-bittisellä muunnoksella. Monesti näytesignaalia pystytään vahvistamaan manuaalisesti, ennen kuin se kerätään tietokoneelle. Oletetaan nyt, että voimme säätää näytesignaalin käsittämään koko näytteenottoalueen. Lisää seuraava koodi scriptiisi. Siinä on ensin vahvistettu ja siirretty korkeussuunnassa alkuperäistä signaalia, jonka jälkeen signaali on muunnettu 8-bittisellä muuntimella. Eroa käsittelemättömään signaaliin on havainnollistettu kuvaajalla. %Näytteen "analoginen" vahvistus: vahvistus = (5/(max(v2000(:,2))-min(v2000(:,2)))); v2000v = (v2000(:,2)-min(v2000(:,2)))*vahvistus; v2000vd = round(v2000v/dis)*dis; figure; plot(v2000(:,1), v2000d,'b+'); plot(v2000(:,1),v2000vd,'g+'); axis([ ]); legend('8-bit mittapisteet','vahvistetun 8-bit signaalin mittapisteet'); Tutkitaan vielä tällä näytteellä saatua peak-to-peak arvoa: [pks3,locs] = findpeaks(v2000vd); [btm3,locm] = findpeaks(-v2000vd); btm3 = -btm3; %Muunnetaan takaisin, kun tunnetaan vahvistus ptop3 = (mean(pks3)-mean(btm3))/vahvistus; kvvirhe = dis/vahvistus; fprintf('peak-to-peak jännite vahvistetulle 8-bit signaalille: %0.4f +- %0.4f\n',ptop3,kvvirhe); Kysymys 6. Miten saavutettu tarkkuus suhtautuu aiemmin laskettuihin arvoihin? Vahvistetun 8-bittisen näytteen tarkkuus ei juuri eroa vahvistamattomasta 8-bittisestä näytteestä. Vahvistetun 8-bittisen näytteen tarkkuus on lähes yhtä hyvä kuin vahvistamattoman 14-bittisen näytteen. Vahvistetun 8-bittisen näytteen tarkkuus on parempi kuin vahvistamattoman 14-bittisen näytteen.