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 összehaso nlí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 𝑓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: 𝐻(𝑠) =
𝑌(𝑠) 𝑋(𝑠)
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]: 𝑃
𝑄
𝑦[𝑛] = ∑ 𝑏𝑘 ∙ 𝑥[𝑛 − 𝑘] − ∑ 𝑎𝑘 ∙ 𝑦[𝑛 − 𝑘] 𝑘=0
𝑘=1
ahol 𝑥[𝑛] a szűrő bemenete, 𝑦[𝑛] a szűrő kimenete, 𝑎𝑘 és 𝑏𝑘 a szűrők együtthatói. Megjegyzés: az irodalomban az 𝑎𝑘 és 𝑏𝑘 együtthatók szerepét sokszor felcserélik [7], valamint az 𝑎𝑘 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.
4.
5.
ábra: Másodfokú IIR szűrő megvalósítása [9]
á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ő: 𝐻(𝑠) =
Ω𝑐 𝑠 + Ω𝑐
𝑓
ahol: Ω𝑐 = tg (𝜋 ∙ 𝑓𝑐 ), 𝑓𝑐 a szűrő levágási frekvenciája, 𝑓𝑠 pedig a mintavételi frekvencia. Az 𝑠
együtthatók a következő képletekkel számolhatók: 𝑏0 = 𝑏1 = 𝑎1 = −
Ω𝑐 1 + Ω𝑐
Ω𝑐 − 1 1 + Ω𝑐
Felüláteresztő szűrő esetén a különbség, hogy 𝑏1 = −𝑏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ó: 𝑙 = 𝑐𝑡𝑔 (𝜋 ∙ 𝑏0 = 𝑏1 = 𝑎1 = −
𝑓𝑐 ) 𝑓𝑠
𝐴0 1+𝑙
1−𝑙 1+𝑙
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. 𝑞=e
𝑓 −2𝜋∙ 𝑐 𝑓𝑠
𝑏0 = 1 − 𝑞 𝑏1 = 0 𝑎1 = −𝑞 Felüláteresztő szűrő esetén pedig: 𝑏0 =
1+𝑞 2
= −𝑏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\
12. ábra: Az átviteli függvényt mérő szoftver képe
Irodalom [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 http://www.eet.bme.hu/~nagyg/elektronika/05_DigFilt.pdf
mikrovezérlőkkel,
elérhető:
[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/371599K01/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”.