Jelek és rendszerek · digitális szűrés

IIR szűrő algoritmusa

Ebben a magyarázatban az IIR szűrőt mint mintánként futó rekurzív algoritmust tárgyalom. A lényeg nem pusztán az, hogy a szűrő „konvolvál”, hanem az, hogy az aktuális kimenet kiszámításához a korábbi kimeneteket is visszacsatolja. Ezért az impulzusválasz elvileg végtelen hosszú lehet.

Cél: algoritmikus megértés Előfeltétel: diszkrét konvolúció, FIR képlet Fókusz: differenciaegyenlet, állapot, stabilitás

1. Mitől IIR az IIR?

Az IIR jelentése Infinite Impulse Response, azaz végtelen impulzusválasz. A név arra utal, hogy egyetlen bemeneti impulzus hatása nem feltétlenül tűnik el véges számú minta után. Ennek oka a visszacsatolás: a szűrő a saját korábbi kimeneteit is felhasználja.

bemenet
x[n]
előreág
b[k]x[n-k]
összegzés
y[n]
Kritikus pont: a „végtelen impulzusválasz” nem azt jelenti, hogy a számítógép végtelen sok műveletet végez. Az algoritmus minden mintánál véges számú szorzást és összeadást végez, de a visszacsatolt állapot miatt a múlt hatása elvileg korlátlan ideig megmaradhat.

FIR és IIR gyors összehasonlítása

FIRIIR
Csak bemeneti múltat használ.Bemeneti és kimeneti múltat is használ.
y[n]=Σ b[k]x[n-k]y[n]=Σ b[k]x[n-k]−Σ a[k]y[n-k]
Nincs visszacsatolás.Van visszacsatolás.
Impulzusválasz véges hosszú.Impulzusválasz elvileg végtelen hosszú.
Lineáris fázis könnyebben tervezhető.Adott meredekség gyakran kisebb renddel elérhető.
Stabilitás kauzális FIR-nél automatikus.Stabilitást ellenőrizni kell.

2. Az IIR szűrő differenciaegyenlete

A digitális IIR szűrő leggyakoribb alakja a következő lineáris, állandó együtthatós differenciaegyenlet:

a[0]·y[n] = b[0]·x[n] + b[1]·x[n−1] + ... + b[M]·x[n−M] − a[1]·y[n−1] − a[2]·y[n−2] − ... − a[N]·y[n−N]

Ha a[0] = 1, akkor az aktuális kimenet közvetlenül:

y[n] = Σk=0..M b[k]·x[n−k] − Σk=1..N a[k]·y[n−k]

Ha a[0] ≠ 1, akkor minden együtthatót normalizálni kell: b[k] := b[k]/a[0], a[k] := a[k]/a[0], majd a[0] helyére 1 kerül.

A képlet balról jobbra olvasva: „Az új kimenet az aktuális és régi bemenetek súlyozott összege, mínusz a régi kimenetek súlyozott összege.”
JelölésJelentésAlgoritmikus szerep
x[n]aktuális bemeneti mintaúj adat, amely éppen megérkezett
x[n-k]korábbi bemeneti mintabemeneti késleltető memória
y[n]aktuális kimeneti mintaamit most kell kiszámítani
y[n-k]korábbi kimeneti mintavisszacsatolt kimeneti memória
b[k]előreági együtthatókbemeneti minták súlyai
a[k]visszacsatolási együtthatókkorábbi kimenetek súlyai

3. Mintánkénti algoritmus

A számítógép nem „rajzolja fel” előre a teljes jelet. Minden új bemeneti mintára ugyanazt a rövid algoritmust futtatja.

Új minta beolvasása: megérkezik x[n].
Bemeneti memória frissítése: az új minta bekerül az x késleltető sor elejére.
Előreági összeg: kiszámítjuk Σ b[k]x[n-k].
Visszacsatolt összeg: kiszámítjuk Σ a[k]y[n-k], de k=1-től, mert y[n] még ismeretlen.
Kimenet: a kettőből megkapjuk y[n]-t.
Kimeneti memória frissítése: az új y[n] bekerül a kimeneti késleltető sorba.

Általános pszeudokód

Az alábbi alak feltételezi, hogy az együtthatók normalizálva vannak, tehát a[0]=1.

// b[0..M] : előreági együtthatók
// a[0..N] : visszacsatolási együtthatók, a[0] = 1
// xHist[k] = x[n-k]
// yHist[k] = y[n-k], de yHist[1] az előző kimenet

function processSample(xNew):
    shiftRight(xHist)
    xHist[0] = xNew

    acc = 0

    for k = 0..M:
        acc += b[k] * xHist[k]

    for k = 1..N:
        acc -= a[k] * yHist[k]

    yNew = acc

    shiftRight(yHist)
    yHist[1] = yNew

    return yNew
Fontos: a yHist frissítése csak azután történhet, hogy yNew kiszámítása befejeződött. Ha túl korán írjuk felül az előző kimenetet, hibás rekurziót kapunk.

4. Direct Form I: külön bemeneti és kimeneti memória

Oktatási célra ezt az alakot tartom a legátláthatóbbnak. Két késleltető sort vezetünk: egyet a bemeneti mintákhoz, egyet a kimeneti mintákhoz.

xHist = [x[n], x[n−1], x[n−2], ...] yHist = [y[n], y[n−1], y[n−2], ...]

Előnye, hogy pontosan látszik, melyik tag honnan származik. Hátránya, hogy nem ez a legmemóriatakarékosabb forma.

Direct Form II és transzponált alak

Gyakorlati DSP rendszerekben gyakori a Direct Form II vagy annak transzponált változata, mert kevesebb állapotváltozót igényelhet. Numerikusan azonban nem minden alak viselkedik egyformán.

Kritikus mérnöki megjegyzés: lebegőpontos vagy fixpontos implementációban a kerekítési hibák, túlcsordulás és kvantálás miatt ugyanaz az átviteli függvény különböző struktúrákban eltérő numerikus minőséget adhat.

5. Kézi példa: elsőrendű IIR simító

Vegyük a következő szűrőt:

y[n] = 0.2·x[n] + 0.8·y[n−1]

Ez a differenciaegyenlet a standard alakban így írható:

y[n] = b[0]·x[n] − a[1]·y[n−1], ahol b[0]=0.2 és a[1]=−0.8

Ha a bemenet egységugrás, vagyis x[n]=1 minden n≥0 esetén, és kezdetben y[−1]=0, akkor:

nSzámításy[n]
00.2·1 + 0.8·00.2000
10.2·1 + 0.8·0.20.3600
20.2·1 + 0.8·0.360.4880
30.2·1 + 0.8·0.4880.5904
Az eredmény lassan közelíti az 1-et. Itt látszik a rekurzió: az új kimenet a régi kimenetből „örököl” információt.

6. Interaktív IIR algoritmusdemó

A demó mintánként kiszámítja a kimenetet. A koefficienseket vesszővel elválasztva kell megadni. Az a sorban az első szám az a[0]; ha nem 1, a program belsőleg normalizál.

Jelalakok

x[n] y[n] 0-szint

Aktuális minta számítása

Előreági rész
Visszacsatolt rész
Eredmény

Állapotmemória

Kimeneti sorozat

7. Tipikus hallgatói hibák

  • Előjelhiba: az a[k] tagokat nem kivonni kell a standard képlet szerint.
  • a[0] elfelejtése: ha a[0]≠1, normalizálás szükséges.
  • Korai állapotfrissítés: az előző y felülírása a számítás előtt hibás eredményt ad.
  • FIR-szerű gondolkodás: IIR-nél nem elég csak a bemenetek múltját tárolni.
  • Stabilitás figyelmen kívül hagyása: nem minden visszacsatolás stabil.
  • Kezdeti feltételek elhanyagolása: a késleltetők kezdeti értéke befolyásolja a tranzienst.

Stabilitási megjegyzés

Egy kauzális, racionális IIR szűrő BIBO-stabilitásának klasszikus feltétele, hogy a pólusok az egységkörön belül legyenek. Algoritmikus nyelven ez azt jelenti, hogy a visszacsatolt memória nem erősítheti végtelenre a jelet korlátos bemenet mellett.

A mintánkénti szimuláció hasznos diagnosztikai eszköz, de önmagában nem teljes stabilitásbizonyítás. Ha az első néhány minta nem nő, attól még egy rosszul választott szűrő később numerikusan problémás lehet.
JelenségLehetséges ok
Kimenet egyre nagyobbinstabil vagy közel instabil pólus
Kimenet oszcillálkomplex póluspár, rezonancia
Kimenet túl lassan reagálpólus közel az egységkörhöz
Zaj felerősödikrossz sávkarakterisztika vagy numerikus érzékenység

8. Ellenőrző kérdések

Mi a fő algoritmikus különbség FIR és IIR között?

FIR csak korábbi bemeneteket használ. IIR korábbi bemeneteket és korábbi kimeneteket is használ, tehát rekurzív.

Miért szerepel a képletben k=1-től a visszacsatolt összeg?

Mert y[n] az ismeretlen aktuális kimenet. A visszacsatolásban csak már ismert korábbi kimenetek lehetnek: y[n−1], y[n−2], ....

Mi történik, ha a[0] nem 1?

A teljes egyenletet el kell osztani a[0]-val. Enélkül a kimenet skálája hibás lesz.

Miért lehet egy IIR szűrő instabil?

Mert a visszacsatolás a korábbi kimeneteket újra és újra visszavezeti. Ha ez a visszacsatolt dinamika túl erős, korlátos bemenet mellett is növekvő kimenet keletkezhet.

Miért nem végtelen számítás az IIR?

Az impulzusválasz lehet elvileg végtelen, de az algoritmus egy adott mintára csak véges számú tárolt múltbeli mintát és véges számú együtthatót használ.

9. Rövid oktatási összegzés

Én az IIR algoritmust nem elsőként átviteli függvényként, hanem állapotfrissítő eljárásként érdemes bemutatnom: új bemenet → késleltetők → súlyozott összeg → új kimenet → kimeneti memória frissítése. Így a hallgató látja, hogy a visszacsatolás nem absztrakt fogalom, hanem konkrét memóriahozzáférés a kódban.

A legfontosabb mondat: az IIR szűrő azért rekurzív, mert a mostani kimenet kiszámításához a korábbi kimeneteket is felhasználja.