1. A lényeg egy mondatban
A FIR szűrő minden kimeneti mintát a jelenlegi és néhány korábbi bemeneti minta súlyozott összegeként állít elő.
Input
A bemeneti jelsorozat: x[0], x[1], x[2], ...
Együtthatók
A szűrő impulzusválasza: b[0], b[1], ..., b[M-1]
Output
A kimeneti jelsorozat: y[0], y[1], y[2], ...
A „FIR” rövidítés jelentése Finite Impulse Response, azaz véges impulzusválasz. Ha a bemenetre egy egységimpulzust adunk, akkor a kimenet csak véges számú mintán keresztül nem nulla. Ez lényegében azért van, mert a képletben csak véges számú együttható szerepel.
2. Matematikai képlet
Egy M hosszú FIR szűrő általános, kauzális alakja:
Rövidebben összegzéssel:
Mit jelent x[n-k]?
A bemenet k mintával korábbi értékét. Például x[n-2] az aktuális időponthoz képest két mintával korábbi bemenet.
Mit jelent b[k]?
A k-adik súly. Ez mondja meg, hogy az adott múltbeli minta mennyire járul hozzá az aktuális kimenethez.
Konvolúciós nézőpontból a FIR szűrő kimenete a bemenet és az impulzusválasz konvolúciója:
Kritikusan fontos különbséget tenni: a konvolúciós képlet elméleti leírás, a FIR algoritmus pedig ennek közvetlen számítógépes vagy hardveres végrehajtása.
3. Algoritmus lépésenként
Az algoritmus minden új bemeneti mintára ugyanazt a műveletsort hajtja végre.
- Beérkezik az új minta: legyen ez
x[n]. - A korábbi minták egy hellyel hátrébb tolódnak: a rendszer megőrzi
x[n-1],x[n-2], ... értékeket. - Szorzások: minden eltárolt minta megszorzódik a hozzá tartozó együtthatóval.
- Összegzés: a szorzatokat összeadjuk.
- Megkapjuk az aktuális kimenetet: az összeg lesz
y[n].
for each new sample x[n]:
delay[0] = x[n]
y[n] = 0
for k = 0 ... M-1:
y[n] = y[n] + b[k] * delay[k]
shift delay line to prepare for next sample
4. Blokkdiagram: késleltetések, szorzók, összegző
A FIR szűrő klasszikus szerkezete egy késleltetőlánc és több leágazás. A z⁻¹ elem egy mintányi késleltetést jelent.
Az ábra alapján az elnevezések is természetesek: az együtthatókat sokszor tap-eknek, a mintákat tároló láncot pedig delay line-nak nevezik.
5. Implementáció: egyszerű tömb és körpuffer
Egyszerű, oktatási implementáció
Előnye: átlátható. Hátránya: minden mintánál eltolja a teljes késleltetőláncot.
// b: FIR együtthatók
// delay: korábbi minták
function firStep(x_new):
for k = M-1 downto 1:
delay[k] = delay[k-1]
delay[0] = x_new
y = 0
for k = 0 to M-1:
y += b[k] * delay[k]
return y
Hatékonyabb körpufferes implementáció
Előnye: nincs teljes tömbeltolás. A fejmutató jelzi, hová kerül az új minta.
function firStep(x_new):
writeIndex = (writeIndex - 1 + M) mod M
buffer[writeIndex] = x_new
y = 0
index = writeIndex
for k = 0 to M-1:
y += b[k] * buffer[index]
index = (index + 1) mod M
return y
Számítási igény
| Paraméter | Jelentés | Következmény |
|---|---|---|
M | Szűrőhossz, az együtthatók száma | Minden kimeneti mintához kb. M szorzás és M-1 összeadás kell. |
| Memória | Tárolt múltbeli minták száma | Kb. M bemeneti minta tárolása szükséges. |
| Késleltetés | A szűrés okozta időbeli eltolódás | Lineáris fázisú, szimmetrikus FIR esetén gyakran (M-1)/2 minta. |
6. Kézi számolási példa
Legyen egy hárompontos mozgóátlag-szűrő:
Ez az aktuális és az előző két mintát átlagolja:
Ha x = [3, 6, 9, 6, 3], és a hiányzó múltbeli mintákat nullának vesszük, akkor:
| n | x[n] | Felhasznált minták | y[n] |
|---|---|---|---|
| 0 | 3 | 3, 0, 0 | 1 |
| 1 | 6 | 6, 3, 0 | 3 |
| 2 | 9 | 9, 6, 3 | 6 |
| 3 | 6 | 6, 9, 6 | 7 |
| 4 | 3 | 3, 6, 9 | 6 |
Ez a példa jól mutatja, hogy a mozgóátlag simít: a gyors változásokat mérsékli, de cserébe időbeli elkenést is okoz.
7. Interaktív demó
A demóban a bemeneti mintasorozat és a FIR együtthatók módosíthatók. Az ábra az aktuális lépésnél kiemeli, mely minták vesznek részt y[n] kiszámításában.
Aktuális számítás
Kimeneti sorozat
8. Tipikus hallgatói hibák
1. A késleltetés irányának eltévesztése
Hibás intuíció: x[n-k] jövőbeli mintát jelent.
Helyes: ha k > 0, akkor x[n-k] múltbeli minta.
2. Az együtthatók és a bemenet összekeverése
A b[k] nem a bemenet része, hanem a szűrő paramétere. A szűrő karakterét az együtthatók határozzák meg.
3. A peremfeltételek kihagyása
A sorozat elején nincs még x[-1], x[-2]. Oktatási példában ezeket gyakran nullának vesszük.
4. FIR és IIR összemosása
FIR esetén nincs visszacsatolt kimeneti tag, például nincs a[1]y[n-1]. Ilyen tag már IIR-szerkezetre utal.
9. Ellenőrző kérdések
Miért véges impulzusválaszú egy FIR szűrő?
Mert csak véges sok együtthatója van. Egységimpulzus bemenet esetén a kimenet legfeljebb az együtthatósor hosszáig lehet nem nulla.
Mit számít a y[n] = b[0]x[n] + b[1]x[n-1] szűrő?
Az aktuális bemeneti minta és az egy mintával korábbi bemeneti minta súlyozott összegét.
Miért nem kell korábbi kimeneti mintákat tárolni az alap FIR algoritmushoz?
Mert a kimenet csak bemeneti mintáktól és fix együtthatóktól függ. Korábbi kimeneti minták használata visszacsatolást jelentene.
Mi a mozgóátlag-szűrő fő hatása?
Simítja a jelet: csökkenti a gyors ingadozásokat, de időbeli elkenést és késleltetést okozhat.