Analyseøving 8 - løsningsforslag

Like dokumenter
Analyseøving 9. Løsningsforslag. TTT4265 Elektronisk systemdesign og -analyse II. Oppgave 1. Signalegenskaper (4p)

Bruk av interrupt og Timer i Arduino-program.

ARDUINO STUDIELABEN PROGRAMMERING DIGITALE/ANALOGE INNDATA/UTDATA LYSDIODER FRITZING. Roger Antonsen INF januar 2012

Bruk av interrupt og Timer i Arduino-program.

Hjemmeeksamen 2 i INF3110/4110

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Tittel: Design av FSK-demodulator. Forfattere: Torstein Mellingen Langan. Versjon: 1.0 Dato: Innledning 1

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

INF1010 Tråder II 6. april 2016

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Prototyping med Arduino del 3

Uke 4: z-transformasjonen

SAS FANS NYTT & NYTTIG FRA VERKTØYKASSA TIL SAS 4. MARS 2014, MIKKEL SØRHEIM

Uke 4: z-transformasjonen

4. desember Antall vedleggsider: 2

Litt mer om Arduino. Roger Antonsen Sten Solli INF januar 2011

WORKSHOP BRUK AV SENSORTEKNOLOGI

Transformanalyse. Jan Egil Kirkebø. Universitetet i Oslo 17./23. september 2019

Kapittel 1 En oversikt over C-språket

Del 4 Noen spesielle C-elementer

Løsningsforslag til eksamen i INF2270

Ifeachor & Jervis (2002): Digital Signal Processing - A Practical Approach - 2. ed. Pearson Prentice Hall.

Obligatorisk oppgave 1 INF1020 h2005

TDT4110 IT Grunnkurs Høst 2012

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Fasit til midtveiseksamen

Dynamic Programming Longest Common Subsequence. Class 27

OPPGAVE 5b og 8b Java Kode

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

EKSAMEN (Del 2, våren 2015) Løsningsforslag

IN2010: Algoritmer og Datastrukturer Series 2

UNIVERSITETET I OSLO

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Tidsdomene analyse (kap 3 del 2)

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

E K S A M E N FAKULTET FOR TEKNOLGI OG REALFAG. Emnekode: ELE217 Emnenavn: Mikrokontrollere og styresystemer.

Prototyping med Arduino del 2

En oppsummering (og litt som står igjen)

1: { 2: Display functions 3: ============================================================= 4: Instruction DB5 DB4 DB3 DB2 DB1 DB0 5:

Mathematics 114Q Integration Practice Problems SOLUTIONS. = 1 8 (x2 +5x) 8 + C. [u = x 2 +5x] = 1 11 (3 x)11 + C. [u =3 x] = 2 (7x + 9)3/2

Dagens tema: Sjekking

LabVIEW seriekommunikasjon med mikrokontroller

PRIORITETSKØ. Aksjehandel. Datastruktur for aksjehandel. Nøkler og Totalorden-relasjonen

består av 7 sider inklusiv denne forsiden og vedlegg. Kontroller at oppgaven er komplett før du begynner å besvare spørsmålene.

En algoritme for permutasjonsgenerering

File: C:\My Documents\fagprove\tp\klokke.txt , 08:42:20

Programmeringsspråket C

EKSAMEN. Informasjon om eksamen. Emnekode og -navn: ITD13012 Datateknikk. Dato og tid: timer. Fagansvarlig: Robert Roppestad

Stack. En enkel, lineær datastruktur

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

FYS3240/4240 Forslag til prosjektoppgave for Lab 4: DAQ-øvelse med LabVIEW

Løsningsforslag Test 2

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

Del 1 En oversikt over C-programmering

Øvingsforelesning 5 Python (TDT4110)

Mer om C programmering og cuncurrency

Uke 4: z-transformasjonen

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Algoritmer og datastrukturer A.1 BitInputStream

Exercise 1: Phase Splitter DC Operation

Programmering i C++ Løsningsforslag Eksamen høsten 2005

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

PXT: Snake. Introduksjon. Skrevet av: Håvard Nygård Jakobsen

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

Øvingsforelesning 5 Python (TDT4110)

Løsningsforslag for eksamensoppgave, våren 2004

Forelesning inf Java 5

TDT4165 PROGRAMMING LANGUAGES. Exercise 01 Introduksjon til Oz

Forelesning inf Java 5

EKSAMEN. Les gjennom alle oppgavene før du begynner. Husk at det ikke er gitt at oppgavene står sortert etter økende vanskelighetsgrad.

Database security. Kapittel 14 Building Secure Software. Inf329, Høst 2005 Isabel Maldonado

Oppgave 1 - Linux kommandolinje (%)

Høgskoleni østfold EKSAMEN. Oppgavesettet består av 8 sider inklusiv denne forsiden og vedlegg.

Ordliste. Obligatorisk oppgave 1 - Inf 1020

EKSAMEN. Emne: Algoritmer og datastrukturer

UNIVERSITETET I OSLO

INF Notater. Veronika Heimsbakk 10. juni 2012

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Transkript:

TTT4265 Elektronisk systemdesign og -analyse II Analyseøving 8 - løsningsforslag Innlevering tirsdag 3. November 8:00 Oppgave 1. Periodisitet, tidsskift, og tidsreversering (4p) Oppgave 2. Tidsskift (1p)

Oppgave 3. Systemegenskaper (6p)

Oppgave 4. Energi og effekt til periodisk signal (2p) Oppgave 5. Beskrivelse av FIR-filter (3p)

Oppgave 6. Kombinering av enkeltsystemer (3p) Oppgave 7. Kausalitet og BIBO-stabilitet (2p)

Oppgave 8. Implementasjon av FIR-filter på Arduino (16p) a) Med b=0.7, blir enhetspulsresponsen som følger: 1.2 1 0.8 h(n) 0.6 0.4 0.2 Alle verdier når n er utenfor intervallet [0,9] er lik null. b) 0-2 0 2 4 6 8 10 n For et FIR-filter blir filterkoeffisientene lik enhetspulsresponsen, altså b k = h(k) (se side 52 i "Signalbehandling og kommunikasjon" av Bojana Gajic). Uttrykket for systemresponsen blir da y n = + h k x(n k),-. der 9 er satt inn som øvre grense fordi det er den høyeste verdien der h(k) 0. Videre er inngangssignalet vårt i perioden som starter med n=0, lik 1, 0 n 19 x n = 0, 20 n 39 Vi kan nå bruke disse likningene til å plotte en periode av y(n). Når vi velger å plotte i perioden 0 n 39, vil vi også i noen tilfeller få med x(n) fra området -9 n 0 i summen vår. Vi forstår at disse verdiene må være null, siden x(n) er periodisk. Plottet blir: 3.5 3 2.5 2 y(n) 1.5 1 0.5 0 0 5 10 15 20 25 30 35 40 n

c) Forslag til kode: #include <Wire.h> #include <Adafruit_MCP4725.h> #include <TimerOne.h> //Pinout: //Filter input - A0. //DAC SDA - A4. //DAC SDL - A5. int val; //To hold the current unfiltered value, i.e. x(n) int valfilt; //To hold the current filtered value, i.e. y(n) volatile boolean sampletime; //Flag to denote that a new conversion should take place. const int ORDER = 9; //Order of FIR filter. const int DIVIDE = 3277; //The output is divided by this number to normalize it. byte bufpoint = 0; //Current position in the circular buffer. //The coefficients. const int COEFF[ORDER+1] = {4096,2867,2007,1404,983,688,481,337,236,165; //Circular buffer used by the filter routine to hold current and previous x(n) values. //long, to make the multiplications happen in 32 bit. int inbuf[order+1] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0; //Instantiate DAC. Adafruit_MCP4725 dac; void setup() { //Set up timer to trigger the function samplinginterrupt each ms. Timer1.initialize(1000); Timer1.attachInterrupt(samplingInterrupt); //Set up DAC at correct I2C address. dac.begin(0x62); void loop() { //Check if it's time for a new conversion/filter run. if(sampletime) { //Read x(n) from the ADC. val = analogread(a0); //Run FIR filter. The current x(n) is input, the current y(n) is output. valfilt = firfilt(val); //Write current y(n) to the DAC. dac.setvoltage(valfilt,false); //Reset flag. sampletime = false; //ISR (interrupt service routine) triggered by timer 1 each ms. void samplinginterrupt(void) { //Set the flag true each ms to denote that it's time to convert/filter. sampletime = true; //FIR filter routine. Takes the current x(n) as argument, and output the current y(n). int firfilt(int currin) { //Variable to hold the current output. long currout = 0; //Put the current x(n) in the correct buffer position. inbuf[bufpoint] = currin; //Do filtering: Loop through all the coefficients, and multiply with the correct x //values in the buffer. //Accumulate the result in the variable currout. for (int i=0; i< ORDER; i++) { currout += (long)coeff[i]*(long)inbuf[bufpoint];

//Wrap the buffer pointer around when it is needed. if(bufpoint >= ORDER) bufpoint = 0; else bufpoint++; //Do the last multiplication/accumulation without updating the buffer pointer. //Better to just do this outside the loop, than to implement extra checks inside //the loop (higher comp time). currout += (long)coeff[order]*(long)inbuf[bufpoint]; //Normalize and return the output. return currout/divide; Bilde av inngang og utgang på oscilloskopet (1V/div): Beregninger: Signalfrekvens: f 7 1000 Hz f 789 = = = 25 Hz samples/periode 40 Skalering av utgang etter filtering: y(n) = FIRutgang O.PQ8RPR8SPOTPQ8R,UVWW878VXR7,YSVZ8X9 W8SRVZWUZ7RVZ,X8X9 T\ = FIRutgang = `abcr9yx9 T ]\ ^.T 3277

Kommentarer: I koden over er bufferet inbuf, som tar vare på tidligere inngangsverdier implementert som et såkalt sirkulært buffer. Dette betyr at når en inngangsverdi først er satt inn i bufferet (altså arrayet), så flyttes den aldri før den til slutt overskrives. I stedet brukes bare en pointer inbuf til å holde styr på hvor vi er i bufferet, og denne flippes alltid rundt til null når vi har nådd enden av arrayet. Bufferet blir derfor som en slags ring. Grunnen til at vi gjør det slik som dette er at vi slipper å flytte på data i minnet når de først er lagret, og vi sparer da masse tid. I denne oppgaven, som bare har ti koeffisienter, har vi ganske god tid. Vi er derfor ikke avhengig av å bruke et sirkulært buffer, og hvilken som helst metode som tar vare på nok foregående verdier vil nok føre frem. Vi kan for eksempel tenke at vi bruker et array som en kø, der det fremmerste elementet er det nyeste. Vi må da hver gang forskyve alle elementene med en posisjon for å gi plass til en ny verdi (den eldste dyttes da ut). Det kan være enklere å se for seg hvordan dette virker, men forskyvningsoperasjonen tar en del prosesseringstid, og kan for bli kritisk i større FIR-filtere. I vår oppgave vil det nok imidlertid fungere greit. Biblioteket TimerOne brukes til å styre en timer, som kaller opp funksjonen samplinginterrupt hvert millisekund. Dette gjøres i form av at timeren genererer et såkalt avbrudd (interrupt), som setter hovedprogrammet (loop()) på pause kaller opp en spesiell funksjon som kalles en ISR (interrupt service routine). I vårt tilfelle er det samplinginterrupt som blir ISR-en. Dette fungerer bra, men det som er tingen er at når vi kjører ISR-en, kan ikke systemet sette i gang andre ISR-er før vi returnerer til hovedprogrammet. Dette lager trøbbel hvis vi prøver å skrive til DAC-en vår inne i ISR-en, siden DAC-biblioteket selv benytter seg av interrupts/isr-er for å kommunisere med DAC-en. I koden er dette løst ved å kun bruke ISR-en til å sette et flagg som sier at nå er det på tide å lese, filtrere og skrive, og så gjøre de faktiske operasjonene i loop() i stedet. Flaggvariabelen sampletime må deklareres volatile. Enkelt forklart, så gjør dette kompilatoren oppmerksom på at sampletime kan endres fra et sted utenom hovedprogrammet, og derfor må den lastes inn fra minnet på nytt hver gang den skal leses. Både buffer-arrayet og arrayet som holder koeffisientene er int. Når selve multiplikasjonene utføres, må imidlertid verdiene castes til long, slik at det er en 32-bits multiplikasjon som blir gjort. Hvis ikke vil svare fra multiplikasjonen være int, og dette vil føre til overflyt.