Digitális szűrők megvalósítása a NI FPGA-k segítségével MMTL F2 A gyakorlat célja a digitális szűrők, valamint azok megvalósítási módjának megismerése. Számolás fixpontos számokkal A programozás során legelterjedtebb számformátumok az egész számok, valamint a lebegőpontos számok. Utóbbiak előnye, hogy nem csak egész számokat tudnak ábrázolni, így komoly szerepük van jelfeldolgozási feladatok közben. Hátrányuk viszont, hogy a velük végzett műveletek komoly erőforrásokat igényelnek, e mellett számos platform nem, vagy csak nagyon korlátozottan támogatja felhasználásukat. Éppen ezét, amennyiben beágyazott rendszereken szeretnénk jeleket feldolgozni, találkozni fogunk a fixpontos számok fogalmával [1, 2]. 1. ábra: Lebegőpontos és fixpontos számok összehasonlítása A fixpontos számok egy egészrészt valamint egy törtrészt tartalmaznak. A szám deklarálásakor dönthetjük el, hogy mekkora az egész rész és a törtrész bithossza. A két rész összege tipikusan 8, 16, 32 vagy 64 bit lehet, azonban vannak olyan platformok (pl. FPGA), melyek tetszőleges bithosszt támogatnak. Fixpontos számok esetén a számokat a feldolgozó egység (processzor, FPGA) egész számként kezeli a számokat, és csak a fordító (valamint a programozó) foglalkozik azzal, hogy éppen hol van a tizedes pont. Ennek köszönhetően a fixpontos számokkal végzett számolások nagyságrendekkel kevesebb időt és/vagy erőforrást igényelnek, mint a lebegőpontos számok. A NI FPGA alapú eszközei, bár korlátozottan támogatják a lebegőpontos számokat (egyszeres pontosságúakat), jelfeldolgozási célokra fixpontos számokat célszerű használni. LabVIEW esetén a fixpontos számokat a következő paraméterekkel tudjuk felkonfigurálni: Word length: teljes szóhosszúság (egészrész + törtrész) Integer word length: egészrész hossza Signd/unsigned: előjeles vagy előjel nélküli szám (a negatív számok kettes komplemens alakban vannak tárolva) Include overflow status: a fixpontos szám egy extra biten tárolni fogja, hogy történt-e túlcsordulás a számolások közben A megadott paraméterek alapján a LabVIEW kiszámolja, hogy mi az ábrázolható számtartomány (Minimum, Maximum), valamint az aktuális felbontás (Delta). FPGA analóg bemenetek és kimenetek tipikusan a <±,20,5> adattípust használják, ami egy előjeles 20 bit-
es fixpontos számot jelöl, melynek egészrésze 5 bit-es. Ezzel az adattípussal a ±10 V-os mérési tartomány kényelmesen lefedhető 30 µv felbontással. 2. ábra: Fixpontos adattípus konfigurálása a Properties menü segítségével Fixpontos számokon végzett műveletek közben az alapműveleteket végző node-ok automatikusan adaptálják magukat a forrás adatokhoz, szükség esetén bővítve a végeredmény méretét, hogy ne történhessen túlcsordulás. Amennyiben ez a végeredmény nem felel meg számunkra, pl. nem akarjuk tovább növelni az adatméretet, akkor azt manuálisan is tudjuk konfigurálni, megadva a kívánt formátumot, a kerekítés módját, valamint, hogy túlcsordulás esetén mi legyen az alapértelmezett viselkedés. Amennyiben nem az alapértelmezett formátumot választjuk, a művelet végén egy kék pötty jelöli a típuskonverziót. Megjegyzés: ha egy művelet végén egy piros pötty jelenik meg, az azt jelöli, hogy az eredmény túllépné a 64 bit-et, így a LabVIEW egy automatikus típuskonverziót kénytelen végrehajtani. 3. ábra: A műveletek eredményének konfigurálása (adattípus, kerekítés és szaturációs mód) Amikor fixpontos számokat konvertálunk egész számokká, két fő funkcióra lehet szükségünk. Az egyik, amikor a fixpontos szám egészre kerekített értékére vagyunk kíváncsiak. Ez a konverzió történhet automatikusan, implicit castolással, vagy expliciten, a Numeric/Conversion paletta segítségével. Ugyanakkor sokszor az összes olyan bitre kíváncsiak vagyunk, melyek a fixpontos számot alkották, a végeredményt egész szám
alakjában szeretnénk feldolgozni. Erre a feladatra a Numeric/Fixed point/fixed Point to Integer Cast funkciót használhatjuk. A művelet fordítottját valósítja meg az Integer to Fixed Point Cast funkció. Utóbbit konfigurálhatjuk manuálisan, a Properties menü segítségével, vagy a függvény középső bemenetére adott minta segítségével. A megfelelő erőforrás-felhasználás szempontjából célszerű a fixpontos adattípusokat a lehető legkisebb nagyságon tartani. Ellenkező esetben a számolások FPGA esetén túlzottan sok FPGA felületet fognak igényelni, megnő a fordítási idő, illetve szélsőséges esetén le sem fordul a kód. Digitális szűrők Az analóg szűrők analógiájára, digitális jelek feldolgozásakor rendszeresen használunk digitális szűrőket. Bár a szűrők átvitele hasonló karakterisztikájú, lényeges különbség, hogy a digitális szűrők mintavételezett jelekkel dolgoznak, így azok karakterisztikáját a mintavételezési tétel határolja be. Ennek megfelelően az analóg szűrők 0 és végtelen frekvencia közötti karakterisztikáját le kell képezni a 0 és f s /2 (mintavételi frekvencia fele) tartományba. Ezt a transzformációt a bilineáris transzformációval végezhetjük el [3, 4]. Az analóg szűrőkhöz hasonlóan a digitális szűrők átvitelét a következő formulával adhatjuk meg: H(s) = Y(s) X(s) ahol Y(s): szűrő kimenete, X(s): szűrő bemenete. Két fő digitális szűrő elrendezést használnak a gyakorlatban: FIR (Finite Impulse Response) szűrők, melyekben nincs visszacsatolás. Felépítésük bonyolult, számos tagot tartalmaznak (taps), cserében stabilak, nem érzékenyek a numerikus megvalósítás esetleges pontatlanságaira. IIR (Infinite Impulse Response) szűrők, melyekben van visszacsatolás, megfeleltethetők az analóg szűrőknek, egyszerű felépítésűek, ugyanakkor érzékenyek a kvantálási hibákra és numerikus pontatlanságokra. Az IIR szűrők megvalósítása a következő képlettel történik [5, 6]: P y[n] = b k x[n k] a k y[n k] k=0 ahol x[n] a szűrő bemenete, y[n] a szűrő kimenete, a k és b k a szűrők együtthatói. Megjegyzés: az irodalomban az a k és b k együtthatók szerepét sokszor felcserélik [7], valamint az a k együtthatók előjelét néha ellenkező előjellel értik [8]. A másodfokú IIR szűrő megvalósításának módja a 4. és 5. ábrán látható. Magasabb fokú szűrőket általában másodfokú szűrők kaszkádba kapcsolásával valósítanak meg. Q k=1
4. ábra: Másodfokú IIR szűrő megvalósítása [9] 5. ábra: Másodfokú IIR szűrő alternatív megvalósítása. Ez az elrendezés kevesebb erőforrást igényel, azonban érzékenyebb a kerekítési hibákra, valamint könnyebben szaturálódik. [9] Elsőfokú digitális szűrő paraméterezése Egy elsőfokú aluláteresztő szűrő átviteli függvénye a következő: Ω c H(s) = s + Ω c ahol: Ω c = tg (π f c f s ), f c a szűrő levágási frekvenciája, f s pedig a mintavételi frekvencia. Az együtthatók a következő képletekkel számolhatók: Ω c b 0 = b 1 = 1 + Ω c a 1 = Ω c 1 1 + Ω c Felüláteresztő szűrő esetén a különbség, hogy b 1 = b 0. A [4] irodalomban egy ettől kissé eltérő számolás található, azonban a számolások végeredménye megegyezik egymással, így mindkét módszer egyformán használható: l = ctg (π f c f s ) b 0 = b 1 = A 0 1 + l a 1 = 1 l 1 + l
Az [5] irodalomban szintén egy eltérő számolás található, mely bár egyszerűbb szűrőt eredményez, magasabb frekvenciákon a frekvenciamenet már lényegesen különbözik, nem felel meg a bilineáris transzformáció követelményeinek. q = e 2π f c fs b 0 = 1 q b 1 = 0 a 1 = q Felüláteresztő szűrő esetén pedig: b 0 = 1+q 2 = b 1. Magasabbfokú szűrők paraméterezése Magasabb fokú szűrők esetén már nem csak a levágási frekvencia érdekes, hanem sokkal több paraméterrel hangolhatjuk szűrőnket, hogy az a lehető legjobban kövesse az általunk kívánt frekvenciamenetet. 6. ábra: Aluláteresztő szűrő karakterisztikája és legfontosabb paraméterei Az analóg szűrők analógiájára számos tervezési elvet követhetünk, többek között a következőket [10]: Bessel szűrő: igen gyengén vág, cserében mind az áteresztési, mind a szűrési sáv teljesen sima, egyenletes fázisátmenettel. Butterworth szűrő: mind az áteresztési, mind a szűrési sávban lineáris karakterisztikájú, de meredekebben vág, mint a Bessel szűrő Chebysev szűrő: meredekebben vág, mint a butterworth szűrő, azonban az áteresztési sáv nem egyenes, hanem hullámokat tartalmaz. Inverz Chebysev szűrő: a hullámokat nem az áteresztési sávban, hanem a szűrési sávban tartalmazza Elliptikus szűrő: mindkét sávban tartalmaz hullámokat, azonban azonos fokszám esetén ez a szűrő vág a legmeredekebben. Magasabbfokú digitális szűrőket leginkább szűrőtervező segédprogramokkal tervezünk, melyek a megadott paraméterek alapján előállítják a kívánt tulajdonságokkal rendelkező szűrő paramétereit. Ilyen segédeszközöket tartalmaz többek között a MATLAB DSP System Toolbox-a, valamint a LabVIEW Filter Design Toolkit-je. Utóbbi a Signal Processing/Digital Filter Design palettán érhető el. Ugyancsak hasznos eszközök vannak a Signal Processing/Filters palettán, mely az alap LabVIEW-ban is elérhető.
7. ábra: Digitális szűrő tervezése a LaBIEW Classical Filter Design Express VI segítségével 8. ábra: Másodfokú láncszűrőkből álló összetett szűrő tervezése és a koefficiensek kiszámolása A 8. ábrán látható, hogy hogyan lehet kinyerni a szűrők paramétereit a LabVIEW Filter Design Toolkit használatával. Az Express VI helyett, hogy ha egy megadott típusú és fokú szűrőre van szükségünk, használhatjuk a Design/IIR palettán található VI-okat is. Szűrők megvalósítása FPGA-n Amennyiben valós időben szeretnénk digitális szűrőket megvalósítani, akkor vagy egy digitális jelporcesszor (DSP) vagy egy FPGA alapú rendszerre van szükségünk. A crio rendszerben utóbbira van lehetőség, mégpedig egyszerűen, LabVIEW-ból programozható módon. A digitális szűrő megvalósításakor az analóg bemeneteken mért jeleket digitalizáljuk, majd használjuk bemenetként a digitális szűrőben. Az eredményt egy analóg kimenetre tudjuk kiírni. A megvalósítás során érdemes figyelni a mérési tartományokra (tipikusan ± 10 V), valamint az adattípusra (<±,20,5>). Egy egyszerű példa van a 9. ábrán, ahol a kérdőjellel megjelölt doboz a feladatban megvalósítandó szűrő kódja (a paraméterek száma sem feltétlenül pont négy).
9. ábra: Az FPGA szűrő megvalósításának váza A szűrő paramétereinek kiszámolását célszerű a számítógépre bízni, így az akár menet közben is frissíthető (újrafordítás nélkül), amennyiben változtatni kell a paramétereket. Az FPGA-n futó VI előlapján lévő elemeket az FPGA interface palettán lévő elemekkel lehet elérni, a 10. ábrának megfelelően. Az Open FPGA VI Reference VI-t használat előtt fel kell konfigurálni, ki kell választani a megfelelő, az FPGA targeten futó VI-t. 10. ábra: Az FPGA program paramétereinek beállítása a számítógépről Digitális szűrők tesztelése Az elkészített szűrőt több féle módon is lehet tesztelni. Egyrészt, a kiszámolt paraméterek alapján PC-n is implementálhatunk egy szűrőt, melynek átvitelit egyszerűen megmérhetjük a 11. ábrán látható program segítségével. 11. ábra: Digitális szűrő átviteli függvényének mérése Magát, az FPGA-n lévő szűrőalgoritmust (pl. fixpontos számolás) is tudjuk tesztelni a számítógépen, ugyanazokat a funkciókat használva. Amennyiben valamilyen speciális, csak
FPGA-n lévő műveletet is felhasználtunk (pl. FPGA Math palettán lévő elemeket), akkor is lehetőségünk van az FPGA programot fordítás nélkül, a számítógépen lefuttatni és tesztelni. Ekkor az I/O változók értékét egy speciális VI segítségével tudjuk leszimulálni [12, 13]. Amennyiben a szűrő valódi hardveren fut, akkor vizsgálhatjuk, hogy különböző jelalakokra milyen válaszjeleket adnak (pl. négyszögjel esetén felfutási idő, túllövés, ), valamint átviteli karakterisztikáját (amplitúdó, fázisszög). Átviteli függvény mérése PicoScope segítségével A PicoScope számára elkészült egy LabVIEW program, amelyik a PicoScope segítségével alkalmas az átviteli függvény mérésére (PicoScope-TransferFunction). A helyes működéshez előfordulhat, hogy a könyvtárban lévő DLL fájlokat be kell másolni a következő helyre: C:\Program Files (x86)\national Instruments\LabVIEW 2014\resource\ Irodalom 12. ábra: Az átviteli függvényt mérő szoftver képe [1] IP Corner: The LabVIEW Fixed-Point Data Type Part 1 Fixed-Point 101, elérhető: http://www.ni.com/newsletter/50303/en/ [2] IP Corner: The LabVIEW Fixed-Point Data Type Part 2 Working with Fixed-Point, elérhető: http://www.ni.com/newsletter/50363/en/ [3] Schnell szerk.: Jelek és rendszerek méréstechnikája, Műszaki Könyvkiadó, Budapest, 1985. [4] Tietze, U.-Schenk, Ch.: Analóg és digitális áramkörök, Műszaki Könyvkiadó, 1990. [5] Digital Filter Design - Chapter 3: Infinite Impulse Response (IIR) Filters, elérhető: http://www.mikroe.com/chapters/view/73/chapter-3-iir-filters/ [6] Nagy Gergely: Digitális szűrők megvalósítása mikrovezérlőkkel, elérhető: http://www.eet.bme.hu/~nagyg/elektronika/05_digfilt.pdf
[7] The Scientist and Engineer's Guide to Digital Signal Processing - Chapter 19: Recursive Filters, elérhető: http://www.dspguide.com/ch19/2.htm [8] Lecture notes: IIR Filters: elérhető: http://www.eas.uccs.edu/wickert/ece2610/lecture_notes/ece2610_chap8.pdf [9] Wikipedia: Digital filter, elérhető: http://en.wikipedia.org/wiki/digital_filter [10] Szabó Ádám: 32-bites mikrovezérlőn alapuló zajgenerátor megvalósítása (szakdolgozat) [11] Quality Factor and Filter Design Parameters, elérhető: http://analogfilter.blogspot.hu/2008/08/quality-factor.html [12] Testing and Debugging LabVIEW FPGA Code, elérhető: http://www.ni.com/tutorial/51862/en/ [13] Creating a Custom VI to Simulate I/O (FPGA Module), elérhető: http://zone.ni.com/reference/en-xx/help/371599k- 01/lvfpgaconcepts/creating_test_benches/
Támogatók A kutatás a TÁMOP-4.2.4.A/2-11/1-2012-0001 azonosító számú Nemzeti Kiválóság Program Hazai hallgatói, illetve kutatói személyi támogatást biztosító rendszer kidolgozása és működtetése konvergencia program című kiemelt projekt keretében zajlott. A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszírozásával valósul meg. A kutatási program címe: Zajok és véletlen jelenségek interdiszciplináris területeken való alkalmazásának kutatása és oktatása.