Jelek és rendszerek · digitális jelfeldolgozás

FIR szűrő algoritmusa

Ebben a jegyzetben a FIR szűrőt nem „varázsdobozként”, hanem egy nagyon konkrét algoritmusként vezetem be: eltárolunk néhány korábbi bemeneti mintát, mindegyiket megszorozzuk egy-egy együtthatóval, majd összeadjuk a szorzatokat.

Alapképlet: y[n] = Σ b[k]x[n-k] Véges memória Nincs visszacsatolás Konvolúciós értelmezés

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], ...

Didaktikai kulcsmondat: a FIR algoritmus nem a jövőből olvas, hanem a jelenlegi és a már ismert múltbeli mintákból dolgozik. Ezért kauzális alakban valós időben is megvalósítható.

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:

y[n] = b[0]x[n] + b[1]x[n-1] + b[2]x[n-2] + ... + b[M-1]x[n-(M-1)]

Rövidebben összegzéssel:

y[n] = Σk=0M-1 b[k] · x[n-k]

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:

y[n] = (x * b)[n]

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.

  1. Beérkezik az új minta: legyen ez x[n].
  2. A korábbi minták egy hellyel hátrébb tolódnak: a rendszer megőrzi x[n-1], x[n-2], ... értékeket.
  3. Szorzások: minden eltárolt minta megszorzódik a hozzá tartozó együtthatóval.
  4. Összegzés: a szorzatokat összeadjuk.
  5. 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
Megjegyzés: a fenti pszeudokód pedagógiailag egyszerű. Hatékony programban gyakran körpuffert használunk, hogy ne kelljen minden mintánál fizikailag eltolni az egész tömböt.

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éterJelentésKövetkezmény
MSzűrőhossz, az együtthatók számaMinden kimeneti mintához kb. M szorzás és M-1 összeadás kell.
MemóriaTárolt múltbeli minták számaKb. M bemeneti minta tárolása szükséges.
KésleltetésA szűrés okozta időbeli eltolódásLineáris fázisú, szimmetrikus FIR esetén gyakran (M-1)/2 minta.
Stabilitás: FIR szűrő véges együtthatósorral BIBO-stabil, mert véges sok véges súlyú bemeneti értéket összegez. Ez a FIR szűrők egyik nagy gyakorlati előnye.

6. Kézi számolási példa

Legyen egy hárompontos mozgóátlag-szűrő:

b = [1/3, 1/3, 1/3]

Ez az aktuális és az előző két mintát átlagolja:

y[n] = (x[n] + x[n-1] + x[n-2]) / 3

Ha x = [3, 6, 9, 6, 3], és a hiányzó múltbeli mintákat nullának vesszük, akkor:

nx[n]Felhasznált mintáky[n]
033, 0, 01
166, 3, 03
299, 6, 36
366, 9, 67
433, 6, 96

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.