Diszkrét idejű szűrők

Innen: HamWiki
(FIR szűrő szócikkből átirányítva)

Alapok

A diszkrét idejű rendszerek 3 alapelem kombinációjából épülnek fel.

Digifeld-epito.gif

  • összeadó, amely a két bemenetére érkező értéket előjelesen összegzi. Azaz ki = be1 + be2
  • erősítő vagy más néven szorzó, amely egy előre konfigurált konstanssal szorozza a jelet. Azaz ki = konstans * be
  • késleltető, amely egyetlen ütemmel (nevezzük órajelnek) késleltetve helyezi a kimenetére (és tartja) a bemeneten levő jelet.

Ebből a hátom alapkomponensből épülnek fel fel a diszkrét idejű hálózatok.

Ezeknek a diszkrét idejű implementációknak számos előnyük van az analóg megoldásokhoz képest. Például:

  • pontosság
  • egyszerű, olcsó reprodukálhatóság - a szorzók konstansai könnyen reprodukálhatók.
  • hőmérsékletfüggetlen működés
  • nincs öregedési elhangolódásuk

FIR és IIR szűrő elrendezések

Nézzük meg a különbséget az alábbi ábrákon a FIR és az IIR szűrőelrendezés között. Első ránézésre látszik, hogy az IIR szűrőre a kimenetének késleltetett jele is vissza van vezetve, míg a FIR-nél csak a bemenőjel és annak késleltetésével operálunk.

  • FIR (Finite Impulse Response = véges impulzusválaszú), hiszen a késleltető számával történő késleltetés után a bemenetre adott impulzus már tuti nem hat az áramkörre, hiszen ez az impulzus az utolsó késleltetőt (=élvezérelt tárolót) is elhagyta.
  • IIR (Infinite Impulse Response = végtelen impulzusválaszú), hiszen a kimenet visszacsatoltja is beleszól a következő kimeneti állapotba.

És még néhány különbség:

Véges impulzusválaszú (FIR) szűrő
Végtelen impulzusválaszú (IIR) szűrő
Fázismenet: lineáris fázismenet mindig lehetséges nehezen kézbentartható, nem léteznek rá pontos módszerek
Stabilitás: mindig stabil, oszcillációmentes; tetszőleges mértékben bővíthető instabillá (gerjedővé) tervezhető, oszcillátor is létrehozható. Szűrőként gyakorlatban csak véges fokszám implementálható.
Ugyanolyan meredekséghez tartozó késleltetőszám: több kevesebb a rekurzió miatt
Története: nincs analóg megfelelője, sokfázisú (polyphase) analóg hálózatokkal közelíthető ez az elv. Analóg szűrők működési elvéből származtatható a működési elve.


Hogyan néz ki egy ilyen áramkör a gyakorlatban?

Alább két igen elterjedt és mint látható lesz, igen egyszerű megoldás lesz ismertetve. A bonyolultságát a tervezés során az erősítők együtthatóinak meghatározása jelenti. Ez dönti el ugyanis, hogy az adott X késleltetőt tartalmazó FIR vagy IIR szűrő valójában hogyan fog viselkedni.

Elöljáróban annyit megemlítve, hogy az áramkör leges leg elejére A/D átalakítót, a végére D/A átalakítót és aluláteresztő szűrőt téve, az egész rendszer bemenete analóg, a kimenete szintén analóg lesz.

Implementáció digitális logikai IC-kkel

Ahogy a fenti ábrán látható, az összeadó egy bináris összeadó, a szorzó egy bináris szorzó, a késleltető pedig például egy 74HC374-es digitális tároló IC. Mindezt ha egyetlen tokban szeretnénk implementálni, az FPGA, mint tetszőleges sorrendbe konfigurálható logikai kapukat tartalmazó ideális erre a célra.

Implementáció mikrovezérlővel illetve DSP-vel

A fenti rajzon látható logikát követve valósítható meg. A mostani bemenő minta és az előző eltárolt mintákból álló vektort szorozzuk össze a szorzók együtthatóinak vektorával, a részeredményeket pedig összegezzük. És FIR szűrő esetén már készen is van a kimenőjel. IIR szűrő esetén természetesen a kimenőjel előző állapotait tartalmazó vektorral szorozzuk össze a szorzók együtthatóinak vektorával és az eredményeit szintén összegezzük a kimenőjellel.

/*
  FIR szűrő konvolúciót megvalósító részlete
  Bemenetek:
     m: <konvhossz> hosszú minta vektor
     a: <konvhossz> hosszú együttható vektor
  Kimenet: a konvolúció eredménye
*/

float konvolval_fir(const float *m, const float *a, int konvhossz) {
    int i;
    float er=0;
    for (i=0; i<konvhossz; i++) er += m[i] * a[i];
    return er;
}

És nézzünk egy példát az IIR implementációra, ahol mint a fenti blokkvázlaton látható, nem csak az új minták, hanem a régebbi eredmények is meghatározzák az új eredményt.

/*
  IIR szűrő konvolúciót megvalósító részlete
  Bemenetek:
     m: <konvhossz> hosszú minta vektor
     a: <konvhossz> hosszú együttható vektor
     eredm: <konvhossz> hosszú előző eredményekből álló vektor
     b: <konvhossz> hosszú együttható vektor a visszacsatoláshoz
  Kimenet: a konvolúció eredménye
  A kimenetet ne felejtsük el a főprogramban az eredm vektorhoz hozzáilleszteni,
  hiszen az alábbi szűrő esetén felhasználjuk a következő számításhoz.
*/

float konvolval_iir(float short *m, const float *a, const float *eredm, const float *b, int konvhossz) {
    int i;
    float er=0;
    for (i=0; i<konvhossz; i++) er += m[i] * a[i]   +   eredm[i] * b[i];
    return er;
}

És hogy pontosan milyen feladatot lát el a szűrő, azt teljes mértékben az a illetve IIR elrendezés esetén az a és b vektorokban szereplő számértékek határozzák meg. Ezeknek az együtthatóknak a kiszámítására mi is vállalkozhatunk, azonban rengeteg program található az interneten, amely megadja nekünk a szükséges együtthatókat.

További érdekessége az implementációnak, hogy a törtszámok tárolására alkalmas float helyett gyakran olyan kisprocesszort alkalmazunk, amely sokkal gyorsabban képes egész (integer) értékekkel dolgozni. Ebben az esetben a fenti algoritmusokat célszerű úgy átdolgozni, hogy egész számokkal tudjon dolgozni.

A DSP-kben történő implementáláskor pedig számos, az adott architektúra által biztosított gyorsításra van lehetőségünk. Akár a hardveresen határolt ciklikus pufferek, akár a hosszabb eredmény tároló regiszterek (akkumulátorok), akár az egyidejűleg több szálon történő szorzást vagy szorzás+összegzés elemi műveletét nézzük.

Együtthatók meghatározása

  • interneten található sok-sok szűrőtervező program valamelyikével
  • A szabad szoftvereket tartalmazó Ubuntu disztribúcióban található octave-signal csomag fir1(), fir2() és filter() függvényeivel.

Alábbi példán az alapvető FIR szűrők együtthatóinak jelleggörbéje van ábrázolva. Megfigyelhető, hogy a magas frekvenciát átengedő szűrők középső együtthatója ellentétes irányban „kiugrik”, míg a magas tartományt eltipró aluláteresztő és sáváteresztő szűrők esetén szép oszcilláció figyelhető meg a pontok között.

FIR egyutthatok alulatereszto savatereszto.png

Megjegyzés: a fenti görbén a pontok számítanak, a pontok kizárólag azért lettek összekötve, hogy könnyebben tudjuk követni, melyik pont melyik pont után következik.

FIR egyutthatok feluatereszto savzaro.png

A gyakorlatban 128 együtthatós FIR szűrővel már szép eredmény érhető el, de gyakran még ennél több együtthatóval dolgozunk.