21.01.2015 Views

MIK 200 Anvendt signalbehandling, 2012. Lab. 8, Notch-filter.

MIK 200 Anvendt signalbehandling, 2012. Lab. 8, Notch-filter.

MIK 200 Anvendt signalbehandling, 2012. Lab. 8, Notch-filter.

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Stavanger, 28. februar 2012<br />

Det teknisknaturvitenskapelige<br />

fakultet<br />

<strong>MIK</strong> <strong>200</strong> <strong>Anvendt</strong> <strong>signalbehandling</strong>, <strong>2012.</strong><br />

<strong>Lab</strong>. 8, <strong>Notch</strong>-<strong>filter</strong>.<br />

<strong>Notch</strong>-<strong>filter</strong>, på norsk ofte kalla suge<strong>filter</strong>, er en spesiell type IIR-<strong>filter</strong>. Kort<br />

oppsummmert består notch-<strong>filter</strong>et av et nullpunkt på enhetssirkelen for den<br />

frekvensen en ønsker å stanse, og for å oppheve virkningen av nullpunktet for<br />

andre frekvenser er det plassert en pol like innenfor nullpunktet.<br />

I denne øvinga må dere forstå godt hvordan et notch-<strong>filter</strong> virker. For de fleste<br />

av dere betyr det å bruke en del tid på å gjenoppfriske teorien om IIR-<strong>filter</strong> og<br />

notch-<strong>filter</strong> og å besvare teorioppgavene grundig og godt. Se gjerne ei lærebok,<br />

og teoridelen i del 2 her.<br />

Dette er ei nokså arbeidskrevende øving. Derfor er det for de fleste systemene<br />

tegnet opp hvordan de kan implementeres i System Generator, dermed slipper<br />

dere forhåpentligvis mye prøving og feiling når systemene skal implementeres.<br />

Likevel må dere bruke tilstrekkelig tid på virkelig å forstå hva som gjøres i<br />

systemene.<br />

Siste side i oppgaven her er et skjema for egenevaluering av arbeidet.<br />

Den siste sida her skal være første side i deres innlevering.<br />

Karl Skretting, Institutt for data- og elektroteknikk (IDE), Universitetet i Stavanger (UiS), 4036 Stavanger.<br />

Sentralbord 51 83 10 00. Direkte 51 83 20 16. E-post: karl.skretting@uis.no.


1 Selve oppgaven.<br />

1. Et førsteordens IIR-<strong>filter</strong> (<strong>Notch</strong>-<strong>filter</strong>) som stopper DC-komponenten<br />

kan implementeres med å plassere et nullpunkt i 1 og en pol like innenfor.<br />

Anta at samplingsraten er 50 kHz.<br />

(a) Skriv opp transferfunksjonen for et slik <strong>filter</strong> når radius for pol er<br />

r p = 31/32.<br />

(b) Skriv så differanseligningen for <strong>filter</strong>et. Skriv denne på en form som<br />

viser at <strong>filter</strong>et kan implementeres uten multiplikasjoner.<br />

(c) Plott frekvensresponsen. Bruk gjerne lineær skala og plott både hele<br />

frekvensområde fra 0 Hz til Nyquist-frekvensen, og de lave frekvenser<br />

fra 0 Hz til 500 Hz.<br />

(d) For hvilket frekvensområde dempes amplituden for et sinussignal til<br />

mindre enn halvparten<br />

La nå radius for polen være r p = 63/64.<br />

(e) Skriv differanseligningen for <strong>filter</strong>et.<br />

(f) Plott frekvensresponsen for dette <strong>Notch</strong>-<strong>filter</strong>et.<br />

(g) For hvilket frekvensområde dempes nå amplituden for et sinussignal<br />

til mindre enn halvparten<br />

2. Vi har nå følgende notch-<strong>filter</strong><br />

H(z) = 63 − 102z−1 + 63z −2<br />

. (1)<br />

64 − 102z −1 + 62z−2 Anta at samplingsraten er 50 kHz.<br />

(a) Plott frekvensresponsen. Bruk gjerne lineær skala og plott hele frekvensområdet<br />

fra 0 Hz til Nyquist-frekvensen.<br />

(b) Plott et nullpunkt-pol diagram for <strong>filter</strong>et.<br />

(c) Hva er radius for polen<br />

(d) Hva er vinkel, frekvens, for nullpunktet<br />

(e) Skriv ligningen som viser hvordan <strong>filter</strong>et kan implementeres med to<br />

multiplikasjoner, 5 addisjoner/subtraksjoner og en skalering, (differanseligningen).<br />

Den ene multiplikasjonen kan i tillegg erstattes med<br />

en skalering og en subtraksjon om ønskelig.<br />

3. Vi har nå et andre-ordens notch-<strong>filter</strong> med ei bestemt form. Vi setter her<br />

a 0 = 1, b 0 = 1 og b 2 = 1. Vi har da<br />

H(z) =<br />

1 + b 1z −1 + z −2<br />

. (2)<br />

1 + a 1 z −1 + a 2 z−2 Vi får for vinkel for nullpunkt (som er på enhetssirkelen) cos θ n = −0.5b 1 .<br />

Også her antar vi at samplingsraten er 50 kHz.<br />

2


(a) Vis at radius for polen er r p = √ a 2 .<br />

(b) Vis at en for vinkel for pol (som er innenfor enhetssirkelen) har at<br />

cos θ p = −a 1 /2r p .<br />

(c) Finn <strong>filter</strong>koeffisientene, her b 1 , a 1 og a 2 , for <strong>filter</strong>et her når en ønsker<br />

stoppfrekvens på 5 kHz og radius for pol på 0.99.<br />

(d) Skriv differanseligningen for <strong>filter</strong>et med stoppfrekvens på 5 kHz og<br />

radius for pol på 0.99.<br />

(e) Plott frekvensresponsen for <strong>filter</strong>et med stoppfrekvens på 5 kHz og<br />

radius for pol på 0.99.<br />

(f) For hvilket frekvensområde dempes amplituden for et sinussignal til<br />

mindre enn halvparten<br />

4. Vi har et <strong>Notch</strong>-<strong>filter</strong> som i ligning 2. Vi antar nå at radius for pol er<br />

nesten 1 og at den kan skrives som r p = 1 − k/1024, der k er et lite<br />

positivt heltall.<br />

(a) Vis at a 2 nå kan tilnærmes med a 2 ≈ 1 − k/512.<br />

(b) Hvor stor kan k være for at denne tilnærmelsen gir samme resultat<br />

for a 2 som når det nøyatige uttrykket brukes, og a 2 representeres<br />

som Fix_12_10 (signed 2-er komplement). Et tall med format<br />

Fix_12_10 kan representere alle tall fra og med -2 til (men ikke<br />

inkludert) 2 i steg på 2 −10 = 1/1024.<br />

(c) En ønsker vinkelen for pol lik vinkel for nullpunkt, θ p = θ n eller<br />

cos θ p = cos θ n . Vis at en da får a 1 = b 1 − kb 1 /1024.<br />

(d) Skriv <strong>filter</strong>et på form som i ligning 2, men bruk kun k og b 1 , en har<br />

som før cos θ n = −0.5b 1 , som parametere.<br />

(e) Skriv differanseligningen som viser hvordan <strong>filter</strong>et kan implementeres.<br />

5. Vi skal nå bruke resultetene fra forrige lab til å lage et system der AD<br />

og DA omformere kjører på 50 MHz, og der en har et godt anti-aliasing<strong>filter</strong><br />

før nedsampling med en faktor på 1000, så har en oppsampling<br />

med en faktor på 1000 med et godt glatte<strong>filter</strong>. I øving 7 så en hvordan<br />

disse filtrene kunne implementeres effektivt med CIC-<strong>filter</strong> og FIR<br />

kompensasjons<strong>filter</strong> på lavere rate.<br />

Dere skal nå lage et system som sender signalet gjennom FPGA-en. Først<br />

i systemet skal det være et effektivt anti-aliasing-<strong>filter</strong> og nedsampling,<br />

dette er i et subsystem Ned1000, som viser i figur 2. Dette endrer sampleraten<br />

fra 50 MHz til 50 kHz. Sist i systemet skal det være oppsampling<br />

og et effektivt glatte<strong>filter</strong>, dette er i et subsystem Opp1000, som viser<br />

i figur 3. Selve systemet lab08a viser i figur 1. Dette er som lab07b i<br />

øving 7, med subsystem for antialiasing <strong>filter</strong> med nedsampling og for<br />

oppsampling med glatte<strong>filter</strong>. Lag systemet og kommenter hvordan det<br />

3


virker. Sjekk at noen ulike frekvenser, fra ca 100 Hz og opp til 100 kHz,<br />

dempes som forventet.<br />

Se spesielt på resultatet av et innsignal med firkantpulser på frekvens 1<br />

kHz, merk resultatet av utganssignalet her både nå trykknappen er nede<br />

og når den er oppe.<br />

6. Nå skal vi sette to notch-<strong>filter</strong> inn i systemet i forrige punkt. Disse skal gå<br />

på 50 kHz. En skal kunne velge hvilket notch-<strong>filter</strong> som skal være aktivt<br />

med trykknapp 1. Systemet kan implementeres som vist i figur 4.<br />

Det ene <strong>filter</strong>et er et førsteordens notch-<strong>filter</strong> med stoppfrekvens 0.0,<br />

altså stoppes DC. Radius for pol skal være 63/64. Filteret er altså som<br />

i spørsmål 1 punkt e til g. Dette <strong>filter</strong>et kan implementeres uten multiplikasjoner<br />

som i figur 5. Fordelen med dette er at en ikke får for stor<br />

forsinkelse i løkka (i simulink–modellen) som bruker forrige utgangsverdi<br />

til å beregne denne utgangsverdien, denne løkka må nemlig gjøres på en<br />

sampleperiode.<br />

Det andre <strong>filter</strong>et er et andreordens notch-<strong>filter</strong> som i spørsmål 2, ligning<br />

1. Her bruker en Cmult-blokker, disse kan implementeres uten forsinkelse,<br />

men vi har her valgt å legge forsinkelsen vi skal ha inn i disse<br />

blokkene. Implementasjon av dette notch-<strong>filter</strong>et vist i figur 6.<br />

Selve systemet lab08b viser i figur 4. Lag systemet og sjekk at det kjører<br />

som forventet. Hvilke frekvenser kan dempes, og hva vil bredden for<br />

stoppbåndet være. Vi regner stoppbåndet som de frekvenser som dempes<br />

til under halvparten.<br />

Se spesielt på resultatet av et innsignal med firkantpulser på frekvens 1<br />

kHz, merk resultatet av utganssignalet her både nå trykknappen er nede<br />

og når den er oppe.<br />

7. Den generelle multiplikasjonsblokka, Mult, krever en forsinkelse på minst<br />

3 tidssteg slik den er implementert i System Generator, dette selv om<br />

sampleraten for signalet i denne blokka er adskillig lavere enn maksimal<br />

samplerate. Dette er litt merkelig, men jeg har ikke funnet ut hvorfor.<br />

Dette skaper problem når en vil implementere et notch-<strong>filter</strong> der koeffisientene<br />

kan gis inn med parametre, for eksempel b 1 som angir posisjon<br />

for nullpunktet, og radius for pol, r p .<br />

En måte å løse dette på er å oppsample signalet (innen en del av notch<strong>filter</strong>et),<br />

for eksempel med en faktor på 4. Da må en huske på at z −1 blir<br />

z −4 og z −2 blir z −8 , og nå har en fått tilstrekkelig med tidssteg til å kunne<br />

utføre den kritiske stien. Til slutt, før signalet går videre så nedsampler<br />

en med en faktor 4 igjen.<br />

I systemet lab08c som viser i figur 7 er det tenkt at subsystemet <strong>Notch</strong>C<br />

er laget på denne måten. Altså skal en kunne bruke samme subsystem for<br />

å stoppe ulike frekvenser, og stoppfrekvensen angis med å gi tilhørende<br />

4


1 parameter som her er gitt som en konstant i subsystemet. Det sammer<br />

er også radius for pol, r p . Se grundig på figuren og merk dere spesielt<br />

godt hvilke signal som går inn til og ut av de ulike boksene. Prøv å forstå<br />

at dette er en implementasjon av notch-<strong>filter</strong>et i spørsmål 3.<br />

Selve systemet lab08c viser i figur 7. Lag systemet og sjekk at det kjører<br />

som forventet. Hvilke frekvenser kan dempes, og hva vil bredden for<br />

stoppbåndet være. Vi regner stoppbåndet som de frekvenser som dempes<br />

til under halvparten.<br />

Se spesielt på resultatet av et innsignal med firkantpulser på frekvens 1<br />

kHz, merk resultatet av utganssignalet her både nå trykknappen er nede<br />

og når den er oppe. Forklar hvorfor utsignalet med trykknappen nede<br />

her blir ulikt utsignalet med trykknappen nede i systemet lab08b.<br />

8. Nå har vi laget et bedre fleksibelt notch-<strong>filter</strong>, det viser i figur 11. Dette<br />

er implementert med et eget lite subsystem som multipliserer et signalsample<br />

y med et lite heltall k uten ekstra forsinkelse, se figur 13.<br />

Nå vil vi lage et system med et virkelig justerbart notch-<strong>filter</strong>, vi skal<br />

kunne justere både radius for polen, og stoppfrekvensen (vinkelen for<br />

nullpunktet på polen). Dette gjøres med å bygge litt logikk omkring<br />

notch-<strong>filter</strong>et. Først vil vi koble bryter 1 til en fire-bits teller, slik at<br />

utgangen her blir de fire mest signifikante bit i k, de to minst signifikante<br />

bit er faste 01. Da kan en la k variere mellom verdiene 1, 5, 9, · · · , 61,<br />

med å trykke på bryter 1. Telleren skal øke (telle) hvergang krykknappen<br />

trykkes ned. Implementasjon av denne telleren viser i figur 9.<br />

Dernest ønsker en å ha det slik at når trykknapp 2 trykkes ned så øker<br />

variabelen b1 med en fast verdi som her kalles b1_Inc. Når trykknapp<br />

3 trykkes ned så reduseres variabelen b1 med b1_Inc. Startverdi for<br />

b1_Init kan gjerne være 0. Hva er stoppfrekvensen for <strong>Notch</strong>-<strong>filter</strong>et<br />

da Som ekstra funksjonalitet kan en ha at hvis begge bryterne holdes<br />

nede så settes b1 til startverdien. Denne logikkblokka (subsystemet<br />

TellerOppNed) er ikke helt enkel å lage. Prøv å lage denne selv, men<br />

dere kan gjerne se på en mulig implementasjonen i figur 12.<br />

Selve systemet lab08d viser i figur 10. Lag systemet og sjekk at det kjører<br />

som forventet.<br />

5


SSP = 1/2<br />

<strong>MIK</strong><strong>200</strong> lab8 (lab08a)<br />

System<br />

Generator<br />

Out1<br />

PUSH1_SW<br />

Bool<br />

sel<br />

d0<br />

Fix_12_12<br />

In1<br />

Digital<br />

Fix_12_12<br />

inn<br />

ut<br />

Fix_12_12<br />

inn<br />

ut<br />

Fix_12_12<br />

d1<br />

DAC1 LC<br />

ADC1 LC1<br />

Ned1000<br />

Opp1000<br />

Mux<br />

Figur 1: Systemet lab08a i spørsmål 5.<br />

<strong>MIK</strong><strong>200</strong>, subsystemet Ned1000<br />

Systemet nedsampler et innsignal, antatt format Fix_12_12 og 50 MHz,<br />

til et utsignal med format Fix_12_12 og 50 kHz<br />

1<br />

inn<br />

3−Stage<br />

Fix_12_12<br />

Fix_39_12<br />

2 −27 Fix_39_39<br />

Fix_12_12<br />

Fix_27_13 ↓2 Fix_27_13<br />

2 −11 Fix_27_24<br />

Fix_12_12<br />

In1 CIC Out1<br />

cast<br />

50 tap<br />

z −1<br />

cast<br />

500:1 Decimator<br />

MAC FIR<br />

Convert2<br />

Convert3<br />

Scale2<br />

Down Sample<br />

CIC Filter<br />

2n−tap Linear Phase<br />

Scale3<br />

MAC FIR Filter<br />

1<br />

ut<br />

Figur 2: Systemet Ned1000 som er med i alle modeller.<br />

<strong>MIK</strong><strong>200</strong>, subsystemet Opp1000<br />

Systemet oppsampler et innsignal, antatt format Fix_12_12 og 50 kHz,<br />

til et utsignal med format Fix_12_12 og 50 MHz<br />

1<br />

inn<br />

3−Stage<br />

Fix_12_12<br />

Fix_12_12 Fix_27_13<br />

↑2<br />

2 −10 Fix_27_23<br />

Fix_12_12<br />

Fix_39_12<br />

cast<br />

2 −18 Fix_39_30<br />

Fix_12_12<br />

50 tap<br />

In1 CIC Out1<br />

cast<br />

MAC FIR<br />

1:500 Interpolator<br />

Up Sample<br />

Scale4<br />

Convert4<br />

Convert1<br />

Scale1<br />

2n−tap Linear Phase<br />

CIC Filter1<br />

MAC FIR Filter1<br />

1<br />

ut<br />

Figur 3: Systemet Opp1000 som er med i alle modeller.<br />

SSP = 1/2<br />

<strong>MIK</strong><strong>200</strong> lab8 (lab08b)<br />

System<br />

Generator<br />

Out1<br />

PUSH1_SW<br />

Bool<br />

↓1000<br />

z −1<br />

Down Sample2<br />

Bool<br />

Her er fs = 50 kHz<br />

<strong>Notch</strong>00<br />

sel<br />

Digital<br />

Fix_12_12<br />

inn<br />

ut<br />

Fix_12_12<br />

inn<br />

ut<br />

Fix_14_13<br />

d0<br />

Fix_14_13<br />

inn<br />

ut<br />

Fix_12_12<br />

In1<br />

ADC1 LC1<br />

Ned1000<br />

inn<br />

Fix_14_13<br />

ut<br />

d1<br />

Opp1000<br />

DAC1 LC<br />

<strong>Notch</strong>02<br />

Mux<br />

Figur 4: Systemet lab08b i spørsmål 6.<br />

1<br />

inn<br />

Fast <strong>Notch</strong>−<strong>filter</strong>, stoppvinkel: 0.0, r = 63/64<br />

Fix_12_12<br />

z −1<br />

b0 = 1<br />

Fix_12_12<br />

b1 = −1<br />

a<br />

b<br />

Fix_14_13<br />

a − b<br />

a<br />

b<br />

a + b<br />

Fix_14_13<br />

1<br />

ut<br />

Fix_14_7<br />

a<br />

b<br />

2 6 z −1<br />

Fix_21_13<br />

a − b<br />

2 −6<br />

Fix_21_19<br />

Fix_14_13<br />

Figur 5: Systemet <strong>Notch</strong>00 i lab08b, figur 4.<br />

6


Fast <strong>Notch</strong>−<strong>filter</strong>, stoppvinkel: ca 0.2 gange Nyquist−frekvens,<br />

b 0<br />

= 63, b 1<br />

=−102, b 2<br />

=63, a 0<br />

=64, a 1<br />

=−102, a 2<br />

=62<br />

1<br />

inn<br />

Fix_12_12<br />

x(k)<br />

a<br />

z −1 Fix_15_13<br />

b<br />

x(k−2)−y(k−2)<br />

a + b<br />

Fix_16_13<br />

x 63<br />

Fix_23_13<br />

a<br />

b<br />

Fix_24_13<br />

a − b<br />

x(k)<br />

y(k)<br />

a<br />

b<br />

Fix_15_13<br />

a − b<br />

x(k)−y(k)<br />

z −1<br />

Fix_15_13<br />

x 102<br />

Fix_23_13<br />

63[x(k)+x(k−2)−y(k−2)]−102[x(k−1)−y(k−1)]<br />

z −2<br />

Fix_14_13<br />

y(k−2)<br />

a<br />

b<br />

a + b<br />

Fix_25_13<br />

64y(k)<br />

2 −6<br />

Scale<br />

Fix_25_19<br />

cast<br />

Convert<br />

Fix_14_13<br />

y(k)<br />

1<br />

ut<br />

Figur 6: Systemet <strong>Notch</strong>02 i lab08b, figur 4.<br />

SSP = 1/2<br />

<strong>MIK</strong><strong>200</strong> lab8 (lab08c)<br />

System<br />

Generator<br />

Out1<br />

PUSH1_SW<br />

Bool<br />

↓1000<br />

z −1<br />

Down Sample2<br />

Bool<br />

Her er fs = 50 kHz<br />

sel<br />

Digital<br />

Fix_12_12<br />

inn<br />

ut<br />

Fix_12_12<br />

d0<br />

Fix_12_12<br />

inn<br />

ut<br />

Fix_12_12<br />

In1<br />

ADC1 LC1<br />

Ned1000<br />

x<br />

y<br />

Fix_12_12<br />

d1<br />

Opp1000<br />

DAC1 LC<br />

<strong>Notch</strong>C<br />

Mux<br />

Figur 7: Systemet lab08c i spørsmål 7.<br />

<strong>Notch</strong>−<strong>filter</strong> for lab08c<br />

fs er <strong>200</strong> kHz (unntatt på inn og utgang der er det 50 kHz)<br />

1<br />

x<br />

Fix_12_12<br />

↑4<br />

Fix_12_12<br />

z −8<br />

Delay<br />

Fix_12_12<br />

a<br />

Fix_13_12<br />

a + b<br />

b<br />

AddSub<br />

a<br />

Fix_17_12<br />

a + b<br />

b<br />

AddSub1<br />

cast<br />

Convert<br />

Fix_12_12<br />

↓4<br />

z −4<br />

Fix_12_12<br />

1<br />

y<br />

−1.6181640625<br />

b1 = −2cos(w)<br />

Fix_12_10<br />

a<br />

b<br />

z −4 (ab)<br />

resultat: a1<br />

a<br />

b<br />

Fix_14_12<br />

z −4 (ab)<br />

Mult1<br />

Fix_14_12<br />

a<br />

b<br />

z −4 (ab)<br />

Mult2<br />

Fix_14_12<br />

a<br />

Fix_16_12<br />

a − b<br />

b<br />

AddSub2<br />

a1*y(k−1)<br />

+ a2*y(k−2)<br />

0.97998046875<br />

radius for pol<br />

Fix_12_11<br />

a<br />

b<br />

z −4 (ab)<br />

resultat: a2<br />

Fix_14_12<br />

a<br />

b<br />

z −8 (ab)<br />

Mult3<br />

Fix_14_12<br />

a<br />

Fix_15_12<br />

a + b<br />

b<br />

AddSub3<br />

Figur 8: Systemet <strong>Notch</strong>C for systemet lab08c i figur 7. b1 i boksen til venstre<br />

er −2 cos(π/5) avrundet til format 12.10. r i boksen til venstre er 0.98 avrundet<br />

til format 12.11. Begge er sampled constant, merk at det er System Generator<br />

blokker. Periode skal være 250.<br />

7


1<br />

In1<br />

Antall skifte fra 1 (forrige) til 0 (denne) på inngangen telles<br />

Bool<br />

Delay<br />

z −1<br />

not<br />

Bool<br />

Bool<br />

and<br />

z −0<br />

Logical<br />

Bool<br />

not<br />

Inverter1<br />

Bool<br />

Counter<br />

load<br />

din<br />

out<br />

UFix_4_0<br />

1<br />

Out1<br />

Inverter<br />

Figur 9: Systemet Teller1til0 for systemet lab08d i figur 10.<br />

SSP = 1/2<br />

<strong>MIK</strong><strong>200</strong> lab8 (lab08d)<br />

System<br />

Generator<br />

Fix_12_12<br />

Digital<br />

ADC1 LC1<br />

hi<br />

UFix_2_0<br />

1<br />

lo<br />

Fix_12_12<br />

inn ut<br />

Ned1000<br />

UFix_6_0<br />

x<br />

k<br />

b1<br />

<strong>Notch</strong>D<br />

y<br />

Fix_16_14<br />

Fix_12_12<br />

inn ut<br />

Opp1000<br />

In1<br />

DAC1 LC<br />

Constant2<br />

Concat<br />

In1<br />

Bool<br />

Out1<br />

PUSH2_SW<br />

↓1000<br />

z −1<br />

Bool<br />

b1<br />

Fix_16_14<br />

0<br />

In2<br />

b1_Init<br />

Fix_16_14<br />

Out1<br />

Bool<br />

Out1<br />

PUSH3_SW<br />

↓1000<br />

z −1<br />

Bool<br />

Fix_16_14<br />

0.015625<br />

delta_b1<br />

b1_Inc<br />

TellerOppNed<br />

Bool<br />

[a:b]<br />

not<br />

Bool<br />

In1<br />

PUSH1_SW1<br />

SliceMSB<br />

Inverter2<br />

DS7_1LED<br />

Out1<br />

Bool<br />

Gir 0 når bryter<br />

trykkes ned<br />

ellers 1<br />

↓1000<br />

z −1<br />

Down Sample<br />

Bool UFix_4_0 Bool Bool<br />

In1<br />

Out1<br />

[a:b]<br />

not<br />

Teller1til0<br />

SliceMSB−1<br />

[a:b]<br />

SliceMSB−2<br />

Bool<br />

Inverter3<br />

not<br />

Inverter1<br />

Bool<br />

In1<br />

DS8_2LED<br />

In1<br />

DS9_3LED<br />

[a:b]<br />

Bool<br />

not<br />

Bool<br />

In1<br />

SliceMSB−3<br />

Inverter4<br />

DS10_4LED<br />

Figur 10: Systemet lab08d i spørsmål 8.<br />

<strong>Notch</strong>−<strong>filter</strong>, stoppvinkel varierer med b1 og radius for pol med k,<br />

cos(v) = −b1/2, og r = 1−k/1024<br />

x<br />

1<br />

Fix_12_12<br />

cast<br />

Convert2<br />

Fix_16_14<br />

↑4<br />

Fix_16_14<br />

b0 = 1<br />

a<br />

b2 = 1 a + b<br />

b<br />

z −8 Fix_16_14<br />

AddSub2<br />

Fix_17_14<br />

Delay<br />

3<br />

b1<br />

Fix_16_14<br />

cast<br />

Convert1<br />

Fix_16_14<br />

Fix_16_14<br />

↑4<br />

a<br />

Fix_16_14<br />

a − b<br />

b<br />

AddSub3<br />

a<br />

b<br />

a + b<br />

AddSub5<br />

Fix_17_14<br />

Mult<br />

2 1 Fix_24_23<br />

a<br />

b<br />

z −4 (ab)<br />

a<br />

b<br />

Fix_16_14<br />

a − b<br />

AddSub4<br />

a<br />

b<br />

Fix_16_14<br />

a + b<br />

AddSub1<br />

z −8<br />

Delay1<br />

Fix_18_14<br />

Fix_16_14<br />

a<br />

a + b<br />

b<br />

AddSub<br />

y(n)<br />

Fix_16_14<br />

↓4<br />

z −1<br />

Fix_16_14<br />

1<br />

y<br />

Scale1<br />

2<br />

k<br />

UFix_6_0<br />

cast<br />

Convert<br />

UFix_6_0<br />

↑4<br />

UFix_6_0<br />

y<br />

k<br />

Out1<br />

Fix_24_14<br />

2 −10<br />

Fix_24_24<br />

k_Mult_y<br />

Figur 11: Systemet <strong>Notch</strong>D for systemet lab08d i figur 10.<br />

8


1<br />

In1<br />

Bool<br />

0 − bryter nede<br />

1 −bryter oppe<br />

not<br />

z −1<br />

Bool<br />

Bool<br />

and<br />

Logical<br />

Bool<br />

Bool<br />

and<br />

z −0<br />

Logical4<br />

Bool<br />

or<br />

z −0<br />

Bool<br />

not<br />

Bool<br />

Logical2<br />

z −1<br />

Bool<br />

z −0 not not<br />

2<br />

In2<br />

Bool<br />

not<br />

Bool<br />

and<br />

z −0<br />

Logical1<br />

Bool<br />

or<br />

z −0<br />

Logical3<br />

Bool<br />

Bool<br />

cast<br />

Fix_16_14<br />

3<br />

b1_Init<br />

AddSub<br />

Bool<br />

sel<br />

d0<br />

d1<br />

Mux<br />

cast<br />

cast<br />

Bool<br />

sel<br />

Fix_16_14<br />

d0<br />

d1<br />

Mux1<br />

Bool<br />

Fix_16_14<br />

sel<br />

Fix_16_14<br />

d0<br />

z −1<br />

d1<br />

Delay2<br />

Mux2<br />

Fix_16_14<br />

1<br />

Out1<br />

Fix_16_14<br />

4<br />

b1_Inc<br />

a<br />

b<br />

a + b<br />

Fix_16_14<br />

a<br />

Fix_16_14<br />

a − b<br />

b<br />

AddSub1<br />

cast<br />

Fix_16_14<br />

Figur 12: Systemet TellerOppNed for systemet lab08d i figur 10.<br />

1<br />

Fix_16_14<br />

Multipliserer y med k (6 bit) uten forsinkelse.<br />

y<br />

y skal være<br />

Fix_16_14<br />

(Signed 2’s comp)<br />

UFix_6_0<br />

2<br />

k<br />

Bool<br />

[a:b]<br />

Bit0<br />

Bool<br />

[a:b]<br />

Bit1<br />

sel<br />

Fix_16_14 Fix_16_14<br />

0<br />

d0<br />

d1<br />

Mux1<br />

sel<br />

Fix_16_13<br />

0<br />

d0<br />

Fix_16_13<br />

d1<br />

a<br />

Fix_18_14<br />

a + b<br />

b<br />

AddSub<br />

Fix_16_13<br />

a<br />

Fix_24_14<br />

a + b<br />

b<br />

AddSub4<br />

1<br />

Out1<br />

k skal være<br />

Mux2<br />

et heltall<br />

mellom<br />

0 og 63<br />

Bit2<br />

[a:b]<br />

Bool<br />

2 2<br />

Fix_16_12<br />

sel<br />

Fix_16_12 Fix_16_12<br />

0<br />

d0<br />

a<br />

Fix_18_12<br />

d1<br />

a + b<br />

b<br />

Mux3<br />

AddSub1<br />

a<br />

b<br />

Fix_21_12<br />

a + b<br />

AddSub3<br />

Bit3<br />

[a:b]<br />

Bool<br />

2 3<br />

Fix_16_11<br />

0<br />

sel<br />

Fix_16_11<br />

d0<br />

d1<br />

Fix_16_11<br />

Mux4<br />

Bit4<br />

[a:b]<br />

Bool<br />

2 4<br />

Fix_16_10<br />

0<br />

sel<br />

Fix_16_10<br />

d0<br />

d1<br />

Fix_16_10<br />

a<br />

b<br />

Fix_18_10<br />

a + b<br />

Mux5<br />

AddSub2<br />

Bit5<br />

[a:b]<br />

Bool<br />

2 5<br />

Fix_16_9<br />

2 1 Mux6<br />

0<br />

Fix_16_9<br />

sel<br />

d0<br />

d1<br />

Fix_16_9<br />

Figur 13: Systemet k Mult y i systemet <strong>Notch</strong>D i figur 11.<br />

9


2 Litt teori om IIR-<strong>filter</strong> med mer.<br />

Dette er et noe stikkordspreget og kladdepreget notat over litt teorien fra<br />

<strong>signalbehandling</strong>en. Det er det en bør kunne for å få til denne øvinga.<br />

2.1 IIR-<strong>filter</strong><br />

Et IIR-<strong>filter</strong> er et <strong>filter</strong> med (teoretisk) uendelig impulsrespons. I praksis er det<br />

implementert nesten like enklet som et FIR-<strong>filter</strong>. Utgangen av et FIR-<strong>filter</strong> er<br />

vekta sum av inngangssignal ved dette og noen foregående tidspunkt.<br />

y(k) =<br />

N−1<br />

∑<br />

n=0<br />

For eksempel for et boxcar-<strong>filter</strong> med lengde 4<br />

b(n)x(k − n). (3)<br />

y(k) = x(k) + x(k − 1) + x(k − 2) + x(k − 3) (4)<br />

For et IIR-<strong>filter</strong> har en med ledd av foregående utganger også.<br />

y(k) =<br />

N−1<br />

∑<br />

n=0<br />

b(n)x(k − n) −<br />

M−1<br />

∑<br />

m=1<br />

a(m)y(k − m) (5)<br />

Merk at andre sum begynner med m = 1. Et eksempel på et IIR-<strong>filter</strong> er et<br />

AR(1)-<strong>filter</strong> (her med ρ = 0.95)<br />

y(k) = x(k) + 0.95y(k − 1) (6)<br />

Vi ser ganske enkelt at dette <strong>filter</strong>et vil få uendlig lang impulsrespons, selv<br />

om utgangsverdiene går mot null så vil de aldri bli helt like null. Dere stusser<br />

gjerne på minustegnet framfor det siste summetegnet i ligning 5. Ved å flytte<br />

summen over på venstre siden, og la a(0) = 1 kan en skrive<br />

M−1<br />

∑<br />

m=0<br />

a(m)y(k − m) = y(k) +<br />

M−1<br />

∑<br />

m=1<br />

a(m)y(k − m) =<br />

Nå kan en ta z-transform på begge sider og får<br />

som gir transferfunksjonen H(z).<br />

N−1<br />

∑<br />

n=0<br />

b(n)x(k − n) (7)<br />

A(z)Y (z) = B(z)X(z) (8)<br />

Y (z) = B(z) X(z) = H(z)X(z) (9)<br />

A(z)<br />

H(z) = Y (z)<br />

X(z) = B(z)<br />

A(z)<br />

(10)<br />

10


En har dermed at H(z) er en brøk med et polynom i telleren B(z) og et polynom<br />

i nevneren A(z). Røttene i tellerpolynomet gir nullpunkt og røttene i nevnerpolynomet<br />

gir poler. Implementering av IIR-<strong>filter</strong> står beskrevet i Proakis<br />

lærebok i <strong>signalbehandling</strong>. Også IIR-<strong>filter</strong> kan ofte (med fordel) implementeres<br />

som en kaskade av andreordensfaktorer. Da har en gjerne god kontroll<br />

over plassering av nullpunkt og poler. Nullpunkt og poler nær hverandre kan<br />

gjerne plasseres i samme blokk, og en får da ofte også ganske god kontroll over<br />

numeriske effekter (avrunding).<br />

2.2 Polplassering for IIR-<strong>filter</strong>.<br />

Et enkelt andreordens IIR-<strong>filter</strong> har form<br />

H(z) =<br />

b 0<br />

. (11)<br />

a 0 + a 1 z −1 + a 2 z−2 En kan multipisere med z 2 over og under brøkstreken og får ekvivalent form<br />

H(z) =<br />

b 0 z 2<br />

a 0 z 2 + a 1 z + a 2<br />

. (12)<br />

Polene til denne ligningen finnes tilsvarende som når vi fant nullpunkt for<br />

andreordens FIR-<strong>filter</strong> i øving 2. Poler er<br />

z 1,2 = 1 (<br />

)<br />

− a 1 ±<br />

√a 2 1 − 4a 0 a 2 (13)<br />

2a 0<br />

og radius og vinkelen er (når a 2 1 ≤ 4a 0 a 2 )<br />

r =<br />

√<br />

a0 a 2<br />

a 0<br />

, cos θ = −a 1<br />

2 √ a 0 a 2<br />

. (14)<br />

For å få stabilt <strong>filter</strong> må polene være innenfor enhetssirkelen, og det betyr at<br />

r < 1 og følgelig a 2 < a 0 , når a 0 og a 2 er positive.<br />

r < 1 ⇒ 0 ≤ a 2 < a 0 . (15)<br />

For et IIR-<strong>filter</strong> vil frekvensene nær polene forsterkes.<br />

2.3 <strong>Notch</strong>-<strong>filter</strong>.<br />

Et generelt andreordens IIR-<strong>filter</strong> har form<br />

H(z) = b 0 + b 1 z −1 + b 2 z −2<br />

a 0 + a 1 z −1 + a 2 z −2 = b 0z 2 + b 1 z + b 2<br />

a 0 z 2 + a 1 z + a 2<br />

. (16)<br />

11


Dette kan ganske direkte implementeres med heltallsaritmetikk når koeffisientene<br />

er heltall og a 0 = 2 k der k er et heltall.<br />

Hvis en ønsker at en skal ha verken dempning eller forsterkning ved en bestemt<br />

frekvens, ω 0 , må en justere størrelsen på koeffisientene slik at en får |H(e jω 0<br />

)| =<br />

1. Hvis ω 0 = 0 så får en da for <strong>filter</strong>et i ligning 16 at<br />

|H(e jω 0<br />

)| = |H(1)| = b 0 + b 1 + b 2<br />

a 0 + a 1 + a 2<br />

. (17)<br />

<strong>Notch</strong>-<strong>filter</strong> er et smalt båndstopp<strong>filter</strong>. Det har plassert et nullpunkt på enhetssirkelen<br />

ved frekvens som en ønsker å stoppe, og en pol like innenfor.<br />

Effekten er at for frekvenser et stykke fra nullpunkt (og pol) så vil nullpunkt<br />

og pol oppveie hverandre og en får tilnærmet ingen forsterkning eller demping<br />

for disse frekvenser.<br />

Med heltallskoeffisienter har en ikke full frihet, men kan likevel som regel få<br />

plassert nullpunkt og poler ganske nær ønskede posisjoner.<br />

En kan velge koeffisienter på ulike måter. Et eksempel kan være at en setter<br />

a 0 = 2 k , og så velger a 2 = a 0 − 2, b 0 = b 2 = a 0 − 1, og b 1 ≈ −2b 0 cos ω 0 . b 1 er<br />

da et heltall som gjør at nullpunktet kommer nær ønsket vinkel. Videre settes<br />

a 1 = b 1 og polen kommer da nokså nær nullpunktet, men innenfor.<br />

Eksempel med ω 0 = 10 grader og a 0 = 64 gir a 1 = −124, a 2 = 62, b 0 = 63,<br />

b 1 = −124, og b 2 = 63. Dette gir vinkel for nullpunkt 10.2222 grader, radius<br />

for nullpunkt 1, vinkel for pol 10.1821 grader og radius for pol 0.98425.<br />

Jeg har laget ei Matlab-fil, notch<strong>filter</strong>.m, som kan brukes for å finne et<br />

notch-<strong>filter</strong> med heltalls koeffisienter. En kan velge ulike måter å velge nullpunkt<br />

nær en pol. Det er ei ganske stor m-fil med flere muligheter, jeg tror<br />

det går greitt å bruke den ut fra hjelpeteksten (help notch<strong>filter</strong>). Men for<br />

å forstå det som gjøres må dere forstå teorien her, og også se i koden i m-fila.<br />

2.4 Eksempel<br />

Avstanden polen til enhetssirkelen styrer hvor smalt (spisst) notch-<strong>filter</strong>et er.<br />

Vi skal nå vise frekvensresponsen for noen ulike avstander mellom pol og enhetssirkel.<br />

Vi regner nå med flyttall, og setter r til radius for pol, og vinkel er<br />

162 grader. Matlab-kommandoene er:<br />

desibelplot=0;<br />

vinkel = 0.9*180; % gis i grader her<br />

figure(1);clf;<br />

hold on;<br />

colors=’bgrcmyk’;colorindex=1;<br />

12


a0=1; b0=1; b2=1;<br />

b1=-2*cos(pi*vinkel/180);<br />

b=[b0,b1,b2];<br />

for r=[0.995 0.98 0.95 0.9 0.8,0.5,0]<br />

a1=r*b1;<br />

a2=r*r;<br />

a=[a0,a1,a2];<br />

[H,F]=freqz(b,a,2048,’whole’);<br />

Ha=abs(H);<br />

if desibelplot<br />

Hl=20*log10(Ha+1e-8);<br />

plot(F/pi,Hl,[colors(colorindex),’-’]);<br />

else<br />

plot(F/pi,Ha,[colors(colorindex),’-’]);<br />

hand=plot(0.05,0.12*colorindex,[colors(colorindex),’o’]);<br />

set(hand,’MarkerFaceColor’,get(hand,’Color’));<br />

text(0.08,0.12*colorindex,[’ : r = ’,num2str(r)]);<br />

end<br />

colorindex = rem(colorindex,length(colors))+1;<br />

end<br />

grid on;<br />

xlabel(’Normalisert frekvens, 1 er f_N og 2 er f_s.’);<br />

title([’Frekvensrespons for <strong>Notch</strong>-<strong>filter</strong>, vinkel er ’,...<br />

num2str(vinkel),’ grader.’]);<br />

if desibelplot<br />

ylabel(’Amplitudeforsterkning i desibel.’);<br />

print(’-f1’,’-depsc2’,’lab08des’);<br />

V = [0.8, 1.2, -18, 2];<br />

axis(V);<br />

print(’-f1’,’-depsc2’,’lab08desz’);<br />

else<br />

V = [0, 2, 0, 2.5];<br />

axis(V);<br />

ylabel(’Amplitudeforsterkning med lineær skala.’);<br />

print(’-f1’,’-depsc2’,’lab08lin’);<br />

V = [0.8, 1.2, 0, 1.25];<br />

axis(V);<br />

print(’-f1’,’-depsc2’,’lab08linz’);<br />

end<br />

Les grunding gjennom Matlab-koden og prøv å forstå alle kommandoer. Kjør<br />

gjerne kommandoene selv, med andre vinkler og se resultatet. I figurene 14 til<br />

17 er resultatet når Matlab-kommandoene over kjøres.<br />

13


2.5<br />

Frekvensrespons for <strong>Notch</strong>−<strong>filter</strong>, vinkel er 162 grader.<br />

2<br />

Amplitudeforsterkning med lineær skala.<br />

1.5<br />

1<br />

0.5<br />

: r = 0<br />

: r = 0.5<br />

: r = 0.8<br />

: r = 0.9<br />

: r = 0.95<br />

: r = 0.98<br />

: r = 0.995<br />

0<br />

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2<br />

Normalisert frekvens, 1 er f N<br />

og 2 er f s<br />

.<br />

Figur 14: Frekvensrespons for et notch-<strong>filter</strong>.<br />

Frekvensrespons for <strong>Notch</strong>−<strong>filter</strong>, vinkel er 162 grader.<br />

1.2<br />

1<br />

Amplitudeforsterkning med lineær skala.<br />

0.8<br />

0.6<br />

0.4<br />

0.2<br />

0<br />

0.8 0.85 0.9 0.95 1 1.05 1.1 1.15 1.2<br />

Normalisert frekvens, 1 er f og 2 er f .<br />

N s<br />

Figur 15: Frekvensrespons for et notch-<strong>filter</strong>. Her er det zoom av det sentrale<br />

område i figur 14<br />

14


20<br />

Frekvensrespons for <strong>Notch</strong>−<strong>filter</strong>, vinkel er 162 grader.<br />

10<br />

0<br />

Amplitudeforsterkning i desibel.<br />

−10<br />

−20<br />

−30<br />

−40<br />

−50<br />

−60<br />

−70<br />

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2<br />

Normalisert frekvens, 1 er f N<br />

og 2 er f s<br />

.<br />

Figur 16: Frekvensrespons for et notch-<strong>filter</strong>.<br />

2<br />

Frekvensrespons for <strong>Notch</strong>−<strong>filter</strong>, vinkel er 162 grader.<br />

0<br />

−2<br />

Amplitudeforsterkning i desibel.<br />

−4<br />

−6<br />

−8<br />

−10<br />

−12<br />

−14<br />

−16<br />

−18<br />

0.8 0.85 0.9 0.95 1 1.05 1.1 1.15 1.2<br />

Normalisert frekvens, 1 er f og 2 er f .<br />

N s<br />

Figur 17: Frekvensrespons for et notch-<strong>filter</strong>. Her er det zoom av det sentrale<br />

område i figur 16<br />

15


<strong>MIK</strong> <strong>200</strong> <strong>Anvendt</strong> <strong>signalbehandling</strong>.<br />

<strong>Lab</strong>. 8, <strong>Notch</strong>-<strong>filter</strong>.<br />

Student 1<br />

Student 2<br />

Resultat:<br />

(fylles ut av faglærer) godkjent / ikke godkjent<br />

Egenvurdering:<br />

Mål for læringsutbytte er: Forstå teorien som er presentert som bakgrunn for<br />

oppgaven. Bruke og forstå de relevante Matlab-kommandoer. Lage, laste ned,<br />

kjøre og teste de systemene som skal lages i oppgaven.<br />

Dere skal også selv vurdere resultatet av det arbeidet dere har gjort i denne<br />

øvinga, ved selv å gi karakter på deres besvarelse. Karakterskala er den vanlige<br />

fra A (best) til E (dårligst) og F (stryk).<br />

Egenvurderingstabell Student 1 Student 2<br />

Læringsutbytte for teoridel, spørsmål 1-4.<br />

Læringsutbytte for FPGA-del, spørsmål 5-6.<br />

Læringsutbytte for FPGA-del, spørsmål 7-8.<br />

Resultat teoridel, spørsmål 1-4.<br />

Resultat FPGA-del, spørsmål 5-6.<br />

Resultat FPGA-del, spørsmål 7-8.<br />

Kommentarer:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!