Høgskolen i Østfold IRE31613 Signalbehandling
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.
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 y(t)
filter
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].
Høgskolen i Østfold
Avdeling for Ingeniorfag
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.
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.)
Pole/Zero Plot 1
0.51-
Imaginary Part
-0.5H
-1.5 -1 -0.5 0 0.5 1 1.5
Real Part
Figur 2Ac) 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.
Avdeling for Ingeniorfag
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
2Bviser det målsatte resultatet av en skopmåling med proben festet på TEST-utgangen. Gå ut fra at samplingsfrekvensen er 46900 Hz, som den har vært i laboratorieforsøkene.
DigitalOut TEST(PA_O);
extern "C" void i2s_dma_ISR(void) static float sampleOutL = 0.0f;
static float sampleOutR = 0.0f;
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;
21.3 pS
100 nS 100 nS
4-11,
1500 nS 8000 nS 220 nS
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.
Avdeling for Ingeniorfag
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 --- */ } }
// 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 peker delay
til tellerpolynom til nevnerplynom 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;