Avdeling for Ingeniegfag EKSAMENSOPPGAVE Emne: IRE31613 Signalbehandling Lærer Per Thomas Huth Age Johansen Grupper: Dato: Tid: 13ELE-D, 123LEY 3. desember 2015 09.00 13.00 Antall oppgavesider: 6 Antall vedleggsider: 2 Inklusiv forside. Sensurfrist: 4. Januar 2015 Hjelpemidler: Ifeachor & Jervis (2002): Digital Signal Processing - A Practical Approach - 2. ed. Pearson Prentice Hall. James II. McClellan et al (2003): Signal Processing First.. Pearson Prentice Hall. (Totalt eller kopi av utdrag) Artikler etc.: Overview of Information Theory (chapt. 16) UNIK-kompendium (302) Kalkulator, tegne og skrivesaker. KANDIDATEN MÅ SELV KONTROLLERE AT OPPGAVESETTET ER FULLSTENDIG. Alle deloppgaver teller likt ved bedømming. Side 1
Avdeling for Ingenieirfag Oppgave 1 Figuren under viser prosessen hvor et analogt system digitaliseres for siden å bli behandlet digitalt. Input filter ADC withsarnple and hold x(n)digital(n) processor DAC Output filter y(t) Vi tenker oss at vi har følgende analogt signal: x(t) = sin27t500t+ (1/3) sin2n1500t + (1/5)sin2n2500 t + (1/7)sin2n3500t + (1/9)sin2n4500t [V] Lag en enkel skisse av signalet i tidsplanet og forklar hva slags signal vi har. Tegn frekvensspekteret (frekvensresponsen)i området <-5kflz;5kHz> for det gitte signalet. I frekvensplanet legger vi til komponenten.5[f].skisser signalet i tidsplanet nå. Forklar. Vi skal punktprøve et signal med samme båndbredde som over. I et idealisert tilfelle: Hvilket filter vil du bruke på inngangen og hva blir minimum punktprøvingsfrekvens. Istedenfor det ideatiserte filteret benyttes et filter med Butterworth karakteristikk: A(f) = Her er n ordenen på filteret. Vi har et 4. ordens filter med en grensefrekvens, f på 5kHz. Punktprøvingsfrekvensen er i utgangspunktet satt til 10kHz. Finn Aliasing feilen ved grensefrekvensen. t) Finn minste punktprøvingsfrekvens som er nødvendig for at signal til aliasing feilnivået skal være mindre enn 10 % ved grensefrekvensen. Finn minste punktprøvingsfrekvens som er nødvendig for at signal til aliasing feilnivået skal være mindre enn kvantiseringsstøyen når vi koder med 8 bit. Vi tenker oss at den digitale prosessen som skal utføres er et LTI system på diskret form som vist i figuren under. Følgende er gitt: h[n] = {0,2,2,0,..}og x[n] = {0,1,1,1,0..}. x[n] h[n] y[n] Finn y[n]. Side 2
Vi bytter system og betrakter i det etterfølgende to LTI filter. Hvilke egenskaper har et LTI system og hva slags type filter er beskrevet i j). Finn h[n] når y[n] = x[n] + x[n 1] + x[n 2] + x[n 3]. Lag en skisse. Finn H(z) ut i fra overstående og p1ottpoler og nullpunkter 1) Vis at z 1 z' Ser nå videre på følgende filter hvor y[n] = 0. 8y[n 1] + 0. 8x[n] + x[n 1]. Finn H(z) Plott poler og nullpunkt for H (Z). 1 Finn H(e-14))og vis at IH(e11701 2 1. Til slutt konstruerer vi et filter. Et lavpassfilter er spesifisert ut i fra følgende i figuren under: Passband grensefrekvens: 2,0 khz. Transisjonsbånd: 0,80 khz. Stoppbandsdempning: > 50dB. Samplingsfrekvens: 10 khz. fp Passband Transition Stopband band Bruk vindusmetoden til å finne koeffisientene i et FIR filter for denne filterspesifikasjonen. Hvilke vindusfunksjoner kjenner du som tilfredsstiller filterets spesifikasjoner. Velg et Hammingvindu i beregningene videre i oppgaven. Definer Hammingvinduet med antall koeffisienter. Finn korrigert cut-off frekvens fc. Beregn de 2 første koeffisientene. Side 3
Høgskolen i Østfold 1RE31613Signalbehandling Avdeling for Ingeniørfag Oppgave 2 a) Et digitalt filter har et Pole/Zero-plott som vist i figur 2A. Alle svarene i denne deloppgaven skal begrunnes. Hva slags filtertype viser figuren (LP, HP, BP, BS)? Er dette et FIR- eller IIR-filter? Hvilken orden har filteret? Er filteret stabilt? b) Samme filter som i deloppgave a). Grovskisser frekvensresponsen (amplitude) til filteret som en funksjon av den digitale vinkelfrekvensen, w. Kun relative amplitudeverdier er viktige. En av polene som er vist ligger plassert i punktet (-0,6464524 + j 0,5901187) i det komplekse planet. For filteret tilsvarer dette en analog frekvens på 8473 Hz. Beregn samplingsfrekvensen (Fs) i dette tilfellet. (Har du dårlig tid til en nøyaktig beregning, kan du gjøre en overslagsberegning.) 1 Pole/Zero Plot 0.51- Part Imaginary -0.5H Figur 2A -1.5-1 -0.5 0 0.5 1 1.5 Real Part c) I vedlegg 1 er det listet 3 programfiler som utgjør kjernen i et IIR-filterprogram som har blitt benyttet i en laboratorieøvelse. Filene iir.h og iir.cpp danner selve filteret som er realisert som en CPP-klasse. IIR-filteret er strukturert som en kaskadekobling av 2. ordens seksjoner. Side 4
Tegn blokkskjemaet for en 2. ordens filterseksjon slik den er beskrevet i programmet. Før på symboler / variabelnavn fra programmet i blokkskjemaet. d) I funksjonen (metoden) filter(), finnes en for-løkke. Hva er hensikten til denne, dvs, hva representerer for-løkka i forhold til den aktuelle, totale filterstrukturen. Hvorfra hentes koeffisientverdier og andre data som bestemmer filteret, og hvor skjer dette i programmet? e) Ved å programmere en digital testutgang AV og PÅ inne i interruptrutina, kan man få innsikt i hvor mye tid som går med til de enkelte delene av denne. Tidene kan måles med oscilloskop. Programlista nedenfor viser et eksempel på hvordan dette kan gjøres, og figur 2B viser det målsatte resultatet ut fra at samplingsfrekvensen DigitalOut TEST(PA_O); extern "C" void i2s_dma_isr(void) static float sampleoutl = 0.0f; static float sampleoutr = 0.0f; av en skopmåling med proben festet på TEST-utgangen. Gå er 46900 Hz, som den har vært i laboratorieforsøkene. TEST = 1; Write output samples, (-1,1) float to 16 bit signed integer dmamemtx[0] = (int16_t)(sampleoutl*32768*volume); dmamemtx[1] = (int16_t)(sampleoutr*32768*volume); Read input samples. 16 bit signed integer to (-1,1) float. float sampleinl = (float)( (int16_t)dmamemrx[0] )/32768.0f; float sampleinr = (float)( (int16_t)dmamemrx[1] )/32768.0f; TEST = 0; TEST = 1; FILTER sampleoutl = iirl.filter(sampleinl); sampleoutr = iirr.filter(sampleinr); TEST = 0; Clear DMA interrupt flag DMA1->LIFCR 1= DMA_LIFCR_CTCIF3; TEST = 1; TEST = 0; Side 5
21.3 ps 100 ns 100 ns 1500 ns 8000 ns 220 ns 4-11, Figur 2B OBS! Det er de målsatte verdiene i figuren som gjelder, ikke de relative lengdene til pulsene. Med det viste måleoppsettet, hvor lang tid går med til de egentlige filteroperasjonene / filteralgoritmene? Hvor lang tid går med til nødvendige, faste operasjoner i interruptrutina som ikke er direkte tilknyttet filteroperasjonene? Hvor mye (i antall nanosekunder) anslår du at man kan øke filteralgoritmen, før programmet bryter sammen. Utførelsen av TEST-instruksjonene tar også tid. Svar også på spørsmålet i forrige punkt, når du har korrigert for denne tiden. f) Gjør en modifisering av programmet slik at du ved hjelp av den blå bryteren på kortet og en ekstra trykkbryter (newbut) kan velge mellom 4 virkemåter for filterprogrammet: bluebut newbut Funksjon 0 0 Bypass signalet sendes utenom filteret 0 1 Mono samme lyd i begge outputkanaler (filtrert) 1 0 Normal filtrering i separate kanaler 1 1 Mute - ingen lyd DigitalIn newbut(pa_1); Reads 0 when pushed OBS! Det er ikke nødvendig å skrive inn hele programmet på nytt, men forklar hvor du setter inn endringene. Side 6
VEDLEGG1 - Tre sentrale programfiler fra laboratorieoppgaver main.cpp: #include "mbed.h" #include "TLV320.h" #include "i2s.h" #include "dma.h" #include "IIR.h" #include "fdacoefs.h" Serial pc(usbtx, USBRX); DigitalIn bluebut(user_button); IirClass iirl(mwspt_nsec, &NL[0], &NUM[0], &DEN[0]); IirClass iirr(mwspt_nsec, &NL[0], &NUM[0], &DEN[0]); Interface NUCLEO-F411RE / TLV320AIC23B audio codec. Current setup: Fs=48000 (/ 46900) Hz, 16 bit samples. Funcion prototypes for void initsystem(void); DMA buffers int32_t dmamemrx[2]; int32_t dmamemtx[2]; Other gloabal variables volatile float volume=1.0f; DMA interrupt extern "c" void i2s_dma_isr(void) { static float sampleoutl = 0.0f; static float sampleoutr = 0.0f; Write output samples, (-1,1) float to 16 bit signed integer dmamemtx[0] = (int16_t)(sampleoutl*32768*volume); dmamemtx[1] = (int16_t)(sampleoutr*32768*volume); Read input samples. 16 bit signed integer to (-1,1) float. float sampleinl = (float)( (int16_t)dmamemrx[0] )/32768.0f; float sampleinr = (float)( (int16_t)dmamemrx[1] )/32768.0f; FILTER sampleoutl = iirl.filter(sampleinl); sampleoutr = iirr.filter(sampleinr); Clear DMA interrupt flag DMA1->LIFCR I= DMA_LIFCR_CTCIF3; } int main() { initsystem(); while(1) ( /* --- LOOP --- */ } } Side 7
iir.h: #ifndef IIR_H #define IIR H #include "m];ed.h" extern Serial pc; class IirClass { private: const float (*a)[3]; const float (*b)[3]; float (*dly)[2]; Peker til tellerpolynom peker til nevnerplynom delay samples for all stages short nsec; antall filterseksjoner const int *nl; public: IirClass(short nsec, const int *nl, const float(*a)[3], const float(*b)[3]); float filter(float input); } ; #endif iir.cpp: #include "IIR.h" IIR The filter accepts unmodified filter coeffients from Matlab FDATOOL exported as C-header files (single precicion). DEN[] -> b[] NUM[] -> a[] IirClass::IirClass(shortnSec, const int*_nl, const float (*_a) [3], const float (*_b) (3) ) nsec nsec; # sections nominator denominator nl = _nl; # filter coefficients in section dly = static_cast <float (*)[2]> (malloc(nsec * 2 * sizeof(float))); if (dly == NULL) { pc.printf("iir Buffer allocation failed!\n"); exit(1); } else { pc.printf("iir Buffer allocation OK!\n"); pc.printf("... Filling buffer with zeros\n"); for (int i = 0; i < nsec; i++) { dly[i][0] = 0.0; dly[i][1] = 0.0; float IirClass::filter(float input) float yn = 0, un; for (int i = 0; i < nsec; i++, input = yn) { if ( nl[i] == 1) { yn = input * a[i] [0]; else { un = input - b[i][1] * dly[i][0] - b[i][2] * dly[i] [1]; yn = a[i][0] * un a[i] [1] * dly[i] [0] + a[i] [2] * dly[i] [1]; dly[i] [1] = dly[i][0]; update delays dly[i] [0] = un; update delays return yn; Side8