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.
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: