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.
x[n]b[k]x[n-k]y[n]y[n-1], y[n-2], ... visszamennek az összegzőbe.
Ez a rész adja az IIR szűrő lényegi különbségét a FIR szűrőhöz képest.
FIR és IIR gyors összehasonlítása
| FIR | IIR |
|---|---|
| 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:
Ha a[0] = 1, akkor az aktuális kimenet közvetlenül:
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.
| Jelölés | Jelentés | Algoritmikus szerep |
|---|---|---|
x[n] | aktuális bemeneti minta | új adat, amely éppen megérkezett |
x[n-k] | korábbi bemeneti minta | bemeneti késleltető memória |
y[n] | aktuális kimeneti minta | amit most kell kiszámítani |
y[n-k] | korábbi kimeneti minta | visszacsatolt kimeneti memória |
b[k] | előreági együtthatók | bemeneti minták súlyai |
a[k] | visszacsatolási együtthatók | korá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.
x[n].x késleltető sor elejére.Σ b[k]x[n-k].Σ a[k]y[n-k], de k=1-től, mert y[n] még ismeretlen.y[n]-t.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
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.
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.
5. Kézi példa: elsőrendű IIR simító
Vegyük a következő szűrőt:
Ez a differenciaegyenlet a standard alakban így írható:
Ha a bemenet egységugrás, vagyis x[n]=1 minden n≥0 esetén, és kezdetben y[−1]=0, akkor:
| n | Számítás | y[n] |
|---|---|---|
| 0 | 0.2·1 + 0.8·0 | 0.2000 |
| 1 | 0.2·1 + 0.8·0.2 | 0.3600 |
| 2 | 0.2·1 + 0.8·0.36 | 0.4880 |
| 3 | 0.2·1 + 0.8·0.488 | 0.5904 |
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
Aktuális minta számítása
Á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: haa[0]≠1, normalizálás szükséges.- Korai állapotfrissítés: az előző
yfelü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.
| Jelenség | Lehetséges ok |
|---|---|
| Kimenet egyre nagyobb | instabil vagy közel instabil pólus |
| Kimenet oszcillál | komplex póluspár, rezonancia |
| Kimenet túl lassan reagál | pólus közel az egységkörhöz |
| Zaj felerősödik | rossz 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.