ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE FAKULTA ELEKTROTECHNICKÁ Katedra měření
Programové vybavení pro testování AD převodníků Diplomová práce
Obor studia: Kybernetika a měření Studijní program: Měřicí a přístrojové systémy Vedoucí práce: doc. Ing. Jaroslav Roztočil, CSc. Autor: Bc. Jakub Sára
Praha 2010
ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE FAKULTA ELEKTROTECHNICKÁ Katedra měření
Čestné prohlášení autora práce Prohlašuji, že jsem předloženou práci vypracoval samostatně a že jsem uvedl veškeré použité informační zdroje v souladu s Metodickým pokynem o dodržování etických principů při přípravě vysokoškolských závěrečných prací.
V Praze dne 14.05.2010 Podpis autora práce
Praha 2010
ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE FAKULTA ELEKTROTECHNICKÁ Katedra měření
Poděkování Tímto bych rád poděkoval vedoucímu mé diplomové práce panu doc. Ing. Jaroslavu Roztočilovi, CSc. za cenné rady, odborné vedení a věcné připomínky k této diplomové práci. Děkuji panům z katedry měření Ing. Davidu Slepičkovi, Ph.D. za uvedení do problematiky testování AD převodníků a za odborné rady při vytváření tohoto softwaru a doc. Ing. Miloši Sedláčkovi, CSc. za odbornou konzultaci a poskytnutí aplikace pro návrh kosinových oken. Dále bych rád poděkoval společnosti STMicroelectronics za spolupráci s katedrou měření a zadávání projektů z praxe pro studenty. Z této firmy děkuji pánům Ing. Milanovi Andrlemu, Ph.D. a Ing. Ivanu Doušovi za odborné konzultace, cenné rady a připomínky při vytváření softwaru pro testování AD převodníků. Děkuji také rodičům za podporu během studia.
Praha 2010
ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE FAKULTA ELEKTROTECHNICKÁ Katedra měření
Abstrakt Cílem této diplomové práce je naprogramovat software, knihovnu funkcí v jazyce ANSI C, pro testování analogově číslicových (AD) převodníků. Při testování jsou stanoveny statické a dynamické parametry AD převodníků. Abstract The goal of this diploma thesis is to develop software – library of functions for analog to digital converters (ADC). Software is written in ANSI C programming language. There are determined both static and dynamic parameters in ADC testing. Zusammenfassung Das Ziel dieser Diplomarbeit ist die Gestaltung einiger Software – Funktionsbibliothek die AnalogDigital Umsetzer (ADU) zu testen. Die Software ist in der ANSI C Programmiersprache geschrieben. Bei dem ADU Test sind statische und dynamische Parameter festgestellt.
Praha 2010
Software pro testování AD převodníků Obsah
Obsah 1. Úvod .................................................................................................................................................... 5 2. Statické parametry AD převodníků ..................................................................................................... 7 2.1. Chyba nuly (offset) ....................................................................................................................... 7 2.1.1. Definice.................................................................................................................................. 7 2.1.2. Hlavička, parametry, podmínky............................................................................................. 8 2.1.3. Popis algoritmu...................................................................................................................... 9 2.1.4. Příklad funkce v C .................................................................................................................. 9 2.1.5. Příklad funkce v konzolové aplikaci ....................................................................................... 9 2.2. Korekce chyby nuly ..................................................................................................................... 10 2.2.1. Definice................................................................................................................................ 10 2.2.2. Hlavička, parametry, podmínky........................................................................................... 10 2.2.3. Popis algoritmu.................................................................................................................... 11 2.2.4. Příklad funkce v C ................................................................................................................ 12 2.2.5. Příklad funkce v konzolové aplikaci ..................................................................................... 12 2.3. Chyba zesílení ............................................................................................................................. 13 2.3.1. Definice................................................................................................................................ 13 2.3.2. Hlavička, parametry, podmínky........................................................................................... 14 2.3.3. Popis algoritmu.................................................................................................................... 14 2.3.4. Příklad funkce v C ................................................................................................................ 15 2.3.5. Příklad funkce v konzolové aplikaci ..................................................................................... 16 2.4. Korekce chyby zesílení................................................................................................................ 16 2.4.1. Definice................................................................................................................................ 16 2.4.2. Hlavička, parametry, podmínky........................................................................................... 17 2.4.3. Popis algoritmu.................................................................................................................... 18 2.4.4. Příklad funkce v C ................................................................................................................ 18 2.4.5. Příklad funkce v konzolové aplikaci ..................................................................................... 19 2.5. Diferenciální nelinearita ............................................................................................................. 19 2.5.1. Definice................................................................................................................................ 19 2.5.2. Hlavička, parametry, podmínky........................................................................................... 20 2.5.3. Popis algoritmu.................................................................................................................... 21 2.5.4. Příklad funkce v C ................................................................................................................ 21
1
Software pro testování AD převodníků Obsah 2.5.5. Příklad funkce v konzolové aplikaci ..................................................................................... 23 2.6. Integrální nelinearita (výpočet z DNL) ........................................................................................ 23 2.6.1. Definice................................................................................................................................ 23 2.6.2. Hlavička, parametry, podmínky........................................................................................... 24 2.6.3. Popis algoritmu.................................................................................................................... 25 2.6.4. Příklad funkce v C ................................................................................................................ 25 2.6.5. Příklad funkce v konzolové aplikaci ..................................................................................... 27 2.7. Integrální nelinearita 2 (výpočet ze středu kódového slova) ..................................................... 27 2.7.1. Definice................................................................................................................................ 27 2.7.2. Hlavička, parametry, podmínky........................................................................................... 28 2.7.3. Popis algoritmu.................................................................................................................... 29 2.7.4. Příklad funkce v C ................................................................................................................ 29 2.7.5. Příklad funkce v konzolové aplikaci ..................................................................................... 30 2.8. DNL a INL z histogramu .............................................................................................................. 30 2.8.1. Definice................................................................................................................................ 31 2.8.2. Hlavička, parametry, podmínky........................................................................................... 33 2.8.3. Popis algoritmu.................................................................................................................... 34 2.8.4. Příklad funkce v C ................................................................................................................ 34 2.8.5. Příklad funkce v konzolové aplikaci ..................................................................................... 35 2.9. Test monotónnosti ..................................................................................................................... 36 2.9.1. Definice................................................................................................................................ 36 2.9.2. Hlavička, parametry, podmínky........................................................................................... 37 2.9.3. Popis algoritmu.................................................................................................................... 38 2.9.4. Příklad funkce v C ................................................................................................................ 38 2.9.5. Příklad funkce v konzolové aplikaci ..................................................................................... 39 3. Doplňující funkce – statické parametry, vstup/výstup ...................................................................... 40 3.1. Řazení polí Uin a ADcode ........................................................................................................... 40 3.1.1. Hlavička, parametry............................................................................................................. 40 3.1.2. Popis algoritmu.................................................................................................................... 41 3.1.3. Příklad funkce v C ................................................................................................................ 41 3.2. Vstupy/výstupy z/do csv souboru .............................................................................................. 41 3.2.1. Hlavička, parametry............................................................................................................. 42 3.2.2. Příklad funkce v C ................................................................................................................ 43
2
Software pro testování AD převodníků Obsah 3.3. Kvantizátor s definovatelnými statickými parametry ................................................................ 44 3.3.1. Hlavička, parametry............................................................................................................. 44 3.3.2. Popis algoritmu.................................................................................................................... 45 3.3.3. Příklad funkce v C ................................................................................................................ 45 3.3.4. Generátor vzorků vstupních napětí – průběh rampa .......................................................... 46 3.3.5. Příklad funkce v konzolové aplikaci ..................................................................................... 47 4. Testování ve frekvenční oblasti ......................................................................................................... 49 4.1. Diskrétní Fourierova transformace – DFT .................................................................................. 49 4.1.1. Normalizované DFT spektrum ............................................................................................. 50 4.1.2. Hlavička, parametry – DFT funkce ....................................................................................... 51 4.1.3. Popis algoritmu – DFT funkce .............................................................................................. 53 4.2. Okénkování ................................................................................................................................. 53 4.2.1. Hlavička, parametry............................................................................................................. 55 4.2.2. Popis algoritmu.................................................................................................................... 56 4.3. Určení pozice a efektivní hodnoty harmonických složek v DFT spektru .................................... 57 4.3.1. Hlavička, parametry............................................................................................................. 58 4.3.2. Popis algoritmu.................................................................................................................... 60 5. Dynamické parametry AD převodníků .............................................................................................. 61 5.1. Šumový práh NFL ........................................................................................................................ 61 5.1.1. Definice................................................................................................................................ 61 5.1.2. Hlavička, parametry funkce ................................................................................................. 63 5.1.3. Popis algoritmu.................................................................................................................... 63 5.1.4. Příklad funkce v C ................................................................................................................ 64 5.1.5. Příklad funkce v konzolové aplikaci ..................................................................................... 65 5.2. Celkové harmonické zkreslení THD ............................................................................................ 66 5.2.1. Definice................................................................................................................................ 66 5.2.2. Hlavička, parametry funkce ................................................................................................. 67 5.2.3. Popis algoritmu.................................................................................................................... 68 5.2.4. Příklad funkce v C ................................................................................................................ 68 5.2.5. Příklad funkce v konzolové aplikaci ..................................................................................... 70 5.3. Poměr signálu k falešné složce SFDR .......................................................................................... 71 5.3.1. Definice................................................................................................................................ 71 5.3.2. Hlavička, parametry funkce ................................................................................................. 72
3
Software pro testování AD převodníků Obsah 5.3.3. Popis algoritmu.................................................................................................................... 73 5.3.4. Příklad funkce v C ................................................................................................................ 74 5.3.5. Příklad funkce v konzolové aplikaci ..................................................................................... 75 5.4. Poměr signálu k šumu SNHR ...................................................................................................... 75 5.4.1. Definice................................................................................................................................ 76 5.4.2. Hlavička, parametry funkce ................................................................................................. 77 5.4.3. Popis algoritmu.................................................................................................................... 78 5.4.4. Příklad funkce v C ................................................................................................................ 79 5.4.5. Příklad funkce v konzolové aplikaci ..................................................................................... 80 5.5. Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB ...................................... 81 5.5.1. Definice................................................................................................................................ 81 5.5.2. Hlavička, parametry funkce ................................................................................................. 84 5.5.3. Popis algoritmu.................................................................................................................... 85 5.5.4. Příklad funkce v C ................................................................................................................ 85 5.5.5. Příklad funkce v konzolové aplikaci ..................................................................................... 87 6. Naměřené výsledky ........................................................................................................................... 88 6.1. Statické parametry AD převodníku ............................................................................................ 88 6.2. Dynamické parametry AD převodníku ....................................................................................... 90 7. Závěr .................................................................................................................................................. 92
4
Software pro testování AD převodníků 1 Úvod
1. Úvod Analogově-číslicové (AD) převodníky hrají důležitou roli nejen v elektrotechnickém průmyslu. AD převodníky slouží pro převod analogových signálů do digitální podoby, aby bylo možné tyto signály zpracovat číslicovou technikou. AD převodníky jsou používány v nejrůznějších aplikacích jako např.: měřící technika, telekomunikace, spotřební audio-video technika atd. Pro široké nasazení AD převodníků jsou na ně kladeny různé požadavky. Cílem této diplomové práce je vytvoření programového vybavení pro testování AD převodníků. Přehled důležitých parametrů AD převodníků podle aplikace je shrnut v následující tabulce [2]: Aplikace použití Automatizace, senzory
Kritické parametry DNL, INL, monotónnost, doba ustálení, dlouhodobá stabilita Číslicové osciloskopy SINAD, ENOB, NFL, šířka pásma, rychlá obnova ze saturace Geofyzika THD, SINAD dlouhodobá stabilita Radary a sonary SINAD, IMD, ENOB, SFDR, rychlá obnova ze saturace Spektrální analyzátory SINAD, ENOB, SFDR Širokopásmové přijímače
SFDR, IMD, SINAD
Telekomunikace
SINAD, NFL, SFDR, IMD, kódová chybovost DNL, SINAD, SFDR DNL, INL, SINAD, ENOB, rychlá obnova ze saturace SINAD, THD
Video Zpracování obrazu Zpracování zvuku
Požadavky na AD převodníky Lineární přenosová funkce. Tepelná stabilita. Plné využití rozsahu (fullscale). SINAD pro široké pásmo. Nízký tepelný šum. Odezva na velmi nízké frekvence (mHz). SINAD a IMD kvůli detekci Dopplerova jevu. SINAD a SFDR pro dynamický rozsah. Linearita v širokém pásmu. Linearita v dynamickém pásmu pro detekci velmi slabých signálů v zarušeném prostředí. Rychlé vzorkování. Mezikanálový přeslech. Nízká spotřeba energie. Chyba zesílení, chyba fáze. DNL pro detekci hran. Rychlá obnova proti rozkvětu (blooming). Nízká spotřeba energie. Plné využití rozsahu (fullscale).
Tabulka 1 Kritické parametry AD převodníků [2]
kde
DNL INL SINAD ENOB NFL THD IMD SFDR
je je je je je je je je
diferenciální nelinearita integrální nelinearita poměr signálu k šumu a harmonickému zkreslení efektivní počet bitů (efektivní rozlišitelnost) šumový práh celkové harmonické zkreslení intermodulační zkreslení poměr signálu k falešné složce
Práce je rozdělena na stanovení statických a dynamických parametrů. Každý parametr je definován, názorně vysvětlen na příkladech a implementován do funkce v programovém jazyce ANSI C. Ke každé
5
Software pro testování AD převodníků 1 Úvod funkci, stanovující požadovaný parametr, je ukázán příklad jejího použití v jednoduchém C programu a příklad použití v konzolové aplikaci. Statické parametry popisují chování AD převodníků při převodu stejnosměrných signálů a určují jejich chybu nuly (offset), chybu zesílení, nelinearitu převodní charakteristiky – diferenciální a integrální nelinearita) a monotónnost převodní charakteristiky. Toto jsou důležité parametry např. pro aplikace zpracování obrazů nebo v automatizaci při zpracování signálů z různých senzorů. Statické parametry jsou testovány při vstupním stejnosměrném signálu typu rampa, který využívá celý rozsah AD převodníku. Dynamické parametry určují šumové vlastnosti AD převodníků a jejich zkreslení ve frekvenční oblasti. Z celkového šumu a zkreslení je také určena efektivní rozlišitelnost převodníků – počet bitů. Tyto parametry jsou důležité např. při zpracování zvuku. Tato práce se zabývá stanovením dynamických parametrů při vstupním sinusovém signálu. Ke knihovnám, obsahující funkce pro testování AD převodníků, je také vytvořena konzolová aplikace. Tato aplikace umožňuje jednoduše stanovit z naměřených dat všechny parametry AD převodníku uvedené v této práci.
6
Software pro testování AD převodníků 2 Statické parametry AD převodníků
2. Statické parametry AD převodníků V této kapitole budou definovány základní statické parametry AD převodníků [16], které obsahuje knihovna funkcí adstatic: -
chyba nuly a její korekce chyba zesílení a její korekce diferenciální nelinearita integrální nelinearita (výpočet z diferenciální nelinearity) integrální nelinearita 2 (výpočet ze středů kódových slov) histogram kódových slov a z něho statistické určení diferenciální a integrální nelinearity test monotónnosti
Každá definice funkce je vysvětlena na konkrétním příkladě. Poté je ukázána hlavička funkce v C knihovně a příklad použití v kódu. Uvedeno je také použití funkce v konzolové aplikaci.
2.1. Chyba nuly (offset) Chyba nuly AD převodníku určuje citlivost první přechodové kódové úrovně na vstupní napětí. 2.1.1. Definice Chyba nuly je rozdíl první přechodové úrovně od ideální. První přechodová úroveň je přechod výstupního kódového slova AD převodníku z 00..00 na 00..01. Ideální poloha první přechodové úrovně je při vstupním napětí AD převodníku přesně 1 LSB (GND + LSB). Příklad: Chyba nuly je ukázána na následujícím příkladu (Obrázek 1) – černý průběh (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0,5 LSB; chyba zesílení = −3 LSB; DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL = [x; 0; 0,6; −1; 0; 0; 0; x] LSB):
Obrázek 1 Příklad chyby nuly
kde
ADcode Uin ideal Uze
je je je je
výstup AD převodníku – kódové slovo vstupní napětí AD převodníku průběh ideálního AD převodníku – zelený průběh chyba nuly ve Voltech – rozdíl polohy první přechodové úrovně oproti ideální
7
Software pro testování AD převodníků 2.1 Chyba nuly (offset) Chyba nuly je však udávána v LSB proto je nutno vydělit šířkou LSB: ݎݎ݁ݎ݁ݖൌ
ܷ݁ݖ ܷ݁ݖ Ͳǡͷ ൌ ൌ ൌ Ͳǡͷ ܷ݂݁ݎ ͺ ܷܤܵܮ ͵ ʹ ʹܾ݅ݏݐ
Rovnice 1 Výpočet chyby nuly
kde
zeroerr ULSB Uref bits
je je je je
chyba nuly v LSB šířka LSB ve Voltech referenční napětí AD převodníku počet bitů AD převodníku
2.1.2. Hlavička, parametry, podmínky Hlavička funkce pro stanovení chyby nuly AD převodníku: int zeroerror(unsigned char bits, double Uref, double * Uin, unsigned long * ADcode, unsigned long length, double * zeroerr);
Blokové schéma funkce chyby nuly pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 2 Blok funkce chyby nuly
Vstupní parametry: bits počet bitů AD převodníku Uref referenční napětí AD převodníku [V] Uin pole vstupních napětí AD převodníku ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin length délka polí Uin a ADcode Výstupní parametry: zeroerr chyba nuly AD převodníku [LSB] Výsledek funkce: 0 výpočet proběhl v pořádku −1 chyba ve vstupních parametrech −2 nenalezeno první kódové slovo (ADcode = 00..01)
8
Software pro testování AD převodníků 2.1 Chyba nuly (offset) Podmínky funkce: Pole Uin a ADcode musí být seřazeny dle kapitoly 3.1. 2.1.3. Popis algoritmu Pro stanovení chyby nuly se musí najít první přechodová úroveň AD převodníku. Protože ADcode musí být seřazené, je použito vyhledávání ADcode 1 od začátku pole. Po nalezení první přechodové úrovně je stanoven rozdíl od ideální polohy první přechodové úrovně (1 LSB) a tento rozdíl je vydělen šířkou LSB ve Voltech, aby byl výsledek v LSB (viz 2.1.1). 2.1.4. Příklad funkce v C Použití funkce chyby nuly je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double Uin[8] = {0, 1.5, 2, 2.2, 3.5, 4, 4.5, 5}; unsigned long ADcode[8] = {0, 1, 2, 3, 5, 6, 7, 7}; unsigned long length = 8; double zeroerr; adstaticsort(bits,Uin,ADcode,length); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); printf("Zero error of this ADC is %f LSB.", zeroerr); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku (viz 2.1.1). Pro jednoduchost a názornost je průběh vzorkován nepravidelně jen v přechodových úrovních, v praxi je nastavováno vstupní napětí ADC po pevném kroku. Funkce adstaticsort() seřadí pole Uin a ADcode dle podmínky (viz 2.1.2). (pro úplnost – v tomto případě není řazení nutné, vstupní hodnoty jsou zadány seřazeně dle požadavku). Funkce zeroerror() vypočte chybu nuly a uloží do proměnné zeroerr. Nakonec je vypsán výsledek. Výsledek: Zero error of this ADC is 0,500000 LSB.
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány funkce adstaticsort() a zeroerror() na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost (viz 2.1.2), jen tehdy je zaručeno, že funkce proběhla v pořádku. 2.1.5. Příklad funkce v konzolové aplikaci Parametr –z určuje funkci aplikace pro výpočet chyby nuly. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V.
9
Software pro testování AD převodníků 2.1 Chyba nuly (offset) adstatic.exe –z ADC_test.csv 3 8 adstatic.exe –z ADC_test.csv 3 8 –file zeroerr.csv
V prvním příkladě bude výsledek vypsán na obrazovku, ve druhém uložen do souboru zeroerr.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.2. Korekce chyby nuly Korekce chyby nuly je nutná pro stanovení dalších statických parametrů. Z definice korekci chyby nuly požadují funkce pro výpočet chyby zesílení, diferenciální a integrální nelinearity. 2.2.1. Definice Korekce chyby nuly přesune závislost AD převodníku o konstantu (hodnota chyby nuly), tak aby byla první přechodová úroveň na místě ideální úrovně. První přechodová úroveň je přechod výstupního kódového slova AD převodníku z 00..00 na 00..01. Ideální poloha první přechodové úrovně je při vstupním napětí AD převodníku přesně 1 LSB (GND + LSB). Příklad: Korekce chyby nuly (zero error correction) je ukázána na následujícím příkladu Obrázek 3 – černý, čárkovaný průběh (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0,5 LSB; chyba zesílení = −3 LSB; DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL = [x; 0; 0,6; −1; 0; 0; 0; x] LSB), černý, silný průběh je po korekci chyby nuly, červené šipky znázorňují posun průběhu o hodnotu chyby nuly ve Voltech:
Obrázek 3 Příklad korekce chyby nuly
kde
ADcode je výstup AD převodníku – kódové slovo Uin je vstupní napětí AD převodníku ideal je průběh ideálního AD převodníku – zelený průběh
2.2.2. Hlavička, parametry, podmínky Hlavička funkce pro korekci chyby nuly AD převodníku: int zerocorrection(unsigned char bits, double Uref, double zeroerr, unsigned long length, double * Uin);
10
Software pro testování AD převodníků 2.2 Korekce chyby nuly
Blokové schéma funkce korekce chyby nuly pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 4 Blok funkce korekce chyby nuly
Vstupní parametry: bits počet bitů AD převodníku Uref referenční napětí AD převodníku [V] length délka polí Uin a ADcode zeroerr chyba nuly AD převodníku [LSB], stanovená např. funkcí zeroerror() (viz 2.1) Vstupně/Výstupní parametry: Uin pole vstupních napětí AD převodníku, toto pole je upraveno korekcí! Výsledek funkce: 0 korekce proběhla v pořádku −1 chyba ve vstupních parametrech Podmínky funkce: N/A 2.2.3. Popis algoritmu Nejdříve je chyba nuly v LSB převedena na Volty. Tím je získána korekční konstanta, o kterou je korigováno vstupní napětí – pole Uin: ܷ݅݊ ܿݖሾ݅ሿ ൌ ܷ݅݊ሾ݅ሿ െ
ݎݎ݁ݎ݁ݖ ݎݎ݁ݎ݁ݖ ൌ ܷ݅݊ሾ݅ሿ െ ܷ݂݁ݎ ܷܤܵܮ ʹܾ݅ݏݐ
Rovnice 2 Korekce chyby nuly
kde
Uinzc Uin i zeroerr ULSB Uref bits
je je je je je je je
pole vstupních napětí AD převodníku po korekci chyby nuly pole vstupních napětí AD převodníku index polí Uin a Uinzc, i ϵ <0; length) chyba nuly AD převodníku v LSB šířka LSB ve Voltech referenční napětí AD převodníku počet bitů AD převodníku
11
Software pro testování AD převodníků 2.2 Korekce chyby nuly 2.2.4. Příklad funkce v C Použití funkce korekce chyby nuly je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double Uin[8] = {0, 1.5, 2, 2.2, 3.5, 4, 4.5, 5}; unsigned long ADcode[8] = {0, 1, 2, 3, 5, 6, 7, 7}; unsigned long length = 8; double zeroerr; adstaticsort(bits,Uin,ADcode,length); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); printf("Zero error of this ADC is %f LSB.\n", zeroerr); zerocorrection(bits, Uref, zeroerr, length, Uin); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); printf("Zero error after correction is %f LSB.\n", zeroerr); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku (viz 2.2.1). Pro jednoduchost a názornost je průběh vzorkován nepravidelně jen v přechodových úrovních, v praxi je nastavováno vstupní napětí ADC po pevném kroku. Funkce adstaticsort() seřadí pole Uin a ADcode dle podmínky (viz 2.2.2). (pro úplnost – v tomto případě není řazení nutné, vstupní hodnoty jsou zadány seřazeně dle požadavku). Funkce zeroerror() vypočte chybu nuly a uloží do proměnné zeroerr, ta slouží jako vstupní parametr pro funkci zerocorrection() a je provedena korekce. Pro kontrolu je funkcí zeroerror() stanovena znovu chyba nuly. Výsledek: Zero error of this ADC is 0,500000 LSB. Zero error after correction is 0,000000 LSB.
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány funkce adstaticsort(), zeroerror() a zerocorrection() na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost (viz 2.1.2, 2.2.2), jen tehdy je zaručeno, že funkce proběhly v pořádku. 2.2.5. Příklad funkce v konzolové aplikaci Parametr –zc určuje funkci aplikace pro korekci chyby nuly. Aplikace si stanoví chyby nuly a poté provede korekci. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –zc ADC_test.csv 3 8 adstatic.exe –zc ADC_test.csv 3 8 –file ADC_zc.csv
12
Software pro testování AD převodníků 2.2 Korekce chyby nuly V prvním příkladě bude korigované pole Uin vypsané na obrazovku, ve druhém bude korigovaný průběh Uin včetně ADcode uložen do souboru ADC_zc.csv (první sloupec korigované Uin, druhý ADcode). Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.3. Chyba zesílení Chyba zesílení AD převodníků určuje rozdíl směrnice zesílení výstupního průběhu od ideální. 2.3.1. Definice Chyba zesílení je rozdíl poslední přechodové úrovně od ideální po korekci chyby nuly! Poslední přechodová úroveň je přechod výstupního z předposledního kódového slova AD převodníku na poslední, tj. z 11..10 na 11..11. Ideální poloha poslední přechodové úrovně je při referenčním vstupním napětí AD převodníku − 1 LSB (Uref − 1 LSB). Příklad: Chyba zesílení je ukázána na následujícím příkladu Obrázek 5 – černý průběh po korekci chyby nuly (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0 LSB (korigována); chyba zesílení = −3 LSB; DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL = [x; 0; 0,6; −1; 0; 0; 0; x] LSB):
Obrázek 5 Příklad chyby zesílení
kde
ADcode Uin ideal Uge
je výstup AD převodníku – kódové slovo je vstupní napětí AD převodníku je průběh ideálního AD převodníku – zelený průběh je chyba zesílení ve Voltech – rozdíl polohy poslední přechodové úrovně oproti ideální
Chyba zesílení je však udávána v LSB proto je nutno vydělit šířkou LSB: ݃ܽ݅݊݁ ݎݎൌ
ܷ݃݁ ܷ݃݁ ͵ ൌ ൌ ൌ ͵ ܷ ͺ ܷܤܵܮ ݂݁ݎ ʹ͵ ʹܾ݅ݏݐ
Rovnice 3 Výpočet chyby zesílení
13
Software pro testování AD převodníků 2.3 Chyba zesílení kde
gainerr ULSB Uref bits
je je je je
chyba zesílení v LSB šířka LSB ve Voltech referenční napětí AD převodníku počet bitů AD převodníku
2.3.2. Hlavička, parametry, podmínky Hlavička funkce pro stanovení chyby zesílení AD převodníku: int gainerror(unsigned char bits, double Uref, double * Uin, unsigned long * ADcode, unsigned long length, double * gainerr);
Blokové schéma funkce chyby zesílení pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 6 Blok funkce chyby zesílení
Vstupní parametry: bits počet bitů AD převodníku Uref referenční napětí AD převodníku [V] Uin pole vstupních napětí AD převodníku (po korekci chyby nuly) ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin length délka polí Uin a ADcode Výstupní parametry: gainerr chyba zesílení AD převodníku [LSB] Výsledek funkce: 0 výpočet proběhl v pořádku −1 chyba ve vstupních parametrech −2 nenalezeno předposlední kódové slovo (ADcode = 11..10) Podmínky funkce: Pole Uin a ADcode musí být seřazeny dle kapitoly 3.1. 2.3.3. Popis algoritmu Pro stanovení chyby zesílení se musí najít poslední přechodová úroveň AD převodníku. Protože ADcode musí být seřazené, je použito vyhledávání od konce pole. Hledá se výskyt předposlední kódové úroveň ADcode 11.10. Po nalezení prvního výskytu předposlední úrovně je zřejmé, že na
14
Software pro testování AD převodníků 2.3 Chyba zesílení následujícím indexu pole Uin je poslední přechodová úroveň. Z ní je stanoven rozdíl od ideální polohy poslední přechodové úrovně (Uref − 1 LSB) a tento rozdíl je vydělen šířkou LSB ve Voltech, aby byl výsledek v LSB (viz 2.3.1). 2.3.4. Příklad funkce v C Použití funkce chyby zesílení je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double Uin[8] = {0, 1.5, 2, 2.2, 3.5, 4, 4.5, 5}; unsigned long ADcode[8] = {0, 1, 2, 3, 5, 6, 7, 7}; unsigned long length = 8; double zeroerr; double gainerr; adstaticsort(bits,Uin,ADcode,length); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); zerocorrection(bits, Uref, zeroerr, length, Uin); gainerror(bits, Uref, Uin, ADcode, length, &gainerr); printf("Gain error of this ADC is %f LSB.\n", gainerr); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku (viz 2.3.1). Pro jednoduchost a názornost je průběh vzorkován nepravidelně jen v přechodových úrovních, v praxi je nastavováno vstupní napětí ADC po pevném kroku. Funkce adstaticsort() seřadí pole Uin a ADcode dle podmínky (viz 2.3.2). (pro úplnost – v tomto případě není řazení nutné, vstupní hodnoty jsou zadány seřazeně dle požadavku). Funkce zeroerror() vypočte chybu nuly a uloží do proměnné zeroerr, ta slouží jako vstupní parametr pro funkci zerocorrection() a je provedena korekce chyby nuly, která je požadována pro stanovení chyby zesílení. Funkce gainerror () vypočte chybu zesílení a uloží do proměnné gainerr. Nakonec je vypsán výsledek. Výsledek: Gain error of this ADC is -3,000000 LSB.
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány funkce adstaticsort(), zeroerror(), zerocorrection() a gainerror() na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost (viz 2.3.2), jen tehdy je zaručeno, že funkce proběhly v pořádku.
15
Software pro testování AD převodníků 2.3 Chyba zesílení 2.3.5. Příklad funkce v konzolové aplikaci Parametr –g určuje funkci aplikace pro výpočet chyby zesílení. Aplikace si sama z průběhu určí chybu nuly a provede požadovanou korekci. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –g ADC_test.csv 3 8 adstatic.exe –g ADC_test.csv 3 8 –file gainerr.csv
V prvním příkladě bude výsledek vypsán na obrazovku, ve druhém uložen do souboru zeroerr.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.4. Korekce chyby zesílení Korekce chyby zesílení je nutná pro stanovení dalších statických parametrů. Z definice korekci chyby zesílení požadují funkce pro výpočet diferenciální a integrální nelinearity. 2.4.1. Definice Korekce chyby zesílení koriguje směrnici závislosti AD převodníku na vstupním napětí, tak aby první přechodová úroveň zůstala na ideální úrovni (po korekci chyby nuly viz 2.2) a poslední přechodová úroveň byla posunuta na polohu ideální poslední přechodové úrovně. První přechodová úroveň je přechod výstupního kódového slova AD převodníku z 00..00 na 00..01. Ideální poloha první přechodové úrovně je při vstupním napětí AD převodníku přesně 1 LSB (GND + LSB). Poslední přechodová úroveň je přechod výstupního z předposledního kódového slova AD převodníku na poslední, tj. z 11..10 na 11..11. Ideální poloha poslední přechodové úrovně je při referenčním vstupním napětí AD převodníku − 1 LSB (Uref − 1 LSB). Příklad: Korekce chyby zesílení (gain error correction) je ukázána na následujícím příkladu Obrázek 7 – černý, čárkovaný průběh po korekci chyby nuly (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0 LSB (po korekci); chyba zesílení = −3 LSB; DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL = [x; 0; 0,6; −1; 0; 0; 0; x] LSB), černý, silný průběh je po korekci chyby zesílení, červené šipky a červená výseč znázorňují změnu směrnice zesílení průběhu:
Obrázek 7 Příklad korekce chyby zesílení
16
Software pro testování AD převodníků 2.4 Korekce chyby zesílení kde
ADcode Uin ideal k kideal
je je je je je
výstup AD převodníku – kódové slovo vstupní napětí AD převodníku průběh ideálního AD převodníku – zelený průběh směrnice zesílení průběhu AD převodníku z příkladu směrnice zesílení ideálního (zeleného) průběhu
Důležité: směrnice zesílení mají počátek na první přechodové úrovni, to je proto, že po korekci chyby zesílení nesmí být ovlivněna chyba nuly. 2.4.2. Hlavička, parametry, podmínky Hlavička funkce pro korekci chyby zesílení AD převodníku: int gaincorrection(unsigned char bits, double Uref, double gainerr, unsigned long length, double * Uin);
Blokové schéma funkce korekce chyby zesílení pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 8 Blok funkce korekce chyby zesílení
Vstupní parametry: bits počet bitů AD převodníku Uref referenční napětí AD převodníku [V] length délka polí Uin a ADcode gainerr chyba zesílení AD převodníku [LSB], stanovená např. funkcí gainerror() (viz 2.3) Vstupně/Výstupní parametry: Uin pole vstupních napětí AD převodníku, toto pole je upraveno korekcí! Výsledek funkce: 0 korekce proběhla v pořádku −1 chyba ve vstupních parametrech Podmínky funkce: N/A
17
Software pro testování AD převodníků 2.4 Korekce chyby zesílení 2.4.3. Popis algoritmu Chyba zesílení je lineárně dělena na podíly dle následujícího vztahu tak, aby poslední přechodová úroveň byla korigována o celou hodnotu chyby zesílení a první přechodová úroveň (ULSB) korigována nebyla (pozn. hodnoty Uin před první přechodovou úrovní jsou touto korekcí ovlivněny): ሺܷ݅݊ሾ݅ሿ െ ܷ ܤܵܮሻ ή ݃ܽ݅݊݁ݎݎ ܷ݅݊݃ܿ ሾ݅ሿ ൌ ܷ݅݊ሾ݅ሿ െ ቈ ݃ܽ݅݊݁ ݎݎ ʹܾ݅ ݏݐെ ʹ Rovnice 4 Korekce chyby zesílení
kde
Uingc Uin i gainerr ULSB Uref bits
je je je je je je je
pole vstupních napětí AD převodníku po korekci chyby zesílení pole vstupních napětí AD převodníku index polí Uin a Uingc, i ϵ <0; length) chyba zesílení AD převodníku v LSB šířka LSB ve Voltech referenční napětí AD převodníku počet bitů AD převodníku
2.4.4. Příklad funkce v C Použití funkce korekce chyby zesílení je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double Uin[8] = {0, 1.5, 2, 2.2, 3.5, 4, 4.5, 5}; unsigned long ADcode[8] = {0, 1, 2, 3, 5, 6, 7, 7}; unsigned long length = 8; double zeroerr; double gainerr; adstaticsort(bits,Uin,ADcode,length); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); zerocorrection(bits, Uref, zeroerr, length, Uin); gainerror(bits, Uref, Uin, ADcode, length, &gainerr); printf("Gain error of this ADC is %f LSB.\n", gainerr); gaincorrection(bits, Uref, gainerr, length, Uin); gainerror(bits, Uref, Uin, ADcode, length, &gainerr); printf("Gain error after correction is %f LSB.\n", gainerr); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku (viz 2.4.1). Pro jednoduchost a názornost je průběh vzorkován nepravidelně jen v přechodových úrovních, v praxi je nastavováno vstupní napětí ADC po pevném kroku. Funkce adstaticsort() seřadí pole Uin a ADcode dle podmínky (viz 2.4.2) (pro úplnost – v tomto případě není řazení nutné, vstupní hodnoty jsou zadány seřazeně
18
Software pro testování AD převodníků 2.4 Korekce chyby zesílení dle požadavku). Funkce zeroerror() vypočte chybu nuly a uloží do proměnné zeroerr, ta slouží jako vstupní parametr pro funkci zerocorrection() a je provedena korekce. Po korekci chyby nuly je vypočtena funkcí gainerror() chyba zesílení a vypsána. Ta je poté použita jako vstupní parametr u funkce gaincorrection(). Po korekci chyby zesílení je pro kontrolu je funkcí gainerror() stanovena znovu chyba zesílení a je vypsána. Výsledek: Gain error of this ADC is -3,000000 LSB. Gain error after correction is 0,000000 LSB.
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány funkce adstaticsort(), zeroerror(), zerocorrection(), gainerror() a gaincorrection() na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost (viz 2.1.2, 2.2.2, 2.3.2, 2.4.2), jen tehdy je zaručeno, že funkce proběhly v pořádku. 2.4.5. Příklad funkce v konzolové aplikaci Parametr –c určuje funkci aplikace pro korekci obou chyb (nuly i zesílení). Aplikace si stanoví chybu nuly a provede její korekci. Poté je vypočtena chyba zesílení a provedena korekce chyby zesílení. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –c ADC_test.csv 3 8 adstatic.exe –c ADC_test.csv 3 8 –file ADC_c.csv
V prvním příkladě bude korigované pole Uin vypsané na obrazovku, ve druhém bude korigovaný průběh Uin včetně ADcode uložen do souboru ADC_c.csv (první sloupec korigované Uin, druhý ADcode). Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.5. Diferenciální nelinearita Diferenciální nelinearita AD převodníků (DNL) zkoumá napěťovou šířku jednotlivých kódových úrovní a chybějící kódová slova. 2.5.1. Definice Diferenciální nelinearita je rozdíl šířky kódového slovo oproti šířce ideálního kódového slova v LSB. Šířka kódového slova se určuje rozdílem minimálního a maximálního vstupního napětí, kdy AD převodník generuje toto kódové slovo na výstup. Ideální šířka kódového slova je 1 LSB. Diferenciální nelinearita není definovaná pro první a poslední kódové slovo (00..00 a 11..11)! Pokud k-té kódové slovo chybí potom je šířka kódového slova nula a DNL[k] = −1 LSB. Pro stanovení diferenciální nelinearity je nutno provést korekci chyby nuly a chyby zesílení. Příklad: Diferenciální nelinearita je ukázána na následujícím příkladu Obrázek 9 – černý průběh po korekci chyby nuly a chyby zesílení (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0 LSB
19
Software pro testování AD převodníků 2.5 Diferenciální nelinearita (korigováno); chyba zesílení = 0 LSB (korigováno); DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL = [x; 0; 0,6; −1; 0; 0; 0; x] LSB):
Obrázek 9 Příklad diferenciální nelinearity
kde
ADcode Uin ideal UDNL[k]
je je je je
výstup AD převodníku – kódové slovo vstupní napětí AD převodníku průběh ideálního AD převodníku – zelený průběh šířka k-tého kódového slova ve Voltech
Diferenciální nelinearita je udávána jako rozdíl oproti šířce ideálního slova v LSB: ܮܰܦሾ݇ሿ ൌ
ܷ ܮܰܦሾ݇ሿ ܷ ܮܰܦሾ݇ሿ െ ܷܤܵܮ ͲǡͶ ൌ െ ͳ ൌ ܮܰܦሾʹሿ ൌ െ ͳ ൌ െͲǡ ܷ݂݁ݎ ͺ ܷܤܵܮ ʹ͵ ʹܾ݅ݏݐ Rovnice 5 Výpočet diferenciální nelinearity
kde
DNL[k] UDNL[k] ULSB Uref bits
je je je je je
diferenciální nelinearita k-tého kódového slova v LSB šířka k-tého kódového slova ve Voltech šířka LSB ve Voltech referenční napětí AD převodníku počet bitů AD převodníku
2.5.2. Hlavička, parametry, podmínky Hlavička funkce pro stanovení diferenciální nelinearity AD převodníku: int difnonlin(unsigned char bits, double Uref, double * Uin, unsigned long * ADcode, unsigned long length, unsigned long ** ADcode_s, double ** DNL);
20
Software pro testování AD převodníků 2.5 Diferenciální nelinearita Blokové schéma funkce diferenciální nelinearity pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 10 Blok funkce diferenciální nelinearity
Vstupní parametry: bits počet bitů AD převodníku Uref referenční napětí AD převodníku [V] Uin pole vstupních napětí AD převodníku (po korekci chyby nuly a chyby zesílení) ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin length délka polí Uin a ADcode Výstupní parametry: ADcode_s pole kódových slov, které odpovídají poli DNL, délka tohoto pole je 2bits DNL pole diferenciální nelinearity, délka tohoto pole je 2bits Výsledek funkce: 0 výpočet proběhl v pořádku −1 chyba ve vstupních parametrech Podmínky funkce: Pole Uin a ADcode musí být seřazeny dle kapitoly 3.1. Výsledek DNL prvního a posledního kódového slova je vždy 0 LSB (DNL[0] = DNL[2bits − 1] = 0 LSB) 2.5.3. Popis algoritmu Předpokládá se seřazené pole Uin a ADcode pro každé kódové slovo (viz 3.1). Algoritmus, v cyklu přes každé ADcode, hledá poslední výskyt aktuálního kódového slova. Tímto se zjistí konec a počátek (z předchozího cyklu) každého kódového slova. Z počátku a konce se vypočte délka kódového slova ve Voltech a stanoví se diferenciální nelinearita jako rozdíl oproti ideální délce kódového slova v LSB. 2.5.4. Příklad funkce v C Použití funkce diferenciální nelinearity je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3;
21
Software pro testování AD převodníků 2.5 Diferenciální nelinearita double Uref = 8; double Uin[8] = {0, 1.5, 2, 2.2, 3.5, 4, 4.5, 5}; unsigned long ADcode[8] = {0, 1, 2, 3, 5, 6, 7, 7}; unsigned long length = 8; double zeroerr; double gainerr; unsigned long * ADcode_s; double * DNL; adstaticsort(bits,Uin,ADcode,length); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); zerocorrection(bits, Uref, zeroerr, length, Uin); gainerror(bits, Uref, Uin, ADcode, length, &gainerr); gaincorrection(bits, Uref, gainerr, length, Uin); difnonlin(bits, Uref, Uin, ADcode, length, &ADcode_s, &DNL); printf("DNL of this ADC is:\n"); printf("ADcode [%d; %d; %d; %d; %d; %d; %d; %d]\n",ADcode_s[0], ADcode_s[1],ADcode_s[2],ADcode_s[3],ADcode_s[4],ADcode_s[5],ADcode_s[6], ADcode_s[7]); printf("DNL [%f; %f; %f; %f; %f; %f; %f; %f] LSB\n",DNL[0],DNL[1], DNL[2],DNL[3],DNL[4],DNL[5],DNL[6],DNL[7]); free(ADcode_s); free(DNL); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku (viz 2.5.1). Pro jednoduchost a názornost je průběh vzorkován nepravidelně jen v přechodových úrovních, v praxi je nastavováno vstupní napětí ADC po pevném kroku. Funkce adstaticsort() seřadí pole Uin a ADcode dle podmínky (viz 2.5.2(. (pro úplnost – v tomto případě není řazení nutné, vstupní hodnoty jsou zadány seřazeně dle požadavku). Funkce zeroerror() vypočte chybu nuly a uloží do proměnné zeroerr, ta slouží jako vstupní parametr pro funkci zerocorrection() a je provedena korekce chyby nuly. Funkce gainerror () vypočte chybu zesílení a uloží do proměnné gainerr, ta slouží jako vstupní parametr pro funkci gaincorrection() a je provedena korekce chyby zesílení. Tyto korekce jsou nutné dle definice DNL. Funkcí difnonlin() je stanovena diferenciální nelinearita. Výsledek je formě dvojice: kódové slovo v poli ADcode_s a k tomu odpovídající diferenciální nelinearita v poli DNL. Nakonec jsou výsledky vypsány. Výsledek: DNL of this ADC is: ADcode [0; 1; 2; 3; 4; 5; 6; 7] DNL [0.000000; 0.000000; -0.600000; 1.600000; -1.000000; 0.000000; 0.000000; 0.000000] LSB
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány funkce adstaticsort(), zeroerror(), zerocorrection(), gainerror(), gaincorrection() a difnonlin() na výsledek. V praktickém použití je
22
Software pro testování AD převodníků 2.5 Diferenciální nelinearita doporučeno testovat funkce na nulovost (viz 2.1.2, 2.2.2, 2.3.2, 2.4.2, 2.5.2), jen tehdy je zaručeno, že funkce proběhly v pořádku. 2.5.5. Příklad funkce v konzolové aplikaci Parametr –dc určuje funkci aplikace pro výpočet diferenciální nelinearity, zahrnuje korekci chyby nuly a chyby zesílení. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –dc ADC_test.csv 3 8 adstatic.exe –dc ADC_test.csv 3 8 –file dnl.csv
V prvním příkladě bude výsledek vypsán na obrazovku (AD code s odpovídající DNL), ve druhém uložen do souboru dnl.csv, ve formátu (AD code, DNL). Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.6. Integrální nelinearita (výpočet z DNL) Integrální nelinearita AD převodníků (INL) určuje napěťovou pozici kódového slova. Využívá se definice DNL (pomocí šířky kódových slov lze dopočítat pozici). 2.6.1. Definice Integrální nelinearita je rozdíl pozice kódového slova (přechodné hrany) oproti pozici ideálního kódového slova (přechodné hrany) v LSB. Pozice kódového slova je určena minimálním vstupním napětí, kdy AD převodník generuje toto kódové slovo na výstup. Ideální pozice k-tého kódového slova je k·LSB. Integrální nelinearita není definovaná pro první a poslední kódové slovo (00..00 a 11..11)! Pro stanovení integrální nelinearity je nutno provést korekci chyby nuly a chyby zesílení. Při výpočtu pozice je využita funkce diferenciální nelinearity (viz 2.5). Dle definice, DNL určuje šířku kódových slov. Pro stanovení INL k-tého kódového slova stačí znát záporný součet všech předcházejících DNL: ݇െͳ
ܮܰܫሾ݇ሿ ൌ െ ܮܰܦሾ݅ሿ ݅ൌͳ
Rovnice 6 Definice integrální nelinearity (výpočet z DNL)
Příklad: Integrální nelinearita je ukázána na následujícím příkladu Obrázek 11 – černý průběh po korekci chyby nuly a chyby zesílení (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0 LSB (po korekci); chyba zesílení = 0 LSB (po korekci); DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL = [x; 0; 0,6; −1; 0; 0; 0; x] LSB). Černé tečky znázorňují pozici kódového slova AD převodníku z příkladu a zelené tečky znázorňují ideální pozici kódového slova:
23
Software pro testování AD převodníků 2.6 Integrální nelinearita (výpočet z DNL)
Obrázek 11 Příklad integrální nelinearity (výpočet z DNL)
kde
ADcode Uin ideal UINL[k]
je je je je
výstup AD převodníku – kódové slovo vstupní napětí AD převodníku průběh ideálního AD převodníku – zelený průběh vzdálenost pozice k-tého kódového slova oproti ideálnímu ve Voltech
Integrální nelinearita je udávána jako v LSB: ܮܰܫሾ݇ሿ ൌ
ܷܮܰܫሾ݇ሿ ܷܮܰܫሾ݇ሿ Ͳǡ ൌ ൌ ܮܰܫሾ͵ሿ ൌ ൌ Ͳǡ ܷ݂݁ݎ ͺ ܷܤܵܮ ʹ͵ ʹܾ݅ݏݐ Rovnice 7 Výpočet integrální nelinearity
kde
INL[k] UINL[k] ULSB Uref bits
je je je je je
integrální nelinearita k-tého kódového slova v LSB vzdálenost pozice k-tého kódového slova oproti ideálnímu ve Voltech šířka LSB ve Voltech referenční napětí AD převodníku počet bitů AD převodníku
Příklad výpočtu integrální nelinearity z DNL, z příkladu DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x]: ݇െͳ
͵
ܮܰܫሾ݇ሿ ൌ ܮܰܦሾ݅ሿ ൌ ܮܰܫሾͶሿ ൌ ܮܰܦሾ݅ሿ ൌ െሺͲ െ Ͳǡ ͳǡሻ ൌ െͲǡ ݅ൌͳ
݅ൌͳ
Rovnice 8 Příklad výpočtu integrální nelinearity z DNL
2.6.2. Hlavička, parametry, podmínky Hlavička funkce pro stanovení integrální nelinearity AD převodníku: int intnonlin(unsigned char bits, double Uref, double * Uin, unsigned long * ADcode, unsigned long length, unsigned long ** ADcode_s, double ** INL);
24
Software pro testování AD převodníků 2.6 Integrální nelinearita (výpočet z DNL) Blokové schéma funkce integrální nelinearity pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 12 Blok funkce integrální nelinearity (výpočet z DNL)
Vstupní parametry: bits počet bitů AD převodníku Uref referenční napětí AD převodníku [V] Uin pole vstupních napětí AD převodníku (po korekci chyby nuly a chyby zesílení) ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin length délka polí Uin a ADcode Výstupní parametry: ADcode_s pole kódových slov, které odpovídají poli INL, délka tohoto pole je 2bits INL pole integrální nelinearity, délka tohoto pole je 2bits Výsledek funkce: 0 výpočet proběhl v pořádku −1 chyba ve vstupních parametrech −2 chyba při výpočtu DNL Podmínky funkce: Pole Uin a ADcode musí být seřazeny dle kapitoly 3.1. Výsledek INL prvního a posledního kódového slova je vždy 0 LSB (INL[0] = INL[2bits − 1] = 0 LSB) 2.6.3. Popis algoritmu Ve funkci intnonlin() se využívá funkce difnonlin() pro výpočet diferenciální nelinearity (viz 2.5). Po výpočtu DNL se stanoví INL ze záporného součtu DNL dle definice (viz 2.6.1). Funkce potřebuje pro svou činnost funkci difnonlin(). 2.6.4. Příklad funkce v C Použití funkce integrální nelinearity je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3;
25
Software pro testování AD převodníků 2.6 Integrální nelinearita (výpočet z DNL) double Uref = 8; double Uin[8] = {0, 1.5, 2, 2.2, 3.5, 4, 4.5, 5}; unsigned long ADcode[8] = {0, 1, 2, 3, 5, 6, 7, 7}; unsigned long length = 8; double zeroerr; double gainerr; unsigned long * ADcode_s; double * INL; adstaticsort(bits,Uin,ADcode,length); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); zerocorrection(bits, Uref, zeroerr, length, Uin); gainerror(bits, Uref, Uin, ADcode, length, &gainerr); gaincorrection(bits, Uref, gainerr, length, Uin); intnonlin(bits, Uref, Uin, ADcode, length, &ADcode_s, &INL); printf("INL of this ADC is:\n"); printf("ADcode [%d; %d; %d; %d; %d; %d; %d; %d]\n",ADcode_s[0], ADcode_s[1],ADcode_s[2],ADcode_s[3],ADcode_s[4],ADcode_s[5],ADcode_s[6], ADcode_s[7]); printf("INL [%f; %f; %f; %f; %f; %f; %f; %f] LSB\n",INL[0],INL[1], INL[2],INL[3],INL[4],INL[5],INL[6],INL[7]); free(ADcode_s); free(INL); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku (viz 2.6.1). Pro jednoduchost a názornost je průběh vzorkován nepravidelně jen v přechodových úrovních, v praxi je nastavováno vstupní napětí ADC po pevném kroku. Funkce adstaticsort() seřadí pole Uin a ADcode dle podmínky (viz 2.6.2). (pro úplnost – v tomto případě není řazení nutné, vstupní hodnoty jsou zadány seřazeně dle požadavku). Funkce zeroerror() vypočte chybu nuly a uloží do proměnné zeroerr, ta slouží jako vstupní parametr pro funkci zerocorrection() a je provedena korekce chyby nuly. Funkce gainerror () vypočte chybu zesílení a uloží do proměnné gainerr, ta slouží jako vstupní parametr pro funkci gaincorrection() a je provedena korekce chyby zesílení. Tyto korekce jsou nutné dle definice INL. Funkcí intnonlin() je stanovena integrální nelinearita. Výsledek je formě dvojice: kódové slovo v poli ADcode_s a k tomu odpovídající integrální nelinearita v poli INL. Nakonec jsou výsledky vypsány. Výsledek: INL of this ADC is: ADcode [0; 1; 2; 3; 4; 5; 6; 7] INL [0.000000; 0.000000; 0.600000; -1.000000; 0.000000; 0.000000; 0.000000; 0.000000] LSB
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány funkce adstaticsort(), zeroerror(), zerocorrection(), gainerror(), gaincorrection() a intnonlin() na výsledek. V praktickém použití je
26
Software pro testování AD převodníků 2.6 Integrální nelinearita (výpočet z DNL) doporučeno testovat funkce na nulovost (viz 2.1.2, 2.2.2, 2.3.2, 2.4.2, 2.6.2), jen tehdy je zaručeno, že funkce proběhly v pořádku. 2.6.5. Příklad funkce v konzolové aplikaci Parametr –ic určuje funkci aplikace pro výpočet integrální nelinearity, zahrnuje korekci chyby nuly a chyby zesílení. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –ic ADC_test.csv 3 8 adstatic.exe –ic ADC_test.csv 3 8 –file inl.csv
V prvním příkladě bude výsledek vypsán na obrazovku (ADcode s odpovídající INL), ve druhém uložen do souboru inl.csv, ve formátu (ADcode, INL). Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.7. Integrální nelinearita 2 (výpočet ze středu kódového slova) Integrální nelinearita 2 AD převodníků (INL2) určuje napěťovou pozici středu kódového slova. 2.7.1. Definice Integrální nelinearita 2 je rozdíl pozice středu kódového slova oproti pozici středu ideálního kódového slova v LSB. Střed kódového slova je aritmetický střed minimálního a maximálního vstupního napětí, kdy AD převodník generuje toto kódové slovo na výstup. Ideální pozice středu ktého kódového slova je k·LSB + 0,5·LSB. Integrální nelinearita 2 není definovaná pro první a poslední kódové slovo (00..00 a 11..11)! Pro stanovení integrální nelinearity 2 je nutno provést korekci chyby nuly a chyby zesílení. Příklad: Integrální nelinearita 2 je ukázána na následujícím příkladu Obrázek 11 – černý průběh po korekci chyby nuly a chyby zesílení (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0 LSB (po korekci); chyba zesílení = 0 LSB (po korekci); DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL2 = [x; 0; −0,3; 0,2; 0,5; 0; 0; x] LSB). Černé tečky znázorňují střed kódového slova AD převodníku z příkladu a zelené tečky znázorňují ideální střed kódového slova:
Obrázek 13 Příklad integrální nelinearity 2 (výpočet ze středu kódového slova)
27
Software pro testování AD převodníků 2.7 Integrální nelinearita 2 (výpočet ze středu kódového slova) kde
ADcode Uin ideal UINL2[k]
je je je je
výstup AD převodníku – kódové slovo vstupní napětí AD převodníku průběh ideálního AD převodníku – zelený průběh vzdálenost středu k-tého kódového slova oproti ideálnímu středu ve Voltech
Integrální nelinearita 2 je udávána v LSB: ʹܮܰܫሾ݇ሿ ൌ
ܷʹܮܰܫሾ݇ሿ ܷʹܮܰܫሾ݇ሿ െͲǡ͵ ൌ ൌ ʹܮܰܫሾʹሿ ൌ ൌ െͲǡ͵ ܷ݂݁ݎ ͺ ܷܤܵܮ ͵ ʹ ʹܾ݅ݏݐ Rovnice 9 Výpočet integrální nelinearity 2
kde
INL2[k] UINL2[k] ULSB Uref bits
je je je je je
integrální nelinearita 2 k-tého kódového slova v LSB vzdálenost středu k-tého kódového slova oproti ideálnímu středu ve Voltech šířka LSB ve Voltech referenční napětí AD převodníku počet bitů AD převodníku
2.7.2. Hlavička, parametry, podmínky Hlavička funkce pro stanovení integrální nelinearity 2 AD převodníku: int intnonlin2(unsigned char bits, double Uref, double * Uin, unsigned long * ADcode, unsigned long length, unsigned long ** ADcode_s, double ** INL2);
Blokové schéma funkce INL2 pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 14 Blok funkce integrální nelinearity 2 (výpočet ze středu kódového slova)
Vstupní parametry: bits počet bitů AD převodníku Uref referenční napětí AD převodníku [V] Uin pole vstupních napětí AD převodníku (po korekci chyby nuly a chyby zesílení) ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin length délka polí Uin a ADcode Výstupní parametry: ADcode_s pole kódových slov, které odpovídají poli INL, délka tohoto pole je 2bits INL2 pole integrální nelinearity 2, délka tohoto pole je 2bits
28
Software pro testování AD převodníků 2.7 Integrální nelinearita 2 (výpočet ze středu kódového slova) Výsledek funkce: 0 výpočet proběhl v pořádku −1 chyba ve vstupních parametrech Podmínky funkce: Pole Uin a ADcode musí být seřazeny dle kapitoly 3.1. Výsledek INL2 prvního a posledního kódového slova je vždy 0 LSB (INL2[0] = INL2[2bits − 1] = 0 LSB) 2.7.3. Popis algoritmu Algoritmus pro výpočet předpokládá seřazené pole dle podmínky (viz 2.7.2). Pro každé kódové slovo hledá počáteční přechodovou úroveň (minimální vstupní napětí generující toto kódové slovo). Polovina rozdílu aktuální přechodové úrovně a přechodové úrovně následujícího kódového slova pozice určuje střed aktuálního kódového slova. Rozdíl od ideální pozice středu k-tého kódového slova, která se určí jako k LSB + 0,5 LSB, je integrální nelinearita 2. 2.7.4. Příklad funkce v C Použití funkce integrální nelinearity 2 je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double Uin[8] = {0, 1.5, 2, 2.2, 3.5, 4, 4.5, 5}; unsigned long ADcode[8] = {0, 1, 2, 3, 5, 6, 7, 7}; unsigned long length = 8; double zeroerr; double gainerr; unsigned long * ADcode_s; double * INL2; adstaticsort(bits,Uin,ADcode,length); zeroerror(bits, Uref, Uin, ADcode, length, &zeroerr); zerocorrection(bits, Uref, zeroerr, length, Uin); gainerror(bits, Uref, Uin, ADcode, length, &gainerr); gaincorrection(bits, Uref, gainerr, length, Uin); intnonlin2(bits, Uref, Uin, ADcode, length, &ADcode_s, &INL2); printf("INL2 of this ADC is:\n"); printf("ADcode [%d; %d; %d; %d; %d; %d; %d; %d]\n",ADcode_s[0], ADcode_s[1],ADcode_s[2],ADcode_s[3],ADcode_s[4],ADcode_s[5],ADcode_s[6], ADcode_s[7]); printf("INL2 [%f; %f; %f; %f; %f; %f; %f; %f] LSB\n",INL2[0],INL2[1], INL2[2],INL2[3],INL2[4],INL2[5],INL2[6],INL2[7]); free(ADcode_s); free(INL2);
29
Software pro testování AD převodníků 2.7 Integrální nelinearita 2 (výpočet ze středu kódového slova) return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku 2.7.1. Pro jednoduchost a názornost je průběh vzorkován nepravidelně jen v přechodových úrovních, v praxi je nastavováno vstupní napětí ADC po pevném kroku. Funkce adstaticsort() seřadí pole Uin a ADcode dle podmínky viz 2.7.2. (pro úplnost – v tomto případě není řazení nutné, vstupní hodnoty jsou zadány seřazeně dle požadavku). Funkce zeroerror() vypočte chybu nuly a uloží do proměnné zeroerr, ta slouží jako vstupní parametr pro funkci zerocorrection() a je provedena korekce chyby nuly. Funkce gainerror () vypočte chybu zesílení a uloží do proměnné gainerr, ta slouží jako vstupní parametr pro funkci gaincorrection() a je provedena korekce chyby zesílení. Tyto korekce jsou nutné dle definice INL2. Funkcí intnonlin2() je stanovena integrální nelinearita 2. Výsledek je formě dvojice: kódové slovo v poli ADcode_s a k tomu odpovídající integrální nelinearita v poli INL2. Nakonec jsou výsledky vypsány. Výsledek: INL2 of this ADC is: ADcode [0; 1; 2; 3; 4; 5; 6; 7] INL2 [0.000000; 0.000000; -0.300000; 0.200000; 0.500000; 0.000000; 0.000000; 0.000000] LSB
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány funkce adstaticsort(), zeroerror(), zerocorrection(), gainerror(), gaincorrection() a intnonlin2() na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost (viz 2.1.2, 2.2.2, 2.3.2, 2.4.2, 2.7.2), jen tehdy je zaručeno, že funkce proběhly v pořádku. 2.7.5. Příklad funkce v konzolové aplikaci Parametr –i2c určuje funkci aplikace pro výpočet integrální nelinearity 2, zahrnuje korekci chyby nuly a chyby zesílení. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –i2c ADC_test.csv 3 8 adstatic.exe –i2c ADC_test.csv 3 8 –file inl2.csv
V prvním příkladě bude výsledek vypsán na obrazovku (ADcode s odpovídající INL2), ve druhém uložen do souboru inl2.csv, ve formátu (ADcode, INL2). Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.8. DNL a INL z histogramu Výpočet diferenciální a integrální nelinearity AD převodníků statistickou metodou – výpočet z histogramu (DNLh a INLh).
30
Software pro testování AD převodníků 2.8 DNL a INL z histogramu 2.8.1. Definice Diferenciální nelinearita je rozdíl šířky kódového slovo oproti šířce ideálního kódového slova v LSB. Šířka kódového slova se určuje jako poměr počet výskytů kódových slov k ideálnímu počtu výskytů. Předpokládá se rovnoměrné rozložení histogramu pro každé kódové slovo, ideální počet výskytů je stanoven jako průměr výskytů ze všech kódových slov kromě prvního a posledního kódového slova (00..00 a 11..11). Ideální šířka kódového slova je 1 LSB. ݄ܮܰܦሾ݇ሿ ൌ
݇ܿܿ െ ͳ ݈ܽ݁݀݅ܿܿ
Rovnice 10 Diferenciální nelinearita z histogramu
kde
DNLh[k] je diferenciální nelinearita k-tého kódového slova vypočtená z histogramu k ϵ <1; 2bits – 2) occk je počet výskytů k-tého kódového slova v histogramu occideal je ideální počet výskytů kódového slova v histogramu ݈ܽ݁݀݅ܿܿൌ
݊ܿܿെ Ͳܿܿെ ݏݐܾ݅ʹܿܿെͳ ʹܾ݅ ݏݐെ ʹ
Rovnice 11 Ideální počet výskytů kódového slova v histogramu
kde
occn occ0 occ2bits−1 bits
je je je je
počet výskytů všech kódových slov v histogramu odpovídá délce pole ADcode počet výskytů prvního kódového slova (ADcode = 0) v histogramu počet výskytů posledního kódového slova (ADcode = 2bits – 1) v histogramu počet bitů AD převodníku
Integrální nelinearita je vypočtena jako záporný součet předchozích diferenciálních nelinearit (stejně jako v 2.6). Integrální nelinearita z histogramu pro k-té kódové slovo: ݇െͳ
݄ܮܰܫሾ݇ሿ ൌ െ ݄ܮܰܦሾ݅ሿ ݅ൌͳ
Rovnice 12 Integrální nelinearita z histogramu
Diferenciální a integrální nelinearita není definovaná pro první a poslední kódové slovo (00..00 a 11..11)! Pokud k-té kódové slovo chybí potom DNLh[k] = −1 LSB. Pro stanovení diferenciální a integrální nelinearity není nutné provést korekci chyby nuly a chyby zesílení. Příklad: Výpočet DNLh a INLh bude ukázán na následujícím přikladu (3 bitový AD převodník; referenční napětí UREF = 8 V; chyba nuly = 0,5 LSB; chyba zesílení = −3 LSB; DNL = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INL = [x; 0; 0,6; −1; 0; 0; 0; x] LSB); DNLh = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB; INLh = [x; 0; 0,6; −1; 0; 0; 0; x] LSB. Vstupní signál: rampa 0 až 5 V; vzorky po kroku 0,1 V. Černé tečky (červené úrovně) znázorňují jednotlivé vzorky výstupu podle nastaveného vstupního napětí:
31
Software pro testování AD převodníků 2.8 DNL a INL z histogramu
Obrázek 15 Příklad průběhu pro stanovení DNL a INL z histogramu
kde
ADcode je výstup AD převodníku – kódové slovo Uin je vstupní napětí AD převodníku
Histogram (výskyt kódových slov) předcházejícího průběhu:
Obrázek 16 Příklad histogramu pro stanovení DNL a INL
kde
ADcode je occurence je ADcode width je ideal occurence je
výstup AD převodníku – kódové slovo počet vzorků na kódové slovo (počet výskytů kódového slova) šířka kódového slova v LSB (z počtu výskytů kódového slova) ideální šířka kódového slova v LSB (ideální počet výskytů kódového slova)
Horní osa (Obrázek 16) ADcode width znázorňuje vazbu mezi šířkou slova a počtem výskytů kódových slov. Stanovení ideální počtu výskytů kódového slova (Rovnice 11): ݈ܽ݁݀݅ܿܿൌ
݊ܿܿെ Ͳܿܿെ ݏݐܾ݅ʹܿܿെͳ ͷͳ െ ͳͷ െ ൌ ൌͷ ʹ͵ െ ʹ ʹܾ݅ ݏݐെ ʹ
Rovnice 13 Příklad výpočtu ideálního počtu výskytů kódového slova
32
Software pro testování AD převodníků 2.8 DNL a INL z histogramu Výpočet diferenciální nelinearity z histogramu (Rovnice 10), DNLh = [x; 0; −0,6; 1,6; −1; 0; 0; x] LSB, příklad pro ADcode = 2: ݄ܮܰܦሾ݇ሿ ൌ
݇ܿܿ ʹ െ ͳ ൌ ݄ܮܰܦሾʹሿ ൌ െ ͳ ൌ െͲǡ ͷ ݈ܽ݁݀݅ܿܿ
Rovnice 14 Příklad výpočtu diferenciální nelinearity z histogramu
Výpočet integrální nelinearity z histogramu (Rovnice 12), INLh = [x; 0; 0,6; −1; 0; 0; 0; x] LSB, příklad pro ADcode = 3: ݇െͳ
ʹ
݄ܮܰܫሾ݇ሿ ൌ െ ݄ܮܰܦሾ݅ሿ ൌ ݄ܮܰܫሾ͵ሿ ൌ െ ݄ܮܰܦሾ݅ሿ ൌ െሺͲ െ Ͳǡ ͳǡሻ ൌ െͳ ݅ൌͳ
݅ൌͳ
Rovnice 15 Příklad výpočtu integrální nelinearity z histogramu
2.8.2. Hlavička, parametry, podmínky Hlavička funkce pro stanovení histogramu výstupu, diferenciální nelinearity z histogramu a integrální nelinearity z histogramu AD převodníku: int histDINL(unsigned char bits, unsigned long * ADcode, unsigned long length, unsigned long ** ADcode_s, unsigned long ** hist, double ** DNLh, double ** INLh);
Blokové schéma funkce DNL a INL z histogramu pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 17 Blok funkce DNL a INL z histogramu
Vstupní parametry: bits počet bitů AD převodníku ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin length délka polí Uin a ADcode Výstupní parametry: ADcode_s pole kódových slov, které pozicí odpovídají polím hist, DNLh a INLh, délka tohoto pole je 2bits hist pole histogramu (počet výskytů ADcode), délka tohoto pole je 2bits
33
Software pro testování AD převodníků 2.8 DNL a INL z histogramu DNLh INLh
pole diferenciální nelinearity vypočtené z histogramu, délka tohoto pole je 2bits pole integrální nelinearity vypočtené z histogramu, délka tohoto pole je 2bits
Výsledek funkce: 0 výpočet proběhl v pořádku −1 chyba ve vstupních parametrech −2 chyba při stanovení histogramu −3 occideal (ideální počet výskytů ADcode) vyšlo menší než 1 (málo vzorků ADcode) −4 vstupní parametr bits je 1 Podmínky funkce: Pro stanovení diferenciální a integrální nelinearity z histogramu s vyšší přesností je doporučeno velké množství vstupních dat (např. pro deset vzorků na jedno kódové slovo lze stanovit DNL a INL nejlépe s přesností desetiny, 0,1 LSB). Vstupní data ADcode jsou předpokládány s rovnoměrným rozdělením (jako vstupní signál AD převodníku Uin např. rampa rozsah <0; Uref>, použijte vícero měření pro zajištění velkého množství vstupních dat). 2.8.3. Popis algoritmu Algoritmus nepotřebuje informaci o vstupním napětí převodníků, protože vypočítá DNL a INL statistickou metodou. Proto je nejdříve z pole kódových slov ADcode stanoven histogram. Z celkového počtu vzorků bez prvního a posledního kódového slova a z počtu bitů převodníku je stanoven ideální počet výskytů kódového slova (viz 2.8.1 Rovnice 11). Poté v cyklu přes všechna kódová slova je porovnáním počtu výskytů jednotlivých kódových slov a ideálního počtu výskytů stanovena diferenciální nelinearita DNLh (viz 2.8.1 Rovnice 10). Zároveň je v cyklu držen záporný součet předchozích DNLh pro stanovení integrální nelinearity INLh (viz 2.8.1 Rovnice 12). 2.8.4. Příklad funkce v C Použití funkce DNL a INL z histogramu je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double Uin[51] = {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2, 1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1, 3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5}; unsigned long ADcode[51] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,7}; unsigned long length = 51; unsigned long * ADcode_s; unsigned long * hist; double * DNLh; double * INLh; histDINL(bits, ADcode, length, &ADcode_s, &hist, &DNLh, &INLh);
34
Software pro testování AD převodníků 2.8 DNL a INL z histogramu
printf("Histogram, DNLh and INLh of this ADC are:\n"); printf("ADcode [%d; %d; %d; %d; %d; %d; %d; %d]\n",ADcode_s[0],ADcode_s[1],ADcode_s[2],ADcode_s[3],ADcode_s[4],ADcode_s [5],ADcode_s[6],ADcode_s[7]); printf("Histogram [%dx; %dx; %dx; %dx; %dx; %dx; %dx; %dx]\n",hist[0],hist[1],hist[2],hist[3],hist[4],hist[5],hist[6],hist[7]); printf("DNLh [%f; %f; %f; %f; %f; %f; %f; %f] LSB\n",DNLh[0],DNLh[1],DNLh[2],DNLh[3],DNLh[4],DNLh[5],DNLh[6],DNLh[7]); printf("INLh [%f; %f; %f; %f; %f; %f; %f; %f] LSB\n",INLh[0],INLh[1],INLh[2],INLh[3],INLh[4],INLh[5],INLh[6],INLh[7]); free(ADcode_s); free(hist); free(DNLh); free(INLh); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku (viz 2.8.1). Pole vstupních napětí Uin není potřeba jako vstupní parametr pro funkci histDINL(). Ta vypočte histogram výstupních kódových slov AD převodníku a z něho určí diferenciální a integrální nelinearitu statistickou metodou. Výsledek DNLh nebo INLh je formě páru s ADcode_s: kódové slovo v poli ADcode_s a k tomu odpovídající diferenciální nebo integrální nelinearita v polích DNLh nebo INLh. Nakonec jsou výsledky vypsány. Výsledek: Histogram, DNLh and INLh of this ADC are: ADcode [0; 1; 2; 3; 4; 5; 6; 7] Histogram [15x; 5x; 2x; 13x; 0x; 5x; 5x; 6x] DNLh [0.000000; 0.000000; -0.600000; 1.600000; -1.000000; 0.000000; 0.000000; 0.000000] LSB INLh [0.000000; 0.000000; 0.600000; -1.000000; 0.000000; 0.000000; 0.000000; 0.000000] LSB
Pozn. Pro jednoduchost není v tomto příkladě testována funkce histDINL() na výsledek. V praktickém použití je doporučeno testovat funkci na nulovost (viz 2.8.2), jen tehdy je zaručeno, že funkce proběhla v pořádku. 2.8.5. Příklad funkce v konzolové aplikaci Parametry –h, –hd a –hi určují funkci aplikace pro výpočty histogramu, diferenciální a integrální nelinearity z histogramu. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –h ADC_test.csv 3 8 adstatic.exe –hd ADC_test.csv 3 8 adstatic.exe –hi ADC_test.csv 3 8
35
Software pro testování AD převodníků 2.8 DNL a INL z histogramu adstatic.exe –h ADC_test.csv 3 8 –file hist.csv adstatic.exe –hd ADC_test.csv 3 8 –file dnlh.csv adstatic.exe –hi ADC_test.csv 3 8 –file inlh.csv
V prvních třech příkladech budou výsledky (histogram, DNL z histogramu a INL z histogramu) vypsány na obrazovku spolu s ADcode, ve druhé trojici budou výsledky uloženy do souborů. Histogram do hist.csv, diferenciální nelinearita do dnlh.csv a integrální nelinearita do inlh.csv ve formátu (ADcode, hist nebo INLh nebo DNLh). Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
2.9. Test monotónnosti Funkce pro ověření monotónnosti výstupu při rostoucím vstupním napětí AD převodníků. 2.9.1. Definice Test monotónnosti se vždy provádí při vstupním rostoucím signálu (typ rampa). Monotónní AD převodník má neklesající výstup při rostoucím vstupním napětí. Při testu monotónnosti se vyhodnocují dva parametry: počet chyb monotónnosti (poklesů) na aktuální kódové slovo a kvadratický průměr chyb monotónnosti (poklesů). Příklad: Test monotónnosti bude ukázán na následujícím přikladu (3 bitový AD převodník; referenční napětí UREF = 8 V; počet chyb monotónnosti mnterrn = [0; 1; 0; 0; 2; 1; 1; 0]; kvadratický průměr chyb mntsigma = [0; 1; 0; 0; 1,5811; 1; 1; 0]) LSB. Černé tečky znázorňují jednotlivé vzorky výstupu podle nastaveného vstupního napětí, červené šipky znázorňují jednotlivé chyby monotónnosti, délka červených šipek znázorňuje hodnotu chyby errv v LSB, zelený průběh znázorňuje ideální průběh 3 bitového AD převodníku:
Obrázek 18 Příklad průběhu pro test monotónnosti
kde
ADcode je výstup AD převodníku – kódové slovo Uin je vstupní napětí AD převodníku ideal je zelený ideální průběh 3 bitového AD převodníku
36
Software pro testování AD převodníků 2.9 Test monotónnosti Výpočet kvadratického průměru chyb monotónnosti, příklad pro ADcode = 4:
ͳ ݉݊ܽ݉݃݅ݏݐሾ݇ሿ ൌ ඩ ݉݊݊ݎݎ݁ݐሾ݇ሿ
݉݊ ݊ݎݎ݁ݐሾ݇ሿ
݅ൌͳ
ͳ ݉݊ݒݎݎ݁ݐሾ݅ሿʹ ൌ ݉݊ܽ݉݃݅ݏݐሾͶሿ ൌ ඨ ሺͳʹ ʹʹ ሻ ൌ ʹ
ൌ ͳǡͷͺͳͳ Rovnice 16 Příklad výpočtu kvadratického průměru chyb monotónnosti
Kde
mntsigma[k] je kvadratický průměr chyb monotónnosti k-tého kódového slova mnterrn[k] je počet chyb monotónnosti k-tého kódového slova mnterrv[i] je hodnota jednotlivých chyb monotónnosti aktuálního kódového slova (délka červených šipek Obrázek 18)
2.9.2. Hlavička, parametry, podmínky Hlavička funkce pro test monotónnosti AD převodníku: int monotonicity(unsigned char bits, double * Uin, unsigned long * ADcode, unsigned long length, unsigned long ** ADcode_s, unsigned long ** mnterrn, double ** mntsigma);
Blokové schéma funkce test monotónnosti pro znázornění vstupních a výstupních parametrů funkce:
Obrázek 19 Blok funkce test monotónnosti
Vstupní parametry: bits počet bitů AD převodníku Uin pole vstupních napětí AD převodníku (kvůli řazení ADcode) ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin length délka polí Uin a ADcode Výstupní parametry: ADcode_s pole kódových slov, které pozicí odpovídají polím mnterrn a mntsigma, délka tohoto pole je 2bits mnterrn pole počtů chyb monotónnosti u kódových slov, délka tohoto pole je 2bits mntsigma pole kvadratických průměrů chyb monotónnosti u kódových slov, délka tohoto pole je 2bits
37
Software pro testování AD převodníků 2.9 Test monotónnosti Výsledek funkce: 0 výpočet proběhl v pořádku −1 chyba ve vstupních parametrech −2 chyba při duplikaci polí Uin a ADcode −3 chyba při seřazování pole Uin a jemu odpovídajícímu ADcode Podmínky funkce: Pro test monotónnosti je potřeba dvojici polí Uin (vstupní napětí) a ADcode (výstupní kódové slovo) seřadit vzestupně podle pole Uin (jako signál typu rampa). Funkce toto řazení obsahuje, tudíž není potřeba řazení předem. Pole předávána parametrem nebudou ovlivněny (uvnitř funkce se řadí kopie těchto polí). 2.9.3. Popis algoritmu Algoritmus nejdříve vytvoří kopii polí Uin a ADcode a ty pak seřadí vzestupně podle pole Uin (viz definice 2.9.1 a podmínka 2.9.2). Poté se průběh v cyklu kontroluje zda výstup ADcode neklesá. Během každého cyklu se ukládá poslední kódová úroveň ADcode, která se porovnává s následující zdali neklesla. Pokud se vyskytne chyba monotónnosti (ADcode oproti minulé úrovni poklesne), je zvýšen počet chyb monotónnosti tomu kódovému slovu ze kterého došlo k poklesu a zároveň je přičten kvadrát hodnoty poklesu. Po ukončení cyklu je součet kvadrátů chyb vydělen počtem chyb a odmocněn (viz Rovnice 16). Tím je stanoven kvadratický průměr chyb monotónnosti u jednotlivých kódových slov. 2.9.4. Příklad funkce v C Použití funkce test monotónnosti je v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double Uin[81] = {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2, 1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1, 3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5, 5.1,5.2,5.3,5.4,5.5,5.6,5.7,5.8,5.9,6,6.1,6.2,6.3,6.4,6.5,6.6,6.7,6.8,6.9, 7,7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.8,7.9,8}; unsigned long ADcode[81] = {0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1, 2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,3,3,4,4,2,2,4,4,6,6,6,5,5,5,5, 5,5,5,4,4,4,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7}; unsigned long length = 81; unsigned long * ADcode_s; unsigned long * mnterrn; double * mntsigma; monotonicity(bits,Uin,ADcode,length,&ADcode_s,&mnterrn,&mntsigma); printf("Monotonicity test of this ADC resulted:\n");
38
Software pro testování AD převodníků 2.9 Test monotónnosti printf("ADcode [%d; %d; %d; %d; %d; %d; %d; %d]\n",ADcode_s[0], ADcode_s[1],ADcode_s[2],ADcode_s[3],ADcode_s[4],ADcode_s[5],ADcode_s[6], ADcode_s[7]); printf("Number of monotonicity errors [%d; %d; %d; %d; %d; %d; %d; %d]\n",mnterrn[0],mnterrn[1],mnterrn[2],mnterrn[3],mnterrn[4],mnterrn[5], mnterrn[6],mnterrn[7]); printf("Square mean of monotonicity errors [%f; %f; %f; %f; %f; %f; %f; %f] LSB\n",mntsigma[0],mntsigma[1],mntsigma[2],mntsigma[3],mntsigma[4], mntsigma[5],mntsigma[6],mntsigma[7]); free(ADcode_s); free(mnterrn); free(mntsigma); return (0); }
Vstupní proměnné jsou naplněny daty z příkladu AD převodníku 2.9.1. Pole Uin a ADcode jsou zadána již vzestupně seřazená podle Uin. Funkce monotonicity() provede test monotónnosti a uloží výsledky: počet chyb monotónnosti – pole mnterrn, kvadratický průměr chyb monotónnosti – pole mntsigma a kódová slova, která odpovídají pozicí poli chybám – pole ADcode_s. Pro funkci monotonicity() není podmínkou, aby vstupní pole byla seřazená ta si pole seřadí sama. Nakonec jsou výsledky vypsány. Výsledek: Monotonicity test of this ADC resulted: ADcode [0; 1; 2; 3; 4; 5; 6; 7] Number of monotonicity errors [0; 1; 0; 0; 2; 1; 1; 0] Square mean of monotonicity errors [0.000000; 1.000000; 0.000000; 0.000000; 1.581139; 1.000000; 1.000000; 0.000000] LSB
Pozn. Pro jednoduchost není v tomto příkladě testována funkce monotonicity() na výsledek. V praktickém použití je doporučeno testovat funkci na nulovost (viz 2.9.2), jen tehdy je zaručeno, že funkce proběhla v pořádku. 2.9.5. Příklad funkce v konzolové aplikaci Parametr –m určuje funkci aplikace pro test monotónnosti. Data AD převodníku jsou uloženy v souboru ADC_test.csv (první sloupec Uin, druhý ADcode), bits = 3; Uref = 8 V. adstatic.exe –m ADC_test.csv 3 8 adstatic.exe –m ADC_test.csv 3 8 –file mnt.csv
V prvním příkladě bude výsledek testu monotónnosti (počet chyb a kvadratický průměr chyb monotónnosti) vypsány na obrazovku spolu s odpovídajícím ADcode. ve druhém příkladě bude výsledek uložen do souboru mnt.csv ve formátu: ADcode, počet chyb (mnterrn), kvadratický průměr chyb (mntsigma). Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
39
Software pro testování AD převodníků 3 Doplňující funkce – statické parametry, vstup/výstup
3. Doplňující funkce – statické parametry, vstup/výstup Další doplňující funkce pro použití k funkcím stanovující statické parametry AD převodníků.
3.1. Řazení polí Uin a ADcode Funkce, které vyžadují pro stanovení statických parametrů vstupy pole vstupních napětí i pole výstupních kódových slov AD převodníku, vyžadují z definice specificky seřazená vstupní data. Jsou to funkce zeroerror(), gainerror(), difnonlin(), intnonlin() a intnonlin2(). Pole musí být seřazena nejdříve podle kódových slov (pole ADcode) vzestupně a poté je potřeba seřadit pole vstupních napětí (pole Uin) vzestupně pro každé kódové slovo samostatně. Řazení je znázorněno na následujícím příkladu (2 bitové kódové slovo, UREF = 4 V):
Obrázek 20 Příklad řazení polí Uin a ADcode – adstaticsort()
Pole vstupních napětí Uin a pole výstupních kódových slov ADcode jsou v kroku č. 1 neseřazeny. V kroku č. 2 se seřadí pole vzestupně podle ADcode. A v kroku č. 3 jsou seřazeny úseky jednotlivých kódových slov vzestupně podle Uin. Toto výsledné seřazení je požadováno pro výše uvedené funkce. 3.1.1. Hlavička, parametry Hlavička funkce pro seřazení vstupních polí (Uin, ADcode): int adstaticsort(unsigned char bits, double * Uin, unsigned long * ADcode, unsigned long length);
40
Software pro testování AD převodníků 3.1 Řazení polí Uin a ADcode Blokové schéma funkce pro řazení polí Uin a ADcode:
Obrázek 21 Blok funkce pro řazení vstupních polí Uin a ADcode
Parametry: bits Uin ADcode length
počet bitů AD převodníku pole vstupních napětí AD převodníku, bude ovlivněno řazením pole výstupních kódových slov AD převodníku, bude ovlivněno řazením délka polí Uin a ADcode
Výsledek funkce: 0 řazení polí proběhlo v pořádku −1 chybné vstupní parametry, např. délka polí −2 chyba při řazení polí podle ADcode −3 chyba při stanovení histogramu kódových slov −4 chyba při řazení polí podle Uin 3.1.2. Popis algoritmu Algoritmus pro řazení polí využívá metodu quicksort. Protože se předpokládá, že v praxi vstupní pole Uin a ADcode jsou částečně seřazena, je pivot (prvek k porovnání) zvolen ve středu řazeného pole. Pro pseudonáhodně neseřazená pole je výhodnější (z hlediska rychlosti) volit pivota náhodně [14] (viz komentáře v adstatic.c). Nejdříve jsou pole Uin a ADcode seřazena vzestupně podle pole Uin, vnořená funkce qsortADcode(). Pro seřazení polí v úsecích pro každé kódové slovo, je potřeba znát počet vzorků vstupního napětí Uin pro každé kódové slovo. Proto je vypočten histogram kódových slov – pole ADcode, vnořená funkce ADcodefreqarray(). Informace o počtu vzorků je využita při posledním řazení polí Uin a ADcode pro stanovéní začátku a konce indexů jednotlivých kódových slov. Nyní je provedeno řazení vzestupně podle Uin samostatně pro každé kódové slovo, vnořená funkce qsortUinsep(). Tímto jsou pole seřazena dle požadavku. 3.1.3. Příklad funkce v C Použití funkce adstaticsort() je ukázáno v příkladech pro stanovení statických parametrů, které toto řazení požadují (viz 2.1.4, 2.3.4, 2.5.4, 2.6.4, 2.7.4).
3.2. Vstupy/výstupy z/do csv souboru Knihovna io.c obsahuje funkce pro načítání a ukládání vstupních a výstupních dat pro statické testování AD převodníků. Při testování statických parametrů AD převodníku jsou ukládány jednotlivé vzorky vstupního napětí a odpovídající výstupní kódové slovo AD převodníku do csv souboru
41
Software pro testování AD převodníků 3.2 Vstupy/výstupy z/do csv souboru v textovém tvaru. Funkce pro načtení používají vlastní funkci převodu textového řetězce na číselné hodnoty, tím je zaručena podpora reálních hodnot v exponenciálním tvaru (123e−4 nebo 123E−4) i v desetinném tvaru (0.0123). Předpokládána je desetinná tečka. Řádky v csv souboru jsou odděleny koncem řádku (\n). Hodnoty v řádku (sloupce) mohou být odděleny jakýmkoliv znakem, avšak pro oddělení se nedoporučuje použití tečky, písmene „e“ nebo „E“ a znaménka minus. 3.2.1. Hlavička, parametry Hlavička funkce pro načtení vstupních parametrů (Uin, ADcode) z csv souboru: int csv2adcst_in(const char * csvpath, double ** Uin, unsigned long ** ADcode, unsigned long * length);
Hlavička funkce pro uložení výstupu statických funkcí do csv souboru. Výstup: pole kódových slov a pole reálných čísel, pro funkce difnonlin(), intnonlin(), intnonlin2() a histDINL() (uložení DNLh nebo INLh): int adcst_trnsfr2csv(const char * csvpath, unsigned long * ADcode_s, double * outd, unsigned long length);
Bloková schémata funkcí pro načtení/uložení vstupních/výstupních parametrů:
Obrázek 22 Blok funkce pro načtení vstupů z csv
Obrázek 23 Blok funkce pro uložení výstupů do csv
Parametry: csvpath cesta a název csv souboru Uin pole vstupních napětí AD převodníku ADcode pole výstupních kódových slov AD převodníku, odpovídající nastavenému napětí Uin
42
Software pro testování AD převodníků 3.2 Vstupy/výstupy z/do csv souboru length outd
délka polí Uin a ADcode výstupní pole typu double, které se uloží do csv souboru, např. výsledek DNL
Výsledek funkce: 0 načtení/uložení proběhlo v pořádku −1 chyba při otevření/vytvoření souboru Výše jsou uvedeny jen dva příklady pro funkce z io knihovny. Zbylé funkce se liší jen typem a počtem parametrů, např. pro ukládání výsledku testu monotónnosti nebo pro načítání jen kódových slov pro statistické stanovení integrální a diferenciální nelinearity (INLh a DNLh). Kompletní výčet funkcí a jejich popis jsou k nalezení v knihovně io.c. 3.2.2. Příklad funkce v C Použití funkcí pro načtení/uložení vstupů/výstupů je ukázáno v následujícím příkladu: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; double * Uin; unsigned long * ADcode; unsigned long length; double zeroerr; double gainerr; unsigned long * ADcode_s; double * DNL; if (csv2adcst_in("ADC_test.csv", &Uin, &ADcode, &length) != 0) { printf("Error while opening input ADC file."); return (-1); } adstaticsort(bits, Uin, ADcode, length); zeroerror(bits,Uref,Uin,ADcode,length,&zeroerr); zerocorrection(bits,Uref,zeroerr,length,Uin); gainerror(bits,Uref,Uin,ADcode,length,&gainerr); gaincorrection(bits,Uref,gainerr,length,Uin); difnonlin(bits, Uref, Uin, ADcode, length, &ADcode_s, &DNL); if (adcst_trnsfr2csv("ADC_DNL.csv", ADcode_s, DNL, pow(2,bits))!= 0) { printf("Error while saving DNL file."); return (-2); } return (0); }
43
Software pro testování AD převodníků 3.2 Vstupy/výstupy z/do csv souboru
V tomto příkladě je ukázáno použití funkce načtení vstupních parametrů Uin a ADcode z csv souboru a použití funkce pro uložení výsledků diferenciální nelinearity. Nejdříve jsou pomocí funkce csv2adcst_in() načteny pole Uin a ADcode ze souboru ADC_test.csv. Funkce je testována na nulovost, zda proběhlo načtení v pořádku (viz 3.2.1). Ve vstupním souboru ADC_test.csv je uložen průběh z příkladu definice diferenciální nelinearity (viz 2.5.1) bez korekce chyby nuly a zesílení. Proto jsou nejdříve provedeny tyto korekce a až poté vypočtena diferenciální nelinearita funkcí difnonlin(). Výsledek DNL, seřazené pole kódových slov a k nim odpovídající diferenciální nelinearita, je uložen pomocí funkce adcst_trnsfr2csv() do csv souboru ADC_DNL.csv. Funkce je testována na nulovost, zda proběhlo uložení v pořádku (viz 3.2.1).
3.3. Kvantizátor s definovatelnými statickými parametry Další doplňková funkce je model kvantizátoru. Jedná se o model AD převodníku, který převádí vzorky vstupních napětí (analogová) na výstupní kódová slova (digitální). U tohoto modelu lze definovat tyto statické parametry: chyba nuly, chyba zesílení a diferenciální nelinearita. Dále je možné vstupním parametrem zvolit zda vstupní průběh je monotónní (např. rampa) nebo nemonotónní. Volba monotónnosti ovlivňuje použití vyhledávacího algoritmu pro stanovení kódového slova. Pro monotónní průběh se použije vyhledávání pouze z následujících kódových slov (monotónní vyhledávání – ideální výkon a jen pro vzestupně seřazené pole Uin) a pro nemonotónní průběh se použije binární vyhledávání (použitelné kdykoliv – ideální výkon pro pseudonáhodně seřazené pole [15]). 3.3.1. Hlavička, parametry Hlavička funkce – kvantizátor s definovatelnými statickými parametry: int quantizer(unsigned char bits, double Uref, double * Uin, unsigned long length, double zeroerr, double gainerr, double * DNL, unsigned char mntnous, unsigned long ** ADcode);
Blokové schéma funkce kvantizátoru s definovatelnými statickými parametry:
Obrázek 24 Blokové schéma funkce kvantizátoru
44
Software pro testování AD převodníků 3.3 Kvantizátor s definovatelnými statickými parametry Parametry: bits Uref Uin length zeroerr gainerr DNL
počet bitů AD převodníku/kvantizátoru referenční napětí AD převodníku/kvantizátoru pole vstupních napětí, které má být převedeno na kódová slova délka pole Uin a také délka výstupního pole ADcode požadovaná chyba nuly kvantizátoru v LSB požadovaná chyba zesílení kvantizátoru v LSB pole požadované diferenciální nelinearity v LSB, pozice v poli odpovídá kódovému slovu, délka pole musí být 2bits, bez diferenciální nelinearity zadejte ukazatel NULL mntnous typ vyhledávání: 0 pro binární vyhledávání, 1 pro monotónní, výchozí hodnota 0 ADcode pole výstupních převedených kódových slov, délka tohoto pole je length
Výsledek funkce: 0 funkce proběhla v pořádku −1 chybné vstupní parametry, např. délka pole length −11 parametr bits je 1 3.3.2. Popis algoritmu Algoritmus kvantizátoru je rozdělen do dvou částí. V první části je nutno vypočítat napěťové úrovně kódových slov pro převod s ohledem na zadané statické parametry. V druhé části se pro jednotlivé vzorky vstupního napětí hledají tyto úrovně a každému vzorku se přiřadí kódové slovo. Nejdříve je nutno vyšetřit několik variant kombinací statických parametrů. Pro převodník bez chyby nuly, bez chyby zesílení a bez diferenciální nelinearity se generují ideální napěťové úrovně (každá úroveň má šířku LSB Voltů). Chyba nuly posunuje všechny napěťové úrovně o její hodnotu (viz 2.1.1, 2.2.1, Rovnice 2). Při požadované diferenciální nelinearitě se nejdříve stanoví pozice první přechodové úrovně (ADcode = 1), kde je definována chyba nuly. Poté se musí šířka každé následující komparační napěťové úrovně vypočítat z pole DNL (viz 2.5.1). Chyba zesílení se aplikuje až nakonec (viz 2.3.1, 2.4.1, Rovnice 4), kdy se přepočte směrnice zesílení a podle ní upraví napěťové úrovně (první úroveň je nedotčena pro zachování chyby nuly). Následuje druhá část algoritmu. Podle vstupního parametru mntnous se vybere typ vyhledávání ve vytvořené převáděcí tabulce. Monotónní vyhledávání požaduje seřazené vstupní pole vzorků, a proto vyhledává jen z aktuální a následujících kódových úrovní. Binární vyhledávání využívá metodu půlení intervalů [15], pivota (prvek k porovnání) vybere v půlce převodní tabulky a zjistí, zda je vzorek menší, větší nebo to není náhodou vyhovující kódová úroveň. Podle toho rozdělí vyhovující interval na další půlky a pokračuje, dokud pro vzorek vybere kódovou úroveň. 3.3.3. Příklad funkce v C Použití funkce kvantizátoru s definovatelnými statickými parametry: #include "adstatic.h" int main() { unsigned char bits = 3; double Uref = 8; unsigned long nCode = 10;
45
Software pro testování AD převodníků 3.3 Kvantizátor s definovatelnými statickými parametry double * Uin; unsigned long length; double zeroerr = 0.5; double gainerr = -3; double DNL[8] = {0,0,-0.6,1.6,-1,0,0,0}; unsigned long * ADcode1; unsigned long * ADcode2; Uinrampgen(bits,Uref,nCode,&Uin,&length); //example values of zeroerr, gainerr and DNL, monotonous search: quantizer(bits,Uref,Uin,length,zeroerr,gainerr,DNL,1,&ADcode1); adcst_di2csv("UinAD1.csv",Uin,ADcode1,length); //no zero error, no gain error, no DNL, binary search: quantizer(bits,Uref,Uin,length,0,0,NULL,0,&ADcode2); adcst_di2csv("UinAD2.csv",Uin,ADcode2,length); return (0); }
V tomto příkladě je ukázáno použití funkce quantizer() dvakrát. V prvním použití (výstup ADcode1) jsou použity statické parametry z příkladu (viz 2.1.1). Pro vyhledávání úrovní je použito monotónní vyhledávání, protože průběh vstupních napětí pole Uin je rampa (je vzestupně seřazený). Pole Uin je generováno funkcí Uinrampgen() (popsána v následující kapitole). Funkcí adcst_di2csv() jsou uložena pole Uin a výsledné převedené pole ADcode1 do csv souboru UinAD1.csv. Ve druhém použití funkce quantizer() (výstup ADcode2) kvantizátor neobsahuje chybu nuly, chybu zesílení ani diferenciální nelinearitu a je použito binární vyhledávání úrovní, které by mělo být použito vždy, když jsou pochybnosti o řazení pole vstupních napětí Uin. 3.3.4. Generátor vzorků vstupních napětí – průběh rampa Pro modelový kvantizátor byla vytvořena jednoduchá funkce Uinrampgen(), která generuje pole vstupních napětí Uin, průběhu typu rampa. Krok jednotlivých vzorků vstupních napětí pro kvantizátor se vypočte ze vstupních parametrů. Rampa je generována od nuly po referenční napětí. Parametry funkce jsou ukázány v následující hlavičce a blokovém schéma: Hlavička funkce – generátor vstupu pro kvantizátor typu rampa: int Uinrampgen(unsigned char bits, double Uref, unsigned long nCode, double ** Uin, unsigned long * length);
46
Software pro testování AD převodníků 3.3 Kvantizátor s definovatelnými statickými parametry Blokové schéma funkce – generátor vstupu pro kvantizátor typu rampa:
Obrázek 25 Blok funkce – generátor vstupu pro kvantizátor typu rampa
Parametry: bits Uref nCode Uin length
počet bitů AD převodníku referenční napětí AD převodníku, do této úrovně jsou generovány vzorky požadovaný počet vzorků na jednu kódovou úroveň ideálního AD převodníku pole vstupních napětí délka pole Uin
Výsledek funkce: 0 funkce proběhla v pořádku −1 chybné vstupní parametry Příklad: 3 bitový AD převodník bits = 3, referenční napětí UREF = 8 V, požadovaný počet vzorků na kódovou úroveň nCode = 10. Celkový počet vzorků bude (délka pole Uin) length = 2bits·nCode = 80. Pole Uin bude vygenerováno v intervalu <0;7,9> V po kroku 0,1 V. 3.3.5. Příklad funkce v konzolové aplikaci Parametr –q určuje funkci aplikace pro kvantizátor. 3 bitový kvantizátor/AD převodník bits = 3; referenční napětí Uref = 8 V. adstatic.exe –q noise.csv 3 8 0 0 0 0 adstatic.exe –q ramp.csv 3 8 0.5 -3 DNL.csv 1 -file ADramp.csv
V prvním příkladě kvantizátor načte vstupní signál ze souboru noise.csv, statické parametry: bez chyby nuly (zeroerr = 0), bez chyby zesílení (gainerr = 0) a bez diferenciální nelinearity (DNL = 0), vyhledávání bude použito binární (mntnous = 0) a výsledek (vstupní napětí a výstupní kódová slova) bude vypsán na obrazovku. Ve druhém příkladě kvantizátor načte vstupní signál ze souboru ramp.csv, statické parametry: chyba nuly je 0,5 LSB (zeroerr = 0.5), chyba zesílení je −3 LSB (gainerr = −3) a diferenciální nelinearita je načtena ze souboru DNL.csv (bere se poslední sloupec v csv souboru, hodnoty DNL v LSB, pozice odpovídá kódovému slovu, délka musí být 2bits), vyhledávání bude použito monotónní (mntnous = 1) a výsledek (vstupní napětí a výstupní kódová slova) bude uložen do souboru ADramp.csv.
47
Software pro testování AD převodníků 3.3 Kvantizátor s definovatelnými statickými parametry Pokud je potřeba vygenerovat pole vstupních napětí lze použít parametr –ug, který určuje funkci aplikace jako generátor signálu rampa (viz 3.3.4). 3 bitový kvantizátor/AD převodník bits = 3; referenční napětí Uref = 8 V, požadovaný počet vzorků na kódové slovo nCode = 10. adstatic.exe –ug 3 8 10 –file ramp.csv
Vygenerovaný signál rampa 0 až 7,9 V po kroku 0,1 V bude uložen do souboru ramp.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. adstatic.exe -?
48
Software pro testování AD převodníků 4 Testování ve frekvenční oblasti
4. Testování ve frekvenční oblasti Pro konkrétní stanovení dynamických parametrů AD převodníku ve frekvenční oblasti je potřeba uvést a definovat několik funkcí, které jsou potřeba pro analýzu dat ve frekvenční oblasti.
4.1. Diskrétní Fourierova transformace – DFT Diskrétní Fourierova transformace DFT je matematická operace, která převede vzorkované data z časové oblasti do frekvenční. DFT je definována [3]: ܯെͳ
݇
ܺሾ݇ሿ ൌ ݔሾ݊ሿ݁ െ݆ ʹߨ݊ ܯ ݊ൌͲ
Rovnice 17 Diskrétní Fourierova transformace – DFT
kde
X[k] x[n] M
je obraz (amplituda, fáze) vstupního signálu ve spektru na k-tém frekvenčním binu k ϵ <0; M – 1> je n-tý vzorek vstupního signálu, časová oblast je počet vzorků vstupního signálu
Dále je uveden rozklad DFT na amplitudu a fázi do polární formy, amplitudové spektrum se používá při stanovení dynamických parametrů (viz 5): ȁܺሾ݇ሿȁ ൌ
ඥሺܺሾ݇ሿሻʹ ሺܺሾ݇ሿሻʹ ሺܺሾ݇ሿሻ ߮ሾ݇ሿ ൌ
ቆ ቇ ሺܺሾ݇ሿሻ ܯ Rovnice 18 Rozklad DFT na amplitudu a fázi
kde
|X[k]| φ[k] M
je amplituda k-tého frekvenčního binu v DFT spektru je fáze k-tého frekvenčním binu v DFT spektru je počet vzorků vstupního signálu
Pro výpočet DFT je v tomto softwaru pro testování AD převodníku použít algoritmus rychlé Fourierovy transformace (FFT), který zajišťuje externí knihovna FFTW. Knihovna FFTW je volně dostupná pod GNU licencí [11]. Pro testování dynamických parametrů AD převodníku doporučuje standard IEEE 1057 [1] provádět průměrování amplitudového DFT spektra z více náměrů. Tím se zvýší potlačení náhodného šumu a náhodně se vyskytujících falešných složek. Každý náměr výstupu AD převodníku při vstupním sinusovém signálu se vynásobí okénkovací funkcí v časové oblasti (viz 4.2) a pro každý náměr se provede zvlášť výpočet amplitudového DFT spektra, ty jsou poté zprůměrovány: ܰܭ
ͳ หܺ݇ ܰ ሾ݇ሿห หܺܽ ݃ݒሾ݇ሿห ൌ ܰܭ ݇ ܰ ൌͳ
Rovnice 19 Průměrování amplitudového DFT spektra
49
Software pro testování AD převodníků 4.1 Diskrétní Fourierova transformace – DFT
kde
|Xavg[k]| |XkN[k]|
je průměrovaná amplituda k-tého frekvenčního binu v DFT spektru k ϵ <0; M – 1> je amplituda k-tého frekvenčního binu v DFT spektru z kN-tého náměru kN ϵ <1; KN>
4.1.1. Normalizované DFT spektrum Další užitečná úprava amplitudového DFT spektra, pro funkce stanovující dynamické parametry AD převodníku (viz 5), je vytvoření jednostranného, normalizovaného DFT spektra, které obsahuje kvadráty amplitud. Při této úpravě lze pak přímo spočítat efektivní hodnotu požadovaného binu pouze sumou binů z jeho hlavního laloku a to je výhodné zjednodušení. Při výpočtu DFT spektra (viz vztah Rovnice 17) je výsledné spektrum oboustranné, symetrické. Na následujícím obrázku je znázorněn příklad amplitudového DFT spektra:
Obrázek 26 Příklad oboustaného amplitudového DFT spektra
kde
M
je počet vzorků vstupního signálu = počet binů oboustranného DFT spektra
Z obrázku lze vidět, že půlky spektra nejsou úplně symetrické, první půlka obsahuje bin s číslem 0 (tzv. DC bin) a druhá půlka obsahuje bin s číslem M/2 (tzv. DFThalf bin). Při vytváření jednostranného spektra je nutné, aby také obsahovalo navíc právě bin DFThalf. Při splnění této podmínky jsou při vytváření jednostranného spektra biny za DFThalf binem odřezány (šedé biny viz Obrázek 26). Při odřezání druhé poloviny spektra je nutné zdvojit amplitudy binů v jednostranném spektru, kromě DC binu a DFThalf binu (červené biny viz Obrázek 26), ty se v oboustranném spektru vyskytují pouze jednou a jejich energie tudíž není rozpůlena. Pro normalizaci amplitudového DFT spektra je nutno kvadrát amplitudy binů upravit ještě o koeficient NNPG (zeslabení použitého okna) [4] (viz 4.2). Nyní jsou uvedeny výsledné vztahy pro vytvoření jednostranného, normalizovaného, amplitudového DFT spektra a pro přehlednost je ještě definována jeho délka (počet binů): ͳ ȁܺሾͲሿȁʹ ܰܰܲܩ ʹ ȁܺሾ݄݇ ሿȁʹ ܺ݊ ݉ݎሾ݄݇ ሿ ൌ ܰܰܲܩ ͳ ܯ ʹ ܯ ܺ݊ ݉ݎ ൨ ൌ ฬܺ ൨ฬ ܰܰܲܩ ʹ ʹ
ܺ݊ ݉ݎሾͲሿ ൌ
Rovnice 20 Výpočet jednostranného, normalizovaného, amplitudového DFT spektra
50
Software pro testování AD převodníků 4.1 Diskrétní Fourierova transformace – DFT
ܥܯൌ
ܯ ͳ ʹ
Rovnice 21 Délka jednostranného, normalizovaného, amplitudového DFT spektra
kde
|Xnrm[kh]| je amplituda kh-tého frekvenčního binu v normalizovaném DFT spektru kh ϵ <1; M/2 – 1> |X[kh]| je amplituda kh -tého frekvenčního binu v DFT spektru NNPG je parametr NNPG (viz 4.2) použitého okna (bez okna = 1) M je počet vzorků vstupního signálu, délka oboustranného DFT spektra je délka jednostranného, normalizovaného, amplitudového DFT spektra MC
Normalizované, jednostranné, amplitudové (kvadrát amplitud) DFT spektrum je hojně používáno při výpočtech dynamických parametrů v kapitole 0. Toto spektrum je v dalších kapitolách nazýváno zkráceně jen „normalizované DFT spektrum“ a je značeno bez absolutní hodnoty, protože v této práci je využíváno jen amplitudové spektrum. 4.1.2. Hlavička, parametry – DFT funkce Hlavička funkce pro výpočet DFT: int dft(double * x, unsigned long length, double ** Xabs, double ** Xphi);
Blokové schéma funkce pro výpočet DFT:
Obrázek 27 Blokové schéma funkce pro výpočet DFT
Hlavička funkce pro průměrování DFT: int avgdft(double ** X, unsigned long K, unsigned long length, double ** Xavg);
51
Software pro testování AD převodníků 4.1 Diskrétní Fourierova transformace – DFT Blokové schéma funkce pro průměrování DFT:
Obrázek 28 Blokové schéma funkce pro průměrování DFT
Hlavička funkce pro výpočet jednostranného normalizovaného amplitudového DFT spektra: int avgdft(double ** X, unsigned long K, unsigned long length, double ** Xavg);
Blokové schéma funkce pro výpočet normalizovaného DFT spektra:
Obrázek 29 Blokové schéma funkce pro výpočet normalizovaného DFT spektra
Parametry: x length Xabs Xphi X K Xavg NNPG nXa2h lhalfc
pole vzorků vstupního signálu počet vzorků vstupního signálu, délka vstupních polí x, * X a Xabs amplitudové DFT, délka tohoto pole je length (volitelný výstup) fázové DFT, délka tohoto pole je length (volitelný výstup) obsahuje K amplitudových (fázových) DFT polí počet náměrů, délka pole X průměrované DFT spektrum, podle vstupu amplitudové nebo fázové, délka tohoto pole je length parametr NNPG (viz 4.2) použitého okna amplitudové jednostranné normalizované DFT, délka tohoto pole je lhalfc! délka pole nXa2h
Výsledek funkcí: 0 funkce proběhla v pořádku −1 chybné vstupní parametry, např. délka pole length
52
Software pro testování AD převodníků 4.1 Diskrétní Fourierova transformace – DFT −2 −3 −4
chyba při alokaci paměti není vyžadován žádný výstup, všechny výstupní parametry jsou NULL chyba při alokaci paměti
4.1.3. Popis algoritmu – DFT funkce Výpočet DFT dft(): Nejdříve jsou alokována požadovaná pole pro funkce z knihovny FFTW [11] a nachystán plán pro výpočet jedno-rozměrného DFT FFT algoritmem. Po vypočítání DFT je z komplexního spektra vypočítáno amplitudové a fázové DFT spektrum (viz Rovnice 18). Průměrování DFT avgdft(): V prvním kroku je alokováno pole Xavg po výsledné zprůměrované DFT. Pro každý index pole Xavg je ze vzorků v cyklu přes druhý rozměr pole (počet náměrů) vstupního pole X stanovena suma. Ze sumy je stanoven výsledný aritmetický průměr aktuálního prvku DFT (viz. Rovnice 19). Normalizované DFT spektrum nrmXabs2halfcalc() Na začátku je důležité ověřit délku zadaného DFT, zda je korektní a je sudá, aby bylo možné vytvořit jednostranné spektrum. Poté je vypočtena délka výstupního pole lhalfc a alokováno místo pro výstupní pole nXa2h. Poté je v cyklu provedena kopie poloviny oboustranného DFT spektra a přitom provedena úprava amplitud (viz Rovnice 20).
4.2. Okénkování Při volbě vstupního signálu není jednoduché zajistit jeho koherentní vzorkování, tudíž dochází ve spektru k prosakování energie do okolních binů. Při koherentním vzorkování je hodnota k-tého binu právě hodnota jeho amplitudy. Při nekoherentním vzorkování je nutno počítat amplitudu i z postranních binů, kam energie prosákla. Výhoda okénkování: při použití konkrétního typu okna se známým řádem, je přesně definováno, do kolika postraních binů energie prosákla (šířka hlavního laloku použitého okna) a další biny jsou potlačeny definovaným útlumem okna (odstup hlavního laloku od postranních) s definovanou rychlostí útlumu (útlum postranních laloků na oktávu). Proto je nutno při nekoherentním vzorkování použít okénkování. Nekoherentní vzorkování je definováno [3]: ݂݅ܯൌ ൫ ܬേ ߝ݆ ൯݂ݏ Rovnice 22 Nekoherentní vzorkování
kde
fi fs M J
εj
je je je je je
frekvence vstupního signálu (základní harmonické sinusovky) vzorkovací frekvence počet vzorků vstupního signálu celé číslo, počet period vstupního signálu v záznamu nepřesnost počtu period vstupního signálu v záznamu, εj ϵ <0; 0,5>, pro koherentní vzorkování platí εj = 0 (ideální, celistvý počet period je v záznamu).
Volba typu okna závisí na aplikaci. Např. pro testování AD převodníků závisí volba okna také na jeho rozlišení. Čím vyšší rozlišení ADC, tím vyšší řád okna je nutno použít, protože je vyšší potřeba odstupu hlavního laloku od postranních. Např. pro testování více tónovým signálem je zase důležitější rychlost
53
Software pro testování AD převodníků 4.2 Okénkování útlumu postranních laloků, pro správné stanovení SNHR (poměr signál šum) AD převodníku je nutné použít okno s malými postraními laloky, aby se potlačilo prosakování. V následující tabulce jsou uvedeny použité okna a jejich vlastnosti [3] [6] [7] [9]: Typ okna Hann Hamming Blackman Exact Blackman Nuttall Blackman-Harris 4-term Blackman-Harris 7-term
lmax [bin] 2 2 3 3 4 4 7
SLA [dB] -31,47 -43 -58,11 -68,24 -98,17 -92,01 -175
SLFO [dB/oct] 18 6 18 6 6 6,33
ΔSNHR [dB], ADC [bit] 6 dB při 6 bit ADC 1 dB při 4 bit ADC 2,4 dB při 6 bit ADC 2,5 dB při 6 bit ADC 5,3 dB při 14 bit ADC 0,13 dB při 24 bit ADC
Tabulka 2 Okna a jejich vlastnosti
kde
lmax SLA SLFO ΔSNHR
je je je je
šířka půlky hlavního laloku odstup hlavního laloku k postranním (k nejvyššímu postrannímu laloku) útlum postranních laloků na oktávu maximální chyba výpočtu SNHR při uvedeném rozlišení ADC [3]
Z výše uvedené tabulky je patrné, že pro testování AD převodníků jsou vhodná okna vyšších řádů, která mají vysoký odstup hlavního laloku od postranních. Použité okna jsou definovány koeficienty kosinových členů v následující sumě, ze které jsou vypočteny výsledné vzorky okénkovací funkce (počet kosinových členů, tedy počet koeficientů – 1 udává řád okna): ݈݉ܽݔ
ʹߨ݈݊ ൰ ݓሾ݊ሿ ൌ ܽ݇ ሺെͳሻ݈
൬ ܯ ݈ൌͲ
Rovnice 23 Výpočet okénkovací funkce
kde
w[n] lmax ak M
je je je je
n-tý vzorek okénkovací funkce šířka půlky hlavního laloku okna (řád okna + 1), l ϵ <0; lmax> k-tý koeficient použitého okna, suma těchto koeficientů je rovna 1 počet vzorků okénkovací funkce, (počet vzorků vstupního signálu)
Aplikace okénkovací funkce na signál se provádí v časové oblasti vynásobením vzorků vstupního signálu odpovídajícím vzorkem použitého okna: ݓݔሾ݊ሿ ൌ ݔሾ݊ሿ ή ݓሾ݊ሿ Rovnice 24 Aplikace okénkovací funkce na signál
kde
xw[n]
je n-tý vzorek oknénkovaného signálu x
Použitím okénkovací funkce dochází k útlumu celkové energie vstupního signálu, proto je důležité stanovit parametry korigující toto zeslabení okna. Tím se zaručí správné stanovení efektivní hodnoty
54
Software pro testování AD převodníků 4.2 Okénkování příp. amplitudy požadovaného binu v DFT spektru. Parametr okna NNPG (normalized noise power gain) [1]: ܯെͳ
ͳ ܰܰܲ ܩൌ ݓሾ݊ሿʹ ܯ ݊ൌͲ
Rovnice 25 Výpočet parametru NNPG použitého okna
kde
w[n] M
je n-tý vzorek okénkovací funkce je počet vzorků okénkovací funkce, (počet vzorků vstupního signálu)
Parametr NNPG používá standard IEEE 1057 [1] pro výpočet efektivní hodnoty z hlavního laloku požadovaného binu v DFT spektru. Naproti tomu standard DYNAD [3] využívá pro výpočet amplitudy konkrétního jednoho binu parametr ENBW (equivalent noise bandwidth), který je definován takto: ܹܤܰܧൌ
ʹ ܯσܯെͳ ݊ൌͲ ݓሾ݊ሿ ʹ ሾσܯെͳ ݊ൌͲ ݓሾ݊ሿሿ
Rovnice 26 Výpočet parametru ENBW použitého okna
kde
w[n] M
je n-tý vzorek okénkovací funkce je počet vzorků okénkovací funkce, (počet vzorků vstupního signálu)
4.2.1. Hlavička, parametry Hlavička funkce pro výpočet požadované okénkovací funkce: int window(unsigned char wtype, unsigned long length, double ** w, unsigned char * lmax, double * ENBW, double * NNPG);
Blokové schéma pro výpočet okénkovací funkce:
Obrázek 30 Blokové schéma pro výpočet okénkovací funkce
Hlavička funkce pro aplikaci okénkovací funkce na vstupní signál: int windowsignal(double *x, double *w, unsigned long length, double ** xw);
55
Software pro testování AD převodníků 4.2 Okénkování Blokové schéma pro aplikaci okénkovací funkce na vstupní signál:
Obrázek 31 Blokové schéma pro aplikaci okénkovací funkce na vstupní signál
Parametry: x w wtype
length lmax ENBW NNPG xw
pole vzorků vstupního signálu pole vzorků okénkovací funkce číslo požadovaného okna 1 – okno obdélník (bez okna) 2 – okno Hann 3 – okno Hamming 4 – okno Blackman 5 – okno Exact Blackman 6 – okno Nuttall 7 – okno Blackman Harris 4-term 8 – okno Blackman Harris 7-term počet vzorků vstupního signálu, délka pole x a pole w polovina šířky hlavního laloku použitého okna (volitelný výstup) parametr ENBW (viz Rovnice 26) použitého okna (volitelný výstup) parametr NNPG (viz Rovnice 25) použitého okna (volitelný výstup) pole vzorku vstupního oknovaného signálu, délka tohoto pole je length
Výsledek funkce: 0 funkce proběhla v pořádku −1 chybné vstupní parametry, např. délka pole length −2 chyba při alokaci paměti −8 chybné číslo typu okna 4.2.2. Popis algoritmu Vytvoření okénkovací funkce window(): Nejdříve je alokováno výstupní pole w, které bude obsahovat vzorky okénkovací funkce. Podle požadovaného typu okna se vybere odpovídající cyklus a v něm jsou vypočteny (viz Rovnice 23) podle jeho koeficientů jednotlivé vzorky okna. Zároveň je v cyklu počítána i suma vzorků okna a suma kvadrátu vzorků okna. Sumy jsou využity na konci funkce k výpočtu parametrů okna ENBW a NNPG (viz Rovnice 25 a Rovnice 26). Do výstupního parametru lmax je uložena polovina délka hlavního laloku okna, jehož hodnota odpovídá počtu koeficientů požadovaného okna.
56
Software pro testování AD převodníků 4.2 Okénkování Aplikace okénkovací funkce na signál windowsignal() Zde jsou jednoduše vzorky signálu vynásobeny vzorky okénkovací funkce v časové oblasti (viz Rovnice 24). Pro výstupní pole xw je alokováno nové místo.
4.3. Určení pozice a efektivní hodnoty harmonických složek v DFT spektru Pro stanovení dynamických parametrů z frekvenční oblasti při nekoherentním vzorkování je nutno ukázat, jak identifikovat základní harmonickou složku v DFT spektru a její vyšší harmonické složky. Při určení pozice vyšších harmonických složek je nutno brát také v úvahu, že může dojít k aliasingu. Hlavní bin základní harmonické složky J je nalezen jako nejvyšší spektrální čára v normalizovaném DFT spektru (viz 4.1.1) po zamítnutí binů DC složky a jejího hlavního laloku. Po nalezení základní harmonické složky je z jejího hlavního laloku vypočítána její frekvence metodou „FFT“, popsanou v [5]. Frekvence základní harmonické složky se vypočítá váženým průměrem z binů hlavního laloku [5]: ݂݂ ൌ
݉ܽݔ σ݈݈ൌെ݈ ൣሺ ܬ ݈ሻ ή ܺ݊ ݉ݎሾ ܬ ݈ሿ൧ ݉ܽݔ ݉ܽݔ σ݈݈ൌെ݈
݉ܽݔ
ܺ݊ ݉ݎሾ ܬ ݈ሿ
ሾሿ
Rovnice 27 Výpočet frekvence základní harmonické složky v normalizovaném DFT spektru
kde
ff Xnrm lmax l J
je je je je je
vypočtená frekvence základní harmonické složky v binech normalizované DFT spektrum definované (viz 4.1.1) šířka půlky hlavního laloku použitého okna (viz 4.2) index binu hlavního laloku, l ϵ <–lmax; lmax> číslo binu základní harmonické, maximum v Xnrm po zamítnutí DC může být v intervalu J ϵ <0 + lmax + 1; MC – lmax – 1> je délka normalizovaného DFT spektra (viz 4.1.1)
MC
Nyní po stanovení frekvence základní harmonické složky jsou stanoveny pozice binů všech harmonických složek. Výpočet je nutno rozdělit na dvě části, protože frekvence vyšší harmonické složky může překročit polovinu vzorkovací frekvence. Proto je nutno vyšetřit, zda vyšší harmonická složka je zrcadlena od počátku nebo od konce normalizovaného DFT spektra: ݂݄ܾ݅݊ ሾͲሿ ൌ ൫݂݂ ൯ ݂݄ܾ݅݊ ሾ݄ሿ ൌ ൣሺ݄ ͳሻ ή ݂݂ ൧ ܯǢൣሺ݄ ͳሻ ή ݂݂ ൧
ܯ ʹ
݂݄ܾ݅݊ ሾ݄ሿ ൌ ܯെ ൣൣሺ݄ ͳሻ ή ݂݂ ൧ ܯ൧Ǣൣሺ݄ ͳሻ ή ݂݂ ൧
ܯ ʹ
Rovnice 28 Výpočet pozice (čísla binů) harmonických složek v normalizovaném DFT spektru
kde
fhbin[0] fhbin[h] ff M round mod
je je je je je je
číslo binu základní harmonické složky číslo binu (h + 1)-té vyšší harmonické složky h ϵ <1; hmax – 1> vypočtená frekvence základní harmonické složky (viz Rovnice 27) počet vzorků, délka oboustranného DFT spektra, M = 2·(MC – 1) funkce: zaokrouhlení funkce: zbytek po dělení 57
Software pro testování AD převodníků 4.3 Určení pozice a efektivní hodnoty harmonických složek v DFT spektru Určení kvadrátu efektivní hodnoty požadované složky na konkrétním binu je dáno pouhým součtem amplitud normalizovaného DFT spektra (viz 4.1.1) ve hlavním laloku požadované složky: ݈ ݉ܽݔ
ܷܴ ܵܯሾ݇ሿ ൌ ඩ ܺ݊ ݉ݎሾ݇ ݈ሿ ሾሿ ݈ൌെ݈݉ܽݔ
Rovnice 29 Výpočet efektivní hodnoty požadované složky v normalizovaném DFT spektru
kde
URMS[k] Xnrm lmax l
je je je je
efektivní hodnota požadované složky na k-tém binu normalizované DFT spektrum definované (viz 4.1.1) šířka půlky hlavního laloku použitého okna (viz 4.2) index binu hlavního laloku, l ϵ <–lmax; lmax>
Pozn. množina binů při výpočtu efektivní hodnoty složky, která leží nebo přesahuje hlavním lalokem bin č. 0 nebo bin č. (MC – 1), musí být zkrácena. Např. efektivní hodnota DC binu se počítá jen z binů <0; lmax + 1>. 4.3.1. Hlavička, parametry Hlavička funkce pro charakterizaci (frekvence, číslo binu) základní harmonické složky: int fundchar(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned long * fundbin, double * fundfreq, double * epsilonj);
Blokové schéma funkce pro charakterizaci (frekvence, číslo binu) základní harmonické složky:
Obrázek 32 Blokové schéma funkce pro charakterizaci základní harmonické složky
Hlavička funkce pro lokalizaci harmonických složek v normalizovaném DFT spektru: int harmlocator(unsigned long length, double fundfreq, unsigned char hmax, unsigned char lmax, unsigned long ** fundharmbin, double ** fundharmfreq);
58
Software pro testování AD převodníků 4.3 Určení pozice a efektivní hodnoty harmonických složek v DFT spektru Blokové schéma funkce pro lokalizaci harmonických složek v normalizovaném DFT spektru:
Obrázek 33 Blokové schéma funkce lokalizace harmonických složek v normalizovaném DFT spektru
Hlavička funkce pro výpočet jednostranného normalizovaného amplitudového DFT spektra: int ARMS2calc(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned long bin, double * AMPL2, double * RMS2);
Blokové schéma funkce pro výpočet efektivní hodnoty (amplitudy) požadované složky:
Obrázek 34 Blokové schéma funkce pro výpočet efektivní hodnoty (amplitudy) požadované složky
Parametry: nXa2h lhalfc lmax hmax fundbin fundfreq epsilonj
(nrmXabs2half) normalizované DFT spektrum (viz 4.1.1) počet binů normalizovaného DFT spektra, délka pole nXa2h šířka poloviny hlavního laloku v binech použitého okna (viz 4.2) počet harmonických včetně základní, délka pole fhbin pozice (číslo) binu základní harmonické složky (volitelný výstup) odhadnutá frekvence základní harmonické složky (volitelný výstup) desetinná část rozdílu odhadnuté frekvence od čísla binu základní harmonické složky (volitelný výstup) lhalfc počet vzorků, počet binů oboustranného DFT spektra fhbin (fundharmbin) pole čísel binů harmonických složek, toto pole má délku hmax fhfreq (fundharmfreq) pole frekvencí harmonických složek, toto pole má délku hmax bin číslo binu požadované složky AMPL2 kvadrát amplitudy požadované složky RMS2 kvadrát efektivní hodnoty požadované složky
59
Software pro testování AD převodníků 4.3 Určení pozice a efektivní hodnoty harmonických složek v DFT spektru Výsledek funkcí: 0 funkce proběhla v pořádku −1 chybné vstupní parametry, např. délka pole length −2 chyba při alokaci paměti −3 není vyžadován žádný výstup, všechny výstupní parametry jsou NULL −4 chyba, délka oboustranného DFT spektra je lichá −5 chyba, bin základní harmonické je větší jak polovina vzorkovací frekvence 0x01 varování (číslo bitu): došlo k aliasingu vyšší harmonické složky 0x02 varování (číslo bitu): některá harmonická složka leží na stejném binu jako jiná 0x04 varování (číslo bitu): některá harmonická složka překrývá svým hl. lalokem jinou 0x08 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DC binu 0x10 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DFThalf binu 4.3.2. Popis algoritmu Identifikace základní harmonické složky fundchar(): V normalizovaném DFT spektru (pole nrmXabs2half) je provedeno vyhledání binu s maximální amplitudou. Cyklus hledání začíná za DC binem a jejím hlavním lalokem a končí na binu DFThalf – 1. Poté je stanovena frekvence v binech základní harmonické složky váženým průměrem amplitud binů v hlavním laloku (viz 4.3). Na výstup je uložena vypočtená frekvence (fundfreq) a číslo binu (fundbin) základní harmonické složky. Lokátor harmonických složek harmlocator(): Algoritmus pro stanovení čísla binů harmonických složek využívá vypočtenou frekvenci základní harmonické z funkce fundchar(). Podle vzorce (viz Rovnice 28) jsou vypočteny pozice harmonických složek a čísla binů jsou uloženy v poli fundharmbin. Do pole fundharmfreq jsou uloženy odhadnuté frekvence (v binech) harmonických složek. Na konec je zkontrolováno, zda se některé harmonické složky nepřekrývají nebo zda nezasahují do binů DC nebo DFThalf, pokud ano, je nastaven příznak varování (výsledek funkce viz 4.3.1). Výpočet efektivní hodnoty požadované složky ARMS2calc(): Kvadrát efektivní hodnoty je stanoven jako suma hodnot binů v normalizovaném DFT spektru v hlavním laloku požadované složky. Pokud hlavní lalok požadované složky zasahuje do DC nebo DFThalf binu (nebo je požadován vypočet efektivní hodnoty DC nebo DFT half binu) je rozsah vypočtu zkrácen a je nastaven varovný příznak. Na výstup je uložen kvadrát efektivní hodnoty požadované složky (RMS2) a kvadrát amplitudy požadované složky (AMPL2).
60
Software pro testování AD převodníků 5 Dynamické parametry AD převodníků
5. Dynamické parametry AD převodníků V této práci je pro stanovení dynamických parametrů použito testování se vstupním sinusovým signálem. Dynamické parametry lze stanovit v časové oblasti a ve frekvenční oblasti. V časové oblasti se používá metoda prokladu sinusovkou, ve frekvenční se pracuje s DFT spektrem. V této kapitole budou definovány základní dynamické parametry AD převodníků, které obsahuje knihovna addynam: -
šumový práh NFL (noise floor) celkové harmonické zkreslení THD (total harmonic distortion) poměr signálu k falešné složce SFDR (spurious free dynamic range) poměr signálu k šumu SNHR (signal nonharmonic ratio) poměr signálu k šumu a zkreslení SINAD (signal, noise and distortion) efektivní počet bitů ENOB (effective number of bits)
Při stanovení dynamických parametrů z frekvenční oblasti se rovnou předpokládá nekoherentní vzorkování (viz 4.2)! Každá definice funkce je vysvětlena na konkrétním příkladě. Poté je ukázána hlavička funkce v C knihovně a příklad použití v kódu. Uvedeno je také použití funkce v konzolové aplikaci.
5.1. Šumový práh NFL Šumový práh je parametr určený při testování AD převodníku ve frekvenční oblasti, je to průměrná efektivní hodnota šumu, vypočtena po zamítnutí binů DC složky, základní harmonické a vyšších harmonických. 5.1.1. Definice Šumový práh NFL (Noise FLoor) je vypočítán z normalizovaného DFT spektra (viz 4.1.1) jako aritmetický průměr z množiny frekvenční binů, která neobsahuje biny DC složky a jejího hlavního laloku, biny základní harmonické složky a jejího hlavního laloku a biny vyšších harmonických složek a jejich hlavních laloků. Šumový práh je stanoven jako efektivní hodnota v jednotkách Voltů (nebo odvozené dBc, dBm apod.). Výpočet šumového prahu vystihuje následující rovnice:
ܰ ʹܮܨൌ
ܥ σܯ ݇ൌ݈
݉ܽݔ
ͳǢ്݇ ܬേ݈Ǣ്݇ ൣ݄൫ ܬേߝ ݆ ൯൧േ݈
ܺ݊ ݉ݎሾ݇ሿ
ܥܯെ ሺ݈݉ܽ ݔ ͳሻ െ ݄݉ܽ ݔሺʹ݈݉ܽ ݔ ͳሻ Rovnice 30 Výpočet šumového prahu NFL
kde
NFL2 Xnrm MC k lmax l hmax h J
je je je je je je je je je
kvadrát efektivní hodnoty šumového prahu normalizované DFT spektrum definované (viz 4.1.1) délka normalizované DFT spektra (viz 4.1.1) index frekvenčního binu v Xnrm šířka půlky hlavního laloku použitého okna (viz 4.2) index binu hlavního laloku, při výpočtu NFL l ϵ <0; lmax> počet harmonických složek včetně základní index harmonické složky, při výpočtu NFL h ϵ <2; hmax> číslo binu základní harmonické v Xnrm
61
Software pro testování AD převodníků 5.1 Šumový práh NFL εj round
je odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> je funkce zaokrouhlení
Pozor, pokud dochází k aliasingu, požadovaná vyšší harmonická složka má vyšší frekvenci než polovina vzorkovací frekvence, je nutno detekovat biny (viz. 4.3), na kterých se vyskytuje a tyto také vyřadit z výpočtu NFL namísto hJ ± l. Tento vztah je odvozen ze standardu DYNAD [3]. Porovnání: zde definovaný vztah pro výpočet šumového prahu zamítá navíc biny celého DC laloku (DYNAD zamítá jen DC bin), je upraven počet vyřazených binů a ve výpočtu je používáno normalizované DFT spektrum. Příklad: Zde je uveden příklad pro výpočet šumového prahu z normalizovaného DFT spektra. V časové oblasti je použit sinusový signál o těchto parametrech: amplituda U = 51,4 mV; frekvence f = 7,6953 kHz. Vstupní signál je vzorkován frekvencí fs = 100 kHz, referenční napětí (amplituda) převodníku je Uref = 100 mV (fullscale = 200 mV). Vzorkovaný signál obsahuje M = 128 (MC = 65 viz Rovnice 21) vzorků a v časové oblasti je prohnán oknem prvního řádu (např. Hann), tudíž šířka půlky hlavního laloku je lmax = 2. Ve zmíněném normalizovaném DFT spektru je přítomno celkem hmax = 6 harmonických složek (včetně základní), jejichž hlavní spektrální čáry jsou na binech číslo [10; 20; 30; 39; 49; 59] (detekce viz 4.3).
Obrázek 35 Příklad výpočtu šumového prahu NFL
V uvedeném spektru (viz Obrázek 35) je uvedeno, ze kterých binů je šumový práh počítán, jsou to ty červené. Šedé biny jsou z výpočtu vyřazeny a jsou to biny DC složky a jejího laloku a biny všech harmonických včetně jejich laloků. Horní vynášecí čára kóty NFL znázorňuje průměrnou hodnotu šumu na jednom binu. Nyní jsou hodnoty z příkladu doplněny do vzorce (viz Rovnice 30): ʹ
σͷ ݇ൌʹͳǢ്݇ۦͺȁͳʹۧǢ്݇ͳۦͺȁʹʹۧǢʹۦͺȁ͵ʹۧǢ͵ۦȁͶͳۧǢۦͶȁͷͳۧǢۦͷȁͳۧ ܺ݊ ݉ݎሾ݇ሿ
ൌ ͳʹǡʹ ͷ െ ሺʹ ͳሻ െ ή ሺʹ ή ʹ ͳሻ ܰܮܨ ͵ǡͷ ή ͳͲെ͵ ܰ ܮܨൌ ͵ǡͷ ൌ ܰ ܿܤ݀ܮܨൌ ʹͲ ͳͲ ൌ ʹͲ ͳͲ ൌ െʹͲǡͳͺ
ܷ ͵ǡ͵͵ ή ͳͲെ͵ ξʹ
ܰ ܮܨൌ
Rovnice 31 Příklad výpočtu šumového prahu NFL
62
Software pro testování AD převodníků 5.1 Šumový práh NFL Číselné hodnoty normalizovaného spektra v tomto příkladě jsou k nalezení v příloze (viz Příloha č. 1), kde je spektrum podrobněji okótováno. 5.1.2. Hlavička, parametry funkce Hlavička funkce pro výpočet šumového prahu NFL: int NFLcalc(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned char hmax, unsigned long * fundharmbin, double * NFL, double * NFL2);
Blokové schéma funkce pro výpočet šumového prahu NFL:
Obrázek 36 Blok funkce pro výpočet šumového prahu NFL
Vstupní parametry: nXa2h (nrmXabs2half) normalizované DFT spektrum (viz 4.1.1) lhalfc počet binů normalizovaného DFT spektra, délka pole nXa2h lmax šířka poloviny hlavního laloku v binech použitého okna (viz 4.2) hmax počet harmonických včetně základní, délka pole fhbin fhbin (fundharmbin) pozice (čísla) binů harmonických Výstupní parametry: NFL šumový práh [V] (volitelný výstup) NFL2 kvadrát hodnoty šumového prahu [V2] (volitelný výstup) Výsledek funkce: 0 funkce proběhla v pořádku −1 chyba ve vstupních parametrech −2 chyba při alokaci paměti −3 chyba, není požadován žádný výstup (všechny výstupy jsou NULL) −4 chyba, délka oboustranného DFT spektra je lichá −5 chyba při adresaci v poli, chybné indexy v poli fundharmbin 0x01 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DC binu 0x02 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DFThalf binu 5.1.3. Popis algoritmu Výpočet šumového prahu NFL je proveden dle definice (viz Rovnice 30). Nejdříve je alokována paměť pro kopii pole nrmXabs2half o délce lhalfc – normalizovaného DFT spektra, které již obsahuje
63
Software pro testování AD převodníků 5.1 Šumový práh NFL kvadráty amplitud (viz 4.1.1) a provedena jeho kopie nrmXabs2half_, protože při výpočtu šumového prahu se bude toto pole upravovat. Nyní nastává část vyřazení binů v poli nrmXabs2half_, ze kterých se neprovádí výpočet šumového prahu. Vyřazení binů se provádí nulováním jejich amplitudy. V prvním kroku vyřazení se nuluje amplituda binu DC složky a v cyklu se nulují amplitudy binů hlavního laloku DC složky délky lmax. V druhém kroku vyřazení se v cyklu nulují amplitudy binů hmax harmonických složek (včetně základní) a ve vnořeném cyklu se nulují amplitudy binů hlavního laloku všech harmonických složek o délce ± lmax. Pozice harmonických složek (čísla binů) jsou předány ve vstupním poli fundharmbin o délce hmax. Po vyřazení všech požadovaných binů z pole nrmXabs2half_ je pole vzestupně seřazeno a provedena jeho suma (pole je seřazeno vzestupně pro lepší číselnou stabilitu při sumování). Z této sumy je aritmetickým průměrem vypočten kvadrát šumového prahu tempNFL2, v děliteli aritmetického průměru je celkový počet binů pole nrmXabs2half_ ponížen o počet všech vyřazených (nulovaných) binů. Hodnota tempNFL2 je uložena na výstup NFL2 a hodnota šumového prahu (odmocnina z tempNFL2) je uložena na výstup NFL. 5.1.4. Příklad funkce v C Použití funkce pro výpočet šumového prahu je v následujícím příkladu: #include "addynam.h" #include "io.h" int main() { unsigned char bits = 16; double Uref = 2.5; unsigned char hmax = 5; unsigned long ** ADcode; unsigned long length; unsigned long K; double * w; unsigned char lmax; double NNPG; double ** ADU; double ** xw; double ** Xabs; double * Xabsavg; double * nrmXabs2half; unsigned long lhalfc; double fundfreq; unsigned long * fundharmbin; double fundAMPL2; double NFL; unsigned long i; csv2adcdyn_in("ADoutdyn.csv", &ADcode, &length, &K); ADU = (double **) malloc (K * sizeof(**ADU)); xw = (double **) malloc (K * sizeof(**xw)); Xabs = (double **) malloc (K * sizeof(**Xabs)); window(W_NUTTALL, length, &w, &lmax, NULL, &NNPG); for (i = 0; i != K; i++) { AD2sig(bits, Uref, ADcode[i], length, &ADU[i]); windowsignal(ADU[i], w, length, &xw[i]); dft(xw[i], length, &Xabs[i], NULL); } avgdft(Xabs, K, length, &Xabsavg); nrmXabs2halfcalc(Xabsavg, length, NNPG, &nrmXabs2half, &lhalfc); fundchar(nrmXabs2half, lhalfc, lmax, NULL, &fundfreq, NULL); harmlocator(length, fundfreq, hmax, lmax, &fundharmbin, NULL); ARMS2calc(nrmXabs2half,lhalfc,lmax,fundharmbin[0],&fundAMPL2, NULL); NFLcalc(nrmXabs2half, lhalfc, lmax, hmax, fundharmbin, &NFL, NULL);
64
Software pro testování AD převodníků 5.1 Šumový práh NFL printf("noise printf("NFL = printf("NFL = printf("NFL =
floor NFL of this ADC is: NFL = %e [V]\n",NFL); %f [dBV]\n",20*log10(NFL)); %f [dBc]\n",20*log10(NFL/sqrt(fundAMPL2))); %f [dBm (50 Ohm)]\n",20*log10((NFL*NFL/50)*1000));
alldyninonecalc(bits, Uref, ADcode, length, K, W_NUTTALL, hmax, NULL, NULL, NULL, &NFL, NULL, NULL, NULL, NULL, NULL, NULL); for (i = 0; i != K; i++) { free(ADU[i]);free(xw[i]);free(Xabs[i]); } free(ADU);free(xw);free(Xabs); free(w);free(Xabsavg);free(nrmXabs2half);free(fundharmbin); return (0); }
Výstupní data 16 bitového AD převodníku (fullscale Uref = 2,5 V) jsou načteny funkcí csv2adcdyn_in() ze souboru ADoutdyn.csv (viz Příloha CD), který obsahuje 4 náměry po 2048 vzorcích. Poté je alokován první rozměr polí ADU, xw a Xabs podle počtu náměrů K. Funkcí window() (viz 4.2.1) je vypočtena okénkovací funkce okna NUTTALL a parametry NNPG („zeslabení okna“) a lmax (polovina šířky hlavního laloku) tohoto okna. Každý náměr je v cyklu převeden funkcí AD2sig() z hodnoty kódového slova na hodnotu napětí (podle Uref), oknován funkcí windowsignal() (viz 4.2.1) a jsou vypočteny amplitudové DFT spektra. Funkce avgdft() (viz 4.1.2) vytvoří průměrované DFT spektrum a funkce nrmXabs2halfcalc() (viz 4.1.2) vypočte normalizované DFT spektrum. Poté je funkcí fundchar() nalezena v normalizovaném DFT spektru nrmXabs2half základní harmonická a její odhadnutá frekvence v binech fundfreq. Čísla binů všech harmonických složek jsou vypočteny funkcí harmlocator() a uloženy do pole fundharmbin. Kvadrát amplitudy základní harmonické na binu číslo fundharmbin[0] je vypočtena funkcí ARMS2calc(). Nyní je stanoven požadovaný šumový práh NFL AD převodníku funkcí NFLcalc() (viz 5.1.2) a výsledky jsou vypsány. Celý postup určení šumového prahu NFL od načtení vstupního souboru lze provést jedinou funkcí alldyninonecalc(). Nakonec jsou řádně uvolněna všechna dynamicky alokována pole. Výsledek: noise floor NFL of NFL = -121.678054 NFL = -121.678055 NFL = -217.335509
this ADC is: NFL = 8.243227e-07 [V] [dBV] [dBc] [dBm (50 Ohm)]
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány použité funkce na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost, jen tehdy je zaručeno, že funkce proběhly v pořádku. Všechny použité funkce jsou také podrobně popsány v knihovnách addynam.c a io.c. 5.1.5. Příklad funkce v konzolové aplikaci Parametr –NFL určuje funkci aplikace pro výpočet šumového prahu. Výstupní kódová slova AD převodníku jsou uloženy v csv souboru ADoutdyn.csv, počet sloupců určuje počet náměrů a počet
65
Software pro testování AD převodníků 5.1 Šumový práh NFL řádků určuje počet vzorků. Počet bitů bits = 16, referenční napětí (fullscale) Uref = 2.5 V, použité okno č. 6 (Nuttall) a požadovaný počet harmonických hmax = 5 (včetné základní). addynam.exe –NFL ADoutdyn.csv 16 2.5 6 5 addynam.exe –NFL ADoutdyn.csv 16 2.5 6 5 –file nfl.csv
V prvním příkladě bude výsledek šumového prahu vypsán na obrazovku (poměr, dBV, dBc a dBm), ve druhém uložen do souboru nfl.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. addynam.exe -?
5.2. Celkové harmonické zkreslení THD Celkové harmonické zkreslení udává, jak velká energie vyšších harmonických složek je k základní harmonické složce. 5.2.1. Definice Celkové harmonické zkreslení THD (Total Harmonic Distortion) je odmocnina z poměru součtu kvadrátu efektivních hodnot vyšších harmonických složek ke kvadrátu efektivní hodnotě základní harmonické složky. Kvadrát efektivní hodnoty požadované složky je vypočten z normalizovaného DFT spektra (viz 4.1.1) sumou binů z hlavního laloku požadované složky. Celkové harmonické zkreslení je stanoveno jako poměr bez jednotky nebo v dB. Výpočet celkového harmonického zkreslení je uveden následující rovnice: ʹ
ܶ ܦܪൌ
݉ܽݔ ݉ܽݔ σ݄݄ൌʹ σ݈݈ൌെ݈ ܺ݊ ݉ݎൣൣ݄൫ ܬേ ߝ݆ ൯൧ ݈൧ ݉ܽݔ ݉ܽݔ σ݈݈ൌെ݈
݉ܽݔ
ܺ݊ ݉ݎሾ ܬ ݈ሿ
Rovnice 32 Výpočet harmonického zkreslení THD
kde
THD2 Xnrm lmax l hmax h J εj round
je je je je je je je je je
kvadrát celkového harmonického zkreslení normalizované DFT spektrum definované (viz 4.1.1) šířka půlky hlavního laloku použitého okna (viz 4.2) index binu hlavního laloku, při výpočtu THD l ϵ <–lmax; lmax> počet harmonických složek včetně základní index harmonické složky, při výpočtu THD h ϵ <2; hmax> číslo binu základní harmonické v Xnrm odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> funkce zaokrouhlení
Pozor, pokud dochází k aliasingu, požadovaná vyšší harmonická složka má vyšší frekvenci než polovina vzorkovací frekvence, je nutno detekovat biny (viz. 4.3), na kterých se vyskytuje a tyto zahrnout do výpočtu namísto hJ. Tento vztah je odvozen ze standardu DYNAD [3] a ze standardu IEEE-1057 [1]. Porovnání: zde definovaný vztah pro výpočet celkového harmonického zkreslení počítá efektivní hodnotu
66
Software pro testování AD převodníků 5.2 Celkové harmonické zkreslení THD požadované harmonické složky z normalizovaného DFT spektra a z celého jejího hlavního laloku (DYNAD počítá je z jedné spektrální čáry a používá kompenzaci amplitudy použitím frekvenční lupy v DFT spektru). Příklad: Zde je uveden příklad pro výpočet celkového harmonického zkreslení z normalizovaného DFT spektra. V časové oblasti je použit sinusový signál o těchto parametrech: amplituda U = 51,4 mV; frekvence f = 7,6953 kHz. Vstupní signál je vzorkován frekvencí fs = 100 kHz, referenční napětí (amplituda) převodníku je Uref = 100 mV (fullscale = 200 mV). Vzorkovaný signál obsahuje M = 128 (MC = 65 viz Rovnice 21) vzorků a v časové oblasti je prohnán oknem prvního řádu (např. Hann), tudíž šířka půlky hlavního laloku je lmax = 2. Ve zmíněném normalizovaném DFT spektru je přítomno celkem hmax = 6 harmonických složek (včetně základní), jejichž hlavní spektrální čáry jsou na binech číslo [10; 20; 30; 39; 49; 59] (detekce viz 4.3).
Obrázek 37 Příklad výpočtu celkového harmonického zkreslení THD
V uvedeném spektru (viz Obrázek 37) je základní harmonická složka znázorněna zeleně a vyšší harmonické složky jsou znázorněny červeně. Barevně je vždy označen celý hlavní lalok požadované harmonické složky. Hodnoty ze znázorněného příkladu jsou doplněny do vzorce (viz Rovnice 32): σ݄ൌʹ σʹ݈ൌെʹ ܺ݊ ݉ݎሾሾ݄ሺͳͲ െ Ͳǡͳͷሻሿ ݈ሿ ൌ Ͳǡͳʹ σʹ݈ൌെʹ ܺ݊ ݉ݎሾͳͲ ݈ሿ ܶ ܦܪൌ ͲǡͺͶͺ ൌ ܶ ܤ݀ܦܪൌ ʹͲ ܶ ܦܪൌ ʹͲ ͲǡͺͶͺ ൌ െͳǡͶ ܶ ʹ ܦܪൌ
Rovnice 33 Příklad výpočtu harmonického zkreslení THD
Číselné hodnoty normalizovaného spektra v tomto příkladě jsou k nalezení v příloze (viz Příloha č. 1), kde je spektrum podrobněji okótováno. 5.2.2. Hlavička, parametry funkce Hlavička funkce pro výpočet celkového harmonického zkreslení THD: int THDcalc(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned char hmax, unsigned long * fundharmbin, double * THD);
67
Software pro testování AD převodníků 5.2 Celkové harmonické zkreslení THD Blokové schéma funkce pro výpočet celkového harmonického zkreslení THD:
Obrázek 38 Blok funkce pro výpočet celkového harmonického zkreslení THD
Vstupní parametry: nXa2h (nrmXabs2half) normalizované DFT spektrum (viz 4.1.1) lhalfc počet binů normalizovaného DFT spektra, délka pole nXa2h lmax šířka poloviny hlavního laloku v binech použitého okna (viz 4.2) hmax počet harmonických včetně základní, délka pole fhbin fhbin (fundharmbin) pozice (čísla) binů harmonických Výstupní parametry: THD celkové harmonické zkreslení [poměr] Výsledek funkce: 0 funkce proběhla v pořádku −1 chyba ve vstupních parametrech −2 chyba při alokaci paměti −4 chyba, délka oboustranného DFT spektra je lichá −5 chyba při adresaci v poli, chybné indexy v poli fundharmbin 0x01 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DC binu 0x02 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DFThalf binu 5.2.3. Popis algoritmu Výpočet celkového harmonického zkreslení THD je proveden dle definice (viz Rovnice 32). Pozice harmonických složek (čísla binů) jsou předány ve vstupním poli fundharmbin o délce hmax. Nejdříve je stanoven kvadrát efektivní hodnoty základní harmonické složky funkcí ARMS2calc() (viz 4.3). V dalším kroku jsou stanoveny v cyklu kvadráty efektivních hodnot hmax harmonických složek funkcí ARMS2calc() a zároveň je stanovena jejich suma. Cyklus proběhne od nejvyšší harmonické k nejnižší, protože se předpokládá, že nejvyšší harmonická složka má nejmenší energii (kvůli číselné stabilitě sumování). Celkové harmonické zkreslení je určeno jako odmocnina z poměru kvadrátu efektivní hodnoty základní harmonické k sumě kvadrátů efektivních hodnot vyšších harmonických složek a hodnota je uložena na výstup THD. 5.2.4. Příklad funkce v C Použití funkce pro výpočet celkového harmonického zkreslení je v následujícím příkladu:
68
Software pro testování AD převodníků 5.2 Celkové harmonické zkreslení THD #include "addynam.h" #include "io.h" int main() { unsigned char bits = 16; double Uref = 2.5; unsigned char hmax = 5; unsigned long ** ADcode; unsigned long length; unsigned long K; double * w; unsigned char lmax; double NNPG; double ** ADU; double ** xw; double ** Xabs; double * Xabsavg; double * nrmXabs2half; unsigned long lhalfc; double fundfreq; unsigned long * fundharmbin; double fundAMPL2; double THD; double harmAMPL2; unsigned long i; unsigned char j; csv2adcdyn_in("ADoutdyn.csv", &ADcode, &length, &K); ADU = (double **) malloc (K * sizeof(**ADU)); xw = (double **) malloc (K * sizeof(**xw)); Xabs = (double **) malloc (K * sizeof(**Xabs)); window(W_NUTTALL, length, &w, &lmax, NULL, &NNPG); for (i = 0; i != K; i++) { AD2sig(bits, Uref, ADcode[i], length, &ADU[i]); windowsignal(ADU[i], w, length, &xw[i]); dft(xw[i], length, &Xabs[i], NULL); } avgdft(Xabs, K, length, &Xabsavg); nrmXabs2halfcalc(Xabsavg, length, NNPG, &nrmXabs2half, &lhalfc); fundchar(nrmXabs2half, lhalfc, lmax, NULL, &fundfreq, NULL); harmlocator(length, fundfreq, hmax, lmax, &fundharmbin, NULL); ARMS2calc(nrmXabs2half,lhalfc,lmax,fundharmbin[0],&fundAMPL2,NULL); THDcalc(nrmXabs2half, lhalfc, lmax, hmax, fundharmbin, &THD); printf("total harmonic distortion THD of this ADC is: THD = %e [-]\n",THD); printf(" THD = %f [dB]\n",20*log10(THD)); printf("fundamental detected at %d BIN, est. freq. %f * fs, amplitude %e V, amplitude %f dBFS\n", fundharmbin[0], fundfreq/length, sqrt(fundAMPL2), 20*log10(sqrt(fundAMPL2)/(Uref/2))); for (j = 1; j != hmax; j++) { ARMS2calc(nrmXabs2half,lhalfc,lmax,fundharmbin[j],&harmAMPL2,NULL); printf("%d.harmonic detected at %d BIN,amplitude %e V, %f dBc\n",j+1, fundharmbin[j],sqrt(harmAMPL2),20*log10(sqrt(harmAMPL2/fundAMPL2))); } alldyninonecalc(bits, Uref, ADcode, length, K, W_NUTTALL, hmax, NULL, NULL, NULL, NULL, &THD, NULL, NULL, NULL, NULL, NULL); for (i = 0; i != K; i++) { free(ADU[i]);free(xw[i]);free(Xabs[i]);
69
Software pro testování AD převodníků 5.2 Celkové harmonické zkreslení THD } free(ADU);free(xw);free(Xabs); free(w);free(Xabsavg);free(nrmXabs2half);free(fundharmbin); return (0); }
Výstupní data 16 bitového AD převodníku (fullscale Uref = 2,5 V) jsou načteny funkcí csv2adcdyn_in() ze souboru ADoutdyn.csv (viz Příloha CD), který obsahuje 4 náměry po 2048 vzorcích. Poté je alokován první rozměr polí ADU, xw a Xabs podle počtu náměrů K. Funkcí window() (viz 4.2.1) je vypočtena okénkovací funkce okna NUTTALL a parametry NNPG („zeslabení okna“) a lmax (polovina šířky hlavního laloku) tohoto okna. Každý náměr je v cyklu převeden funkcí AD2sig() z hodnoty kódového slova na hodnotu napětí (podle Uref), oknován funkcí windowsignal() (viz 4.2.1) a jsou vypočteny amplitudové DFT spektra. Funkce avgdft() (viz 4.1.2) vytvoří průměrované DFT spektrum a funkce nrmXabs2halfcalc() (viz 4.1.2) vypočte normalizované DFT spektrum. Poté je funkcí fundchar() nalezena v normalizovaném DFT spektru nrmXabs2half základní harmonická složka a její odhadnutá frekvence v binech fundfreq. Čísla binů všech harmonických složek jsou vypočteny funkcí harmlocator() a uloženy do pole fundharmbin. Kvadrát amplitudy základní harmonické složky na binu číslo fundharmbin[0] je vypočtena funkcí ARMS2calc(). Nyní je stanoveno požadované harmonické zkreslení THD AD převodníku funkcí THDcalc() (viz 5.2.2) a výsledky jsou vypsány. Ve výpisu výsledků je použita funkce ARMS2calc() pro výpočet kvádrátu amplitudy vyšších harmonických složek. Celý postup určení harmonického zkreslení THD od načtení vstupního souboru lze provést jedinou funkcí alldyninonecalc(). Nakonec jsou řádně uvolněna všechna dynamicky alokována pole. Výsledek: total harmonic distortion THD of this ADC is: THD = 1.123392e-04 [-] THD = -78.989377 [dB] fundamental detected at 430 BIN, est. freq. 0.209889 * fs, amplitude 1.000000e+00 V, amplitude -1,938199 dBFS 2. harmonic detected at 860 BIN, amplitude 1.000823e-04 V, -79.992854 dBc 3. harmonic detected at 758 BIN, amplitude 4.972136e-05 V, -86.069141 dBc 4. harmonic detected at 329 BIN, amplitude 1.034045e-05 V, -99.709214 dBc 5. harmonic detected at 101 BIN, amplitude 4.947875e-06 V, -106.111626 dBc
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány použité funkce na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost, jen tehdy je zaručeno, že funkce proběhly v pořádku. Všechny použité funkce jsou také podrobně popsány v knihovnách addynam.c a io.c. 5.2.5. Příklad funkce v konzolové aplikaci Parametr –THD určuje funkci aplikace pro výpočet celkového harmonického zkreslení. Výstupní kódová slova AD převodníku jsou uloženy v csv souboru ADoutdyn.csv, počet sloupců určuje počet náměrů a počet řádků určuje počet vzorků. Počet bitů bits = 16, referenční napětí (fullscale) Uref = 2.5 V, použité okno č. 6 (Nuttall) a požadovaný počet harmonických hmax = 5 (včetné základní). addynam.exe –THD ADoutdyn.csv 16 2.5 6 5 addynam.exe –THD ADoutdyn.csv 16 2.5 6 5 –file thd.csv
70
Software pro testování AD převodníků 5.2 Celkové harmonické zkreslení THD
V prvním příkladě bude výsledek celkového harmonického zkreslení vypsán na obrazovku (poměr, dB), ve druhém uložen do souboru thd.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. addynam.exe -?
5.3. Poměr signálu k falešné složce SFDR Poměr signálu k falešné složce udává, jak velký je odstup základní harmonické složky od jiné nejsilnější složky ve spektru. 5.3.1. Definice Poměr signálu k falešné složce SFDR (Spurious Free Dynamic Range) je poměr efektivní hodnoty základní harmonické složky k efektivní hodnotě další nejvyšší složky (falešná) nalezené ve spektru po vyřazení DC složky a jejího hlavního laloku. Kvadrát efektivní hodnoty požadované složky je vypočten z normalizovaného DFT spektra (viz 4.1.1) sumou binů z hlavního laloku požadované složky. Poměr signálu k falešné složce je stanoven jako poměr bez jednotky nebo v dBc. Výpočet celkového harmonického zkreslení je uveden následující rovnice: ʹ
ܵ ܴܦܨൌ
݉ܽݔ σ݈݈ൌെ݈ ܺ݊ ݉ݎሾ ܬ ݈ሿ ݉ܽݔ ݉ܽݔ σ݈݈ൌെ݈
݉ܽݔ
ܺ݊ ݉ݎሾܵ ݈ሿ
Ǣ ܵ ് Ͳۦȁ݈݉ܽ ܬۦ ۧ ݔെ ݈݉ܽ ݔȁ ܬ ݈݉ܽۧ ݔ
Rovnice 34 Výpočet poměru signálu k falešné složce SFDR
kde
SFDR2 Xnrm lmax l J S
je je je je je je
kvadrát poměru signálu k falešné složce normalizované DFT spektrum definované (viz 4.1.1) šířka půlky hlavního laloku použitého okna (viz 4.2) index binu hlavního laloku, při výpočtu SFDR l ϵ <–lmax; lmax> číslo binu základní harmonické v Xnrm číslo binu falešné složky S, maximální složka mimo biny DC a základní harmonické
Tento vztah je odvozen ze standardu IEEE-1057 [1]. Porovnání: zde definovaný vztah je odvozen pro nekoherentní vzorkování s použitím okénkování v časové oblasti, pro koherentní vzorkování je lmax = 0. Standard DYNAD [3] pro nalezení falešné složky zamítá DC bin, biny základní harmonické složky a jejího laloku, ale navíc i biny vyšších harmonických složek a jejich laloků a zamítá i intermodulační zkreslení. Pozn. autora: Zde je odvozená definice poměru signálu k falešné složce z normy IEEE-1057 [1], protože z anglického názvu Spurious Free Dynamic Range vyplývá, že se jedná o výšku rozsahu, která je k dispozici falešným složkám pro dosažení úrovně základní harmonické. Proto v definici je bin falešné složky hledán v celém spektru jen kromě hlavního laloku DC složky a hlavního laloku základní harmonické složky (viz následující příklad).
71
Software pro testování AD převodníků 5.3 Poměr signálu k falešné složce SFDR Příklad: Zde je uveden příklad pro nalezení falešné složky a výpočet poměru signálu k falešné složce z normalizovaného DFT spektra. V časové oblasti je použit sinusový signál o těchto parametrech: amplituda U = 51,4 mV; frekvence f = 7,6953 kHz. Vstupní signál je vzorkován frekvencí fs = 100 kHz, referenční napětí (amplituda) převodníku je Uref = 100 mV (fullscale = 200 mV). Vzorkovaný signál obsahuje M = 128 (MC = 65 viz Rovnice 21) vzorků a v časové oblasti je prohnán oknem prvního řádu (např. Hann), tudíž šířka půlky hlavního laloku je lmax = 2. Ve zmíněném normalizovaném DFT spektru je přítomno celkem hmax = 6 harmonických složek (včetně základní), jejichž hlavní spektrální čáry jsou na binech číslo [10; 20; 30; 39; 49; 59] (detekce viz 4.3).
Obrázek 39 Příklad výpočtu poměru signálu k falešné složce SFDR
V uvedeném spektru (viz Obrázek 39) je základní harmonická složka znázorněna zeleně a nalezená falešná složka je znázorněna červeně. Falešná složka se hledá na černých (červených) binech. Z hledání maximálního binu (falešné složky) jsou vyřazeny šedé DC biny a zelené biny základní harmonické. Barevně je vždy označen celý hlavní lalok požadované složky. Hodnoty z příkladu jsou doplněny do definičního vzorce (viz Rovnice 34): σʹ݈ൌെʹ ܺ݊ ݉ݎሾͳͲ ݈ሿ ൌ ͵ǡͳ σʹ݈ൌെʹ ܺ݊ ݉ݎሾʹͲ ݈ሿ ܵ ܴܦܨൌ ͳǡͻͶʹ ൌ ܵ ܿܤܴ݀ܦܨൌ ʹͲ ܵ ܴܦܨൌ ʹͲ ͳǡͻͶʹ ൌ ͷǡ
ܵ ʹ ܴܦܨൌ
Rovnice 35 Příklad výpočtu poměru signálu k falešné složce SFDR
Číselné hodnoty normalizovaného spektra v tomto příkladě jsou k nalezení v příloze (viz Příloha č. 1), kde je spektrum podrobněji okótováno. 5.3.2. Hlavička, parametry funkce Hlavička funkce pro výpočet poměru signálu k falešné složce SFDR: int SFDRcalc(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned long fundbin, double * SFDR);
72
Software pro testování AD převodníků 5.3 Poměr signálu k falešné složce SFDR Blokové schéma funkce pro výpočet poměru signálu k falešné složce SFDR:
Obrázek 40 Blok funkce pro výpočet poměru signálu k falešné složce SFDR
Vstupní parametry: nXa2h (nrmXabs2half) normalizované DFT spektrum (viz 4.1.1) lhalfc počet binů normalizovaného DFT spektra, délka pole nXa2h lmax šířka poloviny hlavního laloku v binech použitého okna (viz 4.2) hmax počet harmonických včetně základní, délka pole fhbin fundbin pozice (číslo) binu základní harmonické složky Výstupní parametry: SFDR poměr signálu k falešné složce [–] Výsledek funkce: 0 funkce proběhla v pořádku −1 chyba ve vstupních parametrech −2 chyba při alokaci paměti −4 chyba, délka oboustranného DFT spektra je lichá −5 chyba při adresaci v poli, chybný index v proměnné fundbin 0x01 varování (číslo bitu): základní harmonická nebo falešná složka leží nebo se dotýká DC binu 0x02 varování (číslo bitu): základní harmonická nebo falešná složka leží nebo se dotýká DFThalf binu 5.3.3. Popis algoritmu Výpočet poměru signálu k falešné složce SFDR je proveden dle definice (viz Rovnice 34). Nejdříve je alokována paměť pro kopii pole nrmXabs2half o délce lhalfc – normalizovaného DFT spektra, které již obsahuje kvadráty amplitud (viz 4.1.1) a provedena jeho kopie nrmXabs2half_, protože při výpočtu poměru signálu k falešné složce se bude toto pole upravovat. Nyní nastává část vyřazení binů v poli nrmXabs2half_, které nesmí být zahrnuty při hledání falešné složky. Vyřazení binů se provádí nulováním jejich amplitudy. Nejdříve se nuluje amplituda binu DC složky a základní harmonické složky a poté v cyklu se nulují amplitudy binů hlavního laloku o délce lmax u DC složky a délce ± lmax u základní harmonické složky. Pozice základní harmonické složky (číslo binu) je předána ve vstupním parametru fundbin. Po vyřazení všech požadovaných binů z pole nrmXabs2half_ je v poli vyhledána (funkcí findmax()) nejvyšší amplituda a její bin je uložen v proměnné spurbin. Poté je funkcí ARMS2calc() (viz 4.3) určen kvadrát efektivní hodnoty základní harmonické a nalezené falešné složky.
73
Software pro testování AD převodníků 5.3 Poměr signálu k falešné složce SFDR Poměr signálu k falešné složce je určen jako odmocnina z poměru kvadrátu efektivní hodnoty základní harmonické a kvadrátu efektivní hodnoty falešné složky. Výsledná hodnota je uložena na výstup SFDR. 5.3.4. Příklad funkce v C Použití funkce pro stanovení poměru signálu k falešné složce je v následujícím příkladu: #include "addynam.h" #include "io.h" int main() { unsigned char bits = 16; double Uref = 2.5; unsigned char hmax = 5; unsigned long ** ADcode; unsigned long length; unsigned long K; double * w; unsigned char lmax; double NNPG; double ** ADU; double ** xw; double ** Xabs; double * Xabsavg; double * nrmXabs2half; unsigned long lhalfc; unsigned long fundbin; double SFDR; unsigned long i; csv2adcdyn_in("ADoutdyn.csv", &ADcode, &length, &K); ADU = (double **) malloc (K * sizeof(**ADU)); xw = (double **) malloc (K * sizeof(**xw)); Xabs = (double **) malloc (K * sizeof(**Xabs)); window(W_NUTTALL, length, &w, &lmax, NULL, &NNPG); for (i = 0; i != K; i++) { AD2sig(bits, Uref, ADcode[i], length, &ADU[i]); windowsignal(ADU[i], w, length, &xw[i]); dft(xw[i], length, &Xabs[i], NULL); } avgdft(Xabs, K, length, &Xabsavg); nrmXabs2halfcalc(Xabsavg, length, NNPG, &nrmXabs2half, &lhalfc); fundchar(nrmXabs2half, lhalfc, lmax, &fundbin, NULL, NULL); SFDRcalc(nrmXabs2half, lhalfc, lmax, fundbin, &SFDR); printf("spurious free dynamic range SFDR of this ADC is: SFDR = %e [-]\n",SFDR); printf(" SFDR = %f [dB]\n",20*log10(SFDR)); alldyninonecalc(bits, Uref, ADcode, length, K, W_NUTTALL, hmax, NULL, NULL, NULL, NULL, NULL, &SFDR, NULL, NULL, NULL, NULL); for (i = 0; i != K; i++) { free(ADU[i]);free(xw[i]);free(Xabs[i]); } free(ADU);free(xw);free(Xabs); free(w);free(Xabsavg);free(nrmXabs2half);
74
Software pro testování AD převodníků 5.3 Poměr signálu k falešné složce SFDR return (0); }
Výstupní data 16 bitového AD převodníku (fullscale Uref = 2,5 V) jsou načteny funkcí csv2adcdyn_in() ze souboru ADoutdyn.csv (viz Příloha CD), který obsahuje 4 náměry po 2048 vzorcích. Poté je alokován první rozměr polí ADU, xw a Xabs podle počtu náměrů K. Funkcí window() (viz 4.2.1) je vypočtena okénkovací funkce okna NUTTALL a parametry NNPG („zeslabení okna“) a lmax (polovina šířky hlavního laloku) tohoto okna. Každý náměr je v cyklu převeden funkcí AD2sig() z hodnoty kódového slova na hodnotu napětí (podle Uref), oknován funkcí windowsignal() (viz 4.2.1) a jsou vypočteny amplitudové DFT spektra. Funkce avgdft() (viz 4.1.2) vytvoří průměrované DFT spektrum a funkce nrmXabs2halfcalc() (viz 4.1.2) vypočte normalizované DFT spektrum. Poté je funkcí fundchar() nalezena v normalizovaném DFT spektru nrmXabs2half základní harmonická složka a je určeno její číslo binu fundbin. Nyní je stanoven požadovaný poměr signálu k falešné složce SFDR AD převodníku funkcí SFDRcalc() (viz 5.3.2) a výsledky jsou vypsány. Celý postup určení poměru signálu k falešné složce SFDR od načtení vstupního souboru lze provést jedinou funkcí alldyninonecalc(). Nakonec jsou řádně uvolněna všechna dynamicky alokována pole. Výsledek: spurious free dynamic range SFDR of this ADC is: SFDR = 9.991776e+03 [-] SFDR = 79.992854 [dB]
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány použité funkce na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost, jen tehdy je zaručeno, že funkce proběhly v pořádku. Všechny použité funkce jsou také podrobně popsány v knihovnách addynam.c a io.c. 5.3.5. Příklad funkce v konzolové aplikaci Parametr –SFDR určuje funkci aplikace pro výpočet poměru signálu k falešné složce. Výstupní kódová slova AD převodníku jsou uloženy v csv souboru ADoutdyn.csv, počet sloupců určuje počet náměrů a počet řádků určuje počet vzorků. Počet bitů bits = 16, referenční napětí (fullscale) Uref = 2.5 V, použité okno č. 6 (Nuttall) a požadovaný počet harmonických hmax = 5 (včetné základní). addynam.exe –SFDR ADoutdyn.csv 16 2.5 6 5 addynam.exe –SFDR ADoutdyn.csv 16 2.5 6 5 –file sfdr.csv
V prvním příkladě bude výsledek poměru signálu k falešné složce vypsán na obrazovku (poměr, dB), ve druhém uložen do souboru sfdr.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. addynam.exe -?
5.4. Poměr signálu k šumu SNHR Poměr signál k šumu (SNHR, někdy značený SNR) udává odstup efektivní hodnoty signálu od celkové energie šumu.
75
Software pro testování AD převodníků 5.4 Poměr signálu k šumu SNHR 5.4.1. Definice Poměr signál k šumu SNHR (Signal NonHarmonic Ratio) je poměr efektivní hodnoty základní harmonické složky ponížené o šumový práh NFL k efektivní hodnotě celkového šumu. Kvadrát efektivní hodnoty požadované složky je vypočten z normalizovaného DFT spektra (viz 4.1.1) sumou jejích binů. Celkový šum je vypočten z binů ve spektru po vyřazení DC složky a jejího hlavního laloku a základní harmonické složky a jejího hlavního laloku. Tyto vyřazené biny jsou ve výpočtu nahrazeny šumovým prahem NFL. Poměr signál k šumu je stanoven jako poměr bez jednotky nebo v dB. Výpočet poměru signálu k šumu je uveden v následující rovnici: ݉ܽݔ σ݈݈ൌെ݈ ሺܺ݊ ݉ݎሾ ܬ ݈ሿ െ ܰ ʹܮܨሻ ݉ܽݔ
ʹ
ܵܰ ܴܪൌ
ܯ
ܥ σ݇ൌ݈
݉ܽݔ
ͳǢ്݇ ܬേ݈Ǣ്݇ ൣ݄൫ ܬേߝ ݆ ൯൧േ݈
ܺ݊ ݉ݎሾ݇ሿ൨ ܰ ʹܮܨሾ݈݉ܽ ݔ ͳ ݄݉ܽ ݔሺʹ݈݉ܽ ݔ ͳሻሿ
Rovnice 36 Výpočet poměru signálu k šumu SNHR
kde
SNHR2 NFL2 Xnrm MC k lmax l hmax h J εj round
je je je je je je je je je je je je
kvadrát poměru signálu k šumu kvadrát efektivní hodnoty šumového prahu (viz 5.1) normalizované DFT spektrum definované (viz 4.1.1) délka normalizovaného DFT spektra (viz 4.1.1) index frekvenčního binu v Xnrm šířka půlky hlavního laloku použitého okna (viz 4.2) index binu hlavního laloku, při výpočtu SNHR l ϵ <0; lmax> počet harmonických složek včetně základní index harmonické složky, při výpočtu SNHR h ϵ <2; hmax> číslo binu základní harmonické v Xnrm odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> funkce zaokrouhlení
Pozor, pokud dochází k aliasingu, některá vyšší harmonická složka má vyšší frekvenci než polovina vzorkovací frekvence, je nutno detekovat biny (viz. 4.3), na kterých se vyskytuje a tyto zahrnout do výpočtu namísto hJ. Tento vztah je odvozen ze standardu DYNAD [3]. Porovnání: zde definovaný vztah pro výpočet poměru signálu k šumu nahrazuje hodnotou šumového prahu biny celého DC laloku, celého laloku základní harmonické složky a celých laloků vyšších harmonických složek. V čitateli SNHR je efektivní hodnota základní harmonické složky ponížena o šumový práh v celém jejím laloku. Je upraven počet binů nahrazených šumovým prahem a ve výpočtu je používáno normalizované DFT spektrum. Příklad: Zde je uveden příklad pro výpočet poměru signálu k šumu z normalizovaného DFT spektra. V časové oblasti je použit sinusový signál o těchto parametrech: amplituda U = 51,4 mV; frekvence f = 7,6953 kHz. Vstupní signál je vzorkován frekvencí fs = 100 kHz, referenční napětí (amplituda) převodníku je Uref = 100 mV (fullscale = 200 mV). Vzorkovaný signál obsahuje M = 128 (MC = 65 viz Rovnice 21) vzorků a v časové oblasti je prohnán oknem prvního řádu (např. Hann), tudíž šířka půlky hlavního laloku je lmax = 2. Ve zmíněném normalizovaném DFT spektru je přítomno celkem hmax = 6
76
Software pro testování AD převodníků 5.4 Poměr signálu k šumu SNHR harmonických složek (včetně základní), jejichž hlavní spektrální čáry jsou na binech číslo [10; 20; 30; 39; 49; 59] (detekce viz 4.3). Kvadrát efektivní hodnoty šumového prahu NFL2 = 12,66 mV2.
Obrázek 41 Příklad výpočtu poměru signálu k šumu SNHR
V uvedeném spektru (viz Obrázek 41) je znázorněna zeleně základní harmonická složka, červeně biny šumu, šedě vyřazené biny (DC, vyšší harmonické), které jsou ve výpočtu nahrazeny hodnotou šumového prahu NFL. Spodní vynášecí čára kóty SNHR znázorňuje hodnotu celkové energie šumu. Základní harmonická složka je ponížena o malé červené úseky, které znázorňují hodnotu šumového prahu NFL. V základu spektrální čar DC a vyšších harmonických složek jsou mále červené úseky, které znázorňují nahrazení těchto binů šumovým prahem NFL. Nyní jsou hodnoty z příkladu doplněny do vzorce (viz Rovnice 36): ʹ
ܵܰ ܴܪൌ
σʹ݈ൌെʹሺܺ݊ ݉ݎሾͳͲ ݈ሿ െ ͳʹǡ ή ͳͲെ͵ ሻ
െ͵ ή ሾ͵ ή ͷሿ ൣσͷ ݇ൌ͵Ǣ്݇ۦͺȁͳʹۧǢͳۦͺȁʹʹۧǢʹۦͺȁ͵ʹۧǢ͵ۦȁͶͳۧǢۦͶȁͷͳۧǢۦͷȁͳۧ ܺ݊ ݉ݎሾ݇ሿ൧ ͳʹǡ ή ͳͲ
ܵܰ ʹܴܪൌ ͳǡͷʹͺ ܵܰ ܴܪൌ ͳǡʹ͵ ൌ ܵܰ ܤܴ݀ܪൌ ʹͲ ͳͲ ܵܰ ܴܪൌ ʹͲ ͳͲ ͳǡʹ͵ ൌ ͳǡͺͶ Rovnice 37 Příklad výpočtu poměru signálu k šumu SNHR
Číselné hodnoty normalizovaného spektra v tomto příkladě jsou k nalezení v příloze (viz Příloha č. 1), kde je spektrum podrobněji okótováno. 5.4.2. Hlavička, parametry funkce Hlavička funkce pro výpočet poměru signálu k šumu SNHR: int SNHRcalc(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned char hmax, unsigned long * fundharmbin, double * SNHR);
77
Software pro testování AD převodníků 5.4 Poměr signálu k šumu SNHR Blokové schéma funkce pro výpočet poměru signálu k šumu SNHR:
Obrázek 42 Blok funkce pro výpočet poměru signálu k šumu SNHR
Vstupní parametry: nXa2h (nrmXabs2half) normalizované DFT spektrum (viz 4.1.1) lhalfc počet binů normalizovaného DFT spektra, délka pole nXa2h lmax šířka poloviny hlavního laloku v binech použitého okna (viz 4.2) hmax počet harmonických včetně základní, délka pole fhbin fhbin (fundharmbin) pozice (čísla) binů harmonických Výstupní parametry: SNHR poměr signálu k šumu [–] Výsledek funkce: 0 funkce proběhla v pořádku −1 chyba ve vstupních parametrech −2 chyba při alokaci paměti −4 chyba, délka oboustranného DFT spektra je lichá −5 chyba při adresaci v poli, chybné indexy v poli fundharmbin 0x01 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DC binu 0x02 varování (číslo bitu): některá harmonická složka leží nebo se dotýká DFThalf binu 5.4.3. Popis algoritmu Výpočet poměru signálu k šumu SNHR je proveden dle definice (viz Rovnice 36). Nejdříve je alokována paměť pro kopii pole nrmXabs2half o délce lhalfc – normalizovaného DFT spektra, které již obsahuje kvadráty amplitud (viz 4.1.1) a provedena jeho kopie nrmXabs2half_, protože při výpočtu poměru signálu k šumu se bude toto pole upravovat. Nyní nastává část vyřazení binů v poli nrmXabs2half_, ze kterých se neprovádí výpočet poměru signálu k šumu. Vyřazení binů se provádí nulováním jejich amplitudy. V prvním kroku vyřazení se nuluje amplituda binu DC složky a v cyklu se nulují amplitudy binů hlavního laloku DC složky délky lmax. V druhém kroku vyřazení se v cyklu nulují amplitudy binů hmax harmonických složek (včetně základní) a ve vnořeném cyklu se nulují amplitudy binů hlavního laloku všech harmonických složek o délce ± lmax. Pozice harmonických složek (čísla binů) jsou předány ve vstupním poli fundharmbin o délce hmax. Po vyřazení všech požadovaných binů z pole nrmXabs2half_ je pole vzestupně seřazeno a provedena jeho suma noise2, která obsahuje energii šumu (pole je seřazeno vzestupně pro lepší číselnou stabilitu při sumování). Pomocí funkce NFLcalc (viz 5.1.2) je proveden výpočet kvadrát šumového prahu NFL2 (šumový práh lze vypočítat i ze
78
Software pro testování AD převodníků 5.4 Poměr signálu k šumu SNHR sumy noise2, ale kvůli možné změně/aktualizace definice dynamických parametrů je schválně použit výpočet odděleně). Nyní je potřeba k sumě noise2 připočítat šum z vyřazených binů, proto se vyřazené biny (DC, základní a vyšší harmonické a jejich hlavní laloky) nahradí hodnotou kvadrátu šumového prahu NFL2. K sumě noise2 je tedy připočten NFL2 násobený celkovým počtem vyřazených binů. Dále je vypočten funkcí ARMS2calc() kvadrát efektivní hodnoty základní harmonické složky. Protože jsou šumovým prahem nahrazeny i biny základní harmonické složky je nutno ponížit energii základní harmonické složky před vypočtením poměru. Proto je kvadrát efektivní hodnoty základní harmonické složky ponížen tolikrát o hodnotu kvadrátu šumového prahu, kolik binů hlavní lalok základní harmonické složky obsazuje (hlavní bin základní harmonické složky ± šířka hlavního laloku lmax). Nyní lze stanovit poměr signál k šumu jako odmocnina poníženého kvadrátu efektivní hodnoty základní harmonické složky a celkové energie šumu noise2 a výsledná hodnota je uložena na výstup SNHR. 5.4.4. Příklad funkce v C Použití funkce pro výpočet poměru signálu k šumu je v následujícím příkladu: #include "addynam.h" #include "io.h" int main() { unsigned char bits = 16; double Uref = 2.5; unsigned char hmax = 5; unsigned long ** ADcode; unsigned long length; unsigned long K; double * w; unsigned char lmax; double NNPG; double ** ADU; double ** xw; double ** Xabs; double * Xabsavg; double * nrmXabs2half; unsigned long lhalfc; double fundfreq; unsigned long * fundharmbin; double SNHR; unsigned long i; csv2adcdyn_in("ADoutdyn.csv", &ADcode, &length, &K); ADU = (double **) malloc (K * sizeof(**ADU)); xw = (double **) malloc (K * sizeof(**xw)); Xabs = (double **) malloc (K * sizeof(**Xabs)); window(W_NUTTALL, length, &w, &lmax, NULL, &NNPG); for (i = 0; i != K; i++) { AD2sig(bits, Uref, ADcode[i], length, &ADU[i]); windowsignal(ADU[i], w, length, &xw[i]); dft(xw[i], length, &Xabs[i], NULL); } avgdft(Xabs, K, length, &Xabsavg); nrmXabs2halfcalc(Xabsavg, length, NNPG, &nrmXabs2half, &lhalfc); fundchar(nrmXabs2half, lhalfc, lmax, NULL, &fundfreq, NULL); harmlocator(length, fundfreq, hmax, lmax, &fundharmbin, NULL); SNHRcalc(nrmXabs2half, lhalfc, lmax, hmax, fundharmbin, &SNHR); printf("signal nonharmonic ratio SNHR of this ADC is: SNHR = %e [-]\n",SNHR);
79
Software pro testování AD převodníků 5.4 Poměr signálu k šumu SNHR printf(" SNHR = %f [dB]\n",20*log10(SNHR)); alldyninonecalc(bits, Uref, ADcode, length, K, W_NUTTALL, hmax, NULL, NULL, NULL, NULL, NULL, NULL, &SNHR, NULL, NULL, NULL); for (i = 0; i != K; i++) { free(ADU[i]);free(xw[i]);free(Xabs[i]); } free(ADU);free(xw);free(Xabs); free(w);free(Xabsavg);free(nrmXabs2half);free(fundharmbin); return (0); }
Výstupní data 16 bitového AD převodníku (fullscale Uref = 2,5 V) jsou načteny funkcí csv2adcdyn_in() ze souboru ADoutdyn.csv (viz Příloha CD), který obsahuje 4 náměry po 2048 vzorcích. Poté je alokován první rozměr polí ADU, xw a Xabs podle počtu náměrů K. Funkcí window() (viz 4.2.1) je vypočtena okénkovací funkce okna NUTTALL a parametry NNPG („zeslabení okna“) a lmax (polovina šířky hlavního laloku) tohoto okna. Každý náměr je v cyklu převeden funkcí AD2sig() z hodnoty kódového slova na hodnotu napětí (podle Uref), oknován funkcí windowsignal() (viz 4.2.1) a jsou vypočteny amplitudové DFT spektra. Funkce avgdft() (viz 4.1.2) vytvoří průměrované DFT spektrum a funkce nrmXabs2halfcalc() (viz 4.1.2) vypočte normalizované DFT spektrum. Poté je funkcí fundchar() nalezena v normalizovaném DFT spektru nrmXabs2half základní harmonická složka a její odhadnutá frekvence v binech fundfreq. Čísla binů všech harmonických složek jsou vypočteny funkcí harmlocator() a uloženy do pole fundharmbin. Nyní je stanoven požadovaný poměr signálu k šumu SNHR AD převodníku funkcí SNHRcalc() (viz 5.4.2) a výsledky jsou vypsány. Celý postup určení poměru signálu k šumu SNHR od načtení vstupního souboru lze provést jedinou funkcí alldyninonecalc(). Nakonec jsou řádně uvolněna všechna dynamicky alokována pole. Výsledek: signal nonharmonic ratio SNHR of this ADC is: SNHR = 2.679328e+04 [-] SNHR = 88.560517 [dB]
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány použité funkce na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost, jen tehdy je zaručeno, že funkce proběhly v pořádku. Všechny použité funkce jsou také podrobně popsány v knihovnách addynam.c a io.c. 5.4.5. Příklad funkce v konzolové aplikaci Parametr –SNHR určuje funkci aplikace pro výpočet poměru signálu k šumu. Výstupní kódová slova AD převodníku jsou uloženy v csv souboru ADoutdyn.csv, počet sloupců určuje počet náměrů a počet řádků určuje počet vzorků. Počet bitů bits = 16, referenční napětí (fullscale) Uref = 2.5 V, použité okno č. 6 (Nuttall) a požadovaný počet harmonických hmax = 5 (včetné základní). addynam.exe –SNHR ADoutdyn.csv 16 2.5 6 5 addynam.exe –SNHR ADoutdyn.csv 16 2.5 6 5 –file snhr.csv
80
Software pro testování AD převodníků 5.4 Poměr signálu k šumu SNHR V prvním příkladě bude výsledek poměru signálu k šumu vypsán na obrazovku (poměr, dB), ve druhém uložen do souboru snhr.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. addynam.exe -?
5.5. Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB Poměr signál k šumu a zkreslení SINAD udává odstup efektivní hodnoty signálu od energie celkového harmonického zkreslení a energie šumu. Pomocí parametru SINAD se vypočítává i efektivní rozlišitelnost – efektivní počet bitů AD převodníku. 5.5.1. Definice Poměr signál k šumu a zkreslení SINAD (SIgnal Noise And Distrortion) je poměr efektivní hodnoty základní harmonické složky ponížené o šumový práh NFL k efektivní hodnotě celkového harmonického zkreslení a celkového šumu. Kvadrát efektivní hodnoty požadované složky je vypočten z normalizovaného DFT spektra (viz 4.1.1) sumou jejích binů. Celkové harmonické zkreslení je vypočteno sumou z binů vyšších harmonických složek v normalizovaném DFT spektru. Část celkového šumu je již obsažena v hodnotě celkového harmonického zkreslení (šum je obsažen na binech vyšších harmonických složek) a druhá část šumu je vypočtena ze zbylých binů (mimo vyšší harmonické složky) ve spektru po vyřazení DC složky a jejího hlavního laloku, základní harmonické složky a jejího hlavního laloku, tyto vyřazené biny jsou nahrazeny šumovým prahem NFL. Poměr signál k šumu a zkreslení je stanoven jako poměr bez jednotky nebo v dB. Výpočet poměru signálu k šumu a zkreslení je uveden následující rovnicích: ݉ܽݔ σ݈݈ൌെ݈ ሺܺ݊ ݉ݎሾ ܬ ݈ሿ െ ܰ ʹܮܨሻ ݉ܽݔ ܵ ܦܣܰܫൌ ܣܤ
ʹ
ܥܯ
ܣൌ
ܺ݊ ݉ݎሾ݇ሿ ܰ ʹܮܨሾ݈݉ܽ ݔ ͳ ሺʹ݈݉ܽ ݔ ͳሻሿ
݇ൌ݈ ݉ܽ ݔͳǢ്݇ ܬേ݈Ǣ്݇ ൣ݄൫ ܬേߝ ݆ ൯൧േ݈ ݄ ݉ܽ ݔܽ݉ ݈ ݔ
ܤൌ
ܺ݊ ݉ݎൣൣ݄൫ ܬേ ߝ݆ ൯൧ ݈൧
݄ൌʹ ݈ൌെ݈݉ܽݔ
Rovnice 38 Výpočet poměru signálu k šumu a zkreslení SINAD
kde
SINAD2 NFL2 A B Xnrm MC k lmax l
je kvadrát poměru signálu k šumu je kvadrát efektivní hodnoty šumového prahu (viz 5.1) zastupuje celkový šum zastupuje celkové harmonické zkreslení (včetně části šumu vyšších harmonických) je normalizované DFT spektrum definované (viz 4.1.1) je délka normalizovaného DFT spektra (viz 4.1.1) je index frekvenčního binu v Xnrm je šířka půlky hlavního laloku použitého okna (viz 4.2) je index binu hlavního laloku, při výpočtu SINAD l ϵ <0; lmax>
81
Software pro testování AD převodníků 5.5 Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB hmax h J εj round
je je je je je
počet harmonických složek včetně základní index harmonické složky, při výpočtu SINAD h ϵ <2; hmax> číslo binu základní harmonické v Xnrm odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> funkce zaokrouhlení
Vztah pro výpočet parametru SINAD je odvozen ze standardu DYNAD [3]. Porovnání: zde definovaný vztah pro výpočet poměru signálu k šumu a zkreslení nahrazuje hodnotou šumového prahu biny celého DC laloku a celého laloku základní harmonické složky. V čitateli SINAD je efektivní hodnota základní harmonické složky ponížena o šumový práh v celém jejím laloku. Je upraven počet binů nahrazených šumovým prahem a ve výpočtu je používáno normalizované DFT spektrum. Pozor, pokud dochází k aliasingu, některá vyšší harmonická má vyšší frekvenci než polovina vzorkovací frekvence je nutno detekovat biny (viz. 4.3), na kterých se vyskytuje a tyto zahrnout do výpočtu namísto hJ. Efektivní počet bitů AD převodníku je odvozen z parametru SINAD a je definován vztahem: ͳ ܷܮܲܯܣ ܤܱܰܧൌ ʹ ܵ ܦܣܰܫ ʹ ͳǡͷ െ ʹ ܵܨ ʹ ʹ Rovnice 39 Výpočet efektivního počtu bitů ENOB
Vztah pro výpočet ENOB je převzat ze standardu IEEE-1057 [1]. V praxi se těžko dosahuje plného využití rozsahu (fullscale) AD převodníku. Proto je doporučeno [3] ke stanovené hodnotě ENOB vždy uvádět poměr amplitudy vstupního signálu k rozsahu AD převodníku SFSR (Signal FullScale Ratio): ܵ ܴܵܨൌ
ʹ ή ܷܮܲܯܣ ሾെሿǢ ܵ ܵܨܤܴ݀ܵܨൌ ʹͲ ܵ ܴܵܨሾ ሿ ܵܨ
Rovnice 40 Výpočet poměru amplitudy vstupního signálu k rozsahu fullscale SFSR
Příklad: Zde je uveden příklad pro výpočet poměru signálu k šumu a zkreslení z normalizovaného DFT spektra a stanovení efektivního počtu bitů. V časové oblasti je použit sinusový signál o těchto parametrech: amplituda U = 51,4 mV; frekvence f = 7,6953 kHz. Vstupní signál je vzorkován frekvencí fs = 100 kHz, referenční napětí (amplituda) převodníku je Uref = 100 mV (fullscale = 200 mV). Vzorkovaný signál obsahuje M = 128 (MC = 65 viz Rovnice 21) vzorků a v časové oblasti je prohnán oknem prvního řádu (např. Hann), tudíž šířka půlky hlavního laloku je lmax = 2. Ve zmíněném normalizovaném DFT spektru je přítomno celkem hmax = 6 harmonických složek (včetně základní), jejichž hlavní spektrální čáry jsou na binech číslo [10; 20; 30; 39; 49; 59] (detekce viz 4.3). Kvadrát efektivní hodnoty šumového prahu NFL2 = 12,66 mV2.
82
Software pro testování AD převodníků 5.5 Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB
Obrázek 43 Příklad výpočtu poměru signálu k šumu a zkreslení SINAD
V uvedeném spektru (viz Obrázek 43) je znázorněna zeleně základní harmonická složka, červeně biny šumu, modře vyšší harmonické složky a šedě vyřazené biny DC složky, které jsou nahrazeny ve výpočtu hodnotou šumového prahu NFL. Spodní vynášecí čára kóty SINAD znázorňuje hodnotu celkové energie šumu a energie harmonického zkreslení. Základní harmonická složka je ponížena o malé červené úseky, které znázorňují hodnotu šumového prahu NFL. V základu spektrální čar DC jsou mále červené úseky, které znázorňují nahrazení těchto binů šumovým prahem NFL. Biny vyšších harmonických složek nejsou ani nahrazeny ani poníženy hodnotou šumového prahu, protože šum, který obsahují, je obsažen z jejich binů v celkovém harmonickém zkreslení. Nyní jsou hodnoty z příkladu doplněny do vzorce (viz Rovnice 38 a Rovnice 39): ܵ ʹܦܣܰܫൌ
σʹ݈ൌെʹሺܺ݊ ݉ݎሾͳͲ ݈ሿ െ ͳʹǡ ή ͳͲെ͵ ሻ ൌ Ͳǡͺͻ ͲǡͷͲʹͷ ͲǡͻͶ ͷ
ܣൌ
ܺ݊ ݉ݎሾ݇ሿ൩ ͳʹǡ ή ͳͲെ͵ ή ͺ ൌ ͷͲǡʹͷ ʹ
݇ൌ͵Ǣ്݇ۦͺȁͳʹۧǢͳۦͺȁʹʹۧǢʹۦͺȁ͵ʹۧǢ͵ۦȁͶͳۧǢۦͶȁͷͳۧǢۦͷȁͳۧ ʹ
ܤൌ ܺ݊ ݉ݎሾሾ݄ሺͳͲ െ Ͳǡͳͷሻሿ ݈ሿ ൌ ͻͶͲ ʹ ݄ൌʹ ݈ൌെʹ
ܵ ܦܣܰܫൌ Ͳǡͻ͵ʹ ൌ ܵ ܤ݀ܦܣܰܫൌ ʹͲ ͳͲ ܵ ܦܣܰܫൌ ʹͲ ͳͲ Ͳǡͻ͵ʹ ൌ െͲǡͳ Rovnice 41 Příklad výpočtu poměru signálu k šumu a zkreslení SINAD
ͳ ͷͳǡͶ ή ͳͲെ͵ ܤܱܰܧൌ ʹ Ͳǡͻ͵ʹ ʹ ͳǡͷ െ ʹ ൌ Ͳǡͷ ʹͲͲ ή ͳͲെ͵ ʹ ʹ Rovnice 42 Příklad výpočtu efektivního počtu bitů ENOB
ܵ ܴܵܨൌ
ʹ ή ͷͳǡͶ ή ͳͲെ͵ ൌ ͲǡͷͳͶ ൌ ܵ ܵܨܤܴ݀ܵܨൌ ʹͲ ͲǡͷͳͶ ൌ െͷǡͺ ʹͲͲ ή ͳͲെ͵
Rovnice 43 Výpočet poměru amplitudy vstupního signálu k rozsahu fullscale SFSR
Číselné hodnoty normalizovaného spektra v tomto příkladě jsou k nalezení v příloze (viz Příloha č. 1), kde je spektrum podrobněji okótováno.
83
Software pro testování AD převodníků 5.5 Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB Poznámka k příkladům: Zadané hodnoty DFT spektra uvedené v příkladech (viz 5.1.1, 5.2.1, 5.3.1, 5.4.1 a 5.5.1) jsou stanoveny tak, aby bylo možné názorně vysvětlit definice dynamických parametrů. Tudíž výsledné hodnoty stanovených dynamických parametrů neodpovídají reálným výsledkům měření. 5.5.2. Hlavička, parametry funkce Hlavička funkce pro výpočet poměru signálu k šumu a zkreslení SINAD: int SINDAcalc(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned char hmax, unsigned long * fundharmbin, double FS, double * SINAD, double * ENOB, double * SFSR);
Blokové schéma funkce pro výpočet poměru signálu k šumu a zkreslení SINAD:
Obrázek 44 Blok funkce pro výpočet poměru signálu k šumu a zkreslení SINAD
Vstupní parametry: nXa2h (nrmXabs2half) normalizované DFT spektrum (viz 4.1.1) lhalfc počet binů normalizovaného DFT spektra, délka pole nXa2h lmax šířka poloviny hlavního laloku v binech použitého okna (viz 4.2) hmax počet harmonických včetně základní, délka pole fhbin fhbin (fundharmbin) pozice (čísla) binů harmonických FS fullscale rozsah AD převodníku [V] Výstupní parametry: SINAD poměr signálu k šumu a zkreslení [–] ENOB efektivní počet bitů [bit] SFSR poměr amplitudy signálu k polovině fullscale AD převodníku [–] Výsledek funkce: 0 funkce proběhla v pořádku −1 chyba ve vstupních parametrech −2 chyba při alokaci paměti −3 chyba, není požadován žádný výstup (všechny výstupy jsou NULL) −4 chyba, délka oboustranného DFT spektra je lichá −5 chyba při adresaci v poli, chybné indexy v poli fundharmbin
84
Software pro testování AD převodníků 5.5 Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB 0x01 0x02
varování (číslo bitu): některá harmonická složka leží nebo se dotýká DC binu varování (číslo bitu): některá harmonická složka leží nebo se dotýká DFThalf binu
5.5.3. Popis algoritmu Výpočet poměru signálu k šumu a zkreslení SINAD a efektivní hodnoty bitů ENOB jsou provedeny dle definice (viz Rovnice 38 Rovnice 39). Nejdříve je alokována paměť pro kopii pole nrmXabs2half o délce lhalfc – normalizovaného DFT spektra, které již obsahuje kvadráty amplitud (viz 4.1.1) a provedena jeho kopie nrmXabs2half_, protože při výpočtu poměru signálu k šumu a zkreslení se bude toto pole upravovat. Nyní nastává část vyřazení binů v poli nrmXabs2half_, ze kterých se neprovádí výpočet poměru signálu k šumu a zkreslení. Vyřazení binů se provádí nulováním jejich amplitudy. V prvním kroku vyřazení se nuluje amplituda binu DC složky a v cyklu se nulují amplitudy binů hlavního laloku DC složky délky lmax. V druhém kroku vyřazení se v cyklu nulují amplitudy binů hmax harmonických složek (včetně základní) a ve vnořeném cyklu se nulují amplitudy binů hlavního laloku všech harmonických složek o délce ± lmax. Během nulování vyšších harmonických složek se zároveň počítá suma kvadrátu amplitud binů (efektivní hodnota) všech vyšších harmonických složek v proměnné distor2. Tím je dána celková energie zkreslení, obsažená v poměru SINAD. Pozice harmonických složek (čísla binů) jsou předány ve vstupním poli fundharmbin o délce hmax. Po vyřazení všech požadovaných binů z pole nrmXabs2half_ je pole vzestupně seřazeno a provedena jeho suma noise2, která obsahuje energii šumu (pole je seřazeno vzestupně pro lepší číselnou stabilitu při sumování). Pomocí funkce NFLcalc (viz 5.1.2) je proveden výpočet kvadrát šumového prahu NFL2 (šumový práh lze vypočítat i ze sumy noise2, ale kvůli možné změně/aktualizace definice dynamických parametrů je schválně použit výpočet odděleně). Nyní je potřeba k sumě noise2 připočíst šum z vyřazených binů DC složky a základní harmonické složky a jejich hlavních laloků. Pozor: k sumě noise2 se nepřičítá šum z binů vyšších harmonických složek, protože ten je již obsažen v energii zkreslení, v sumě distor2! Vyřazené biny (DC, základní složky a jejich hlavní laloky) nahradí hodnotou kvadrátu šumového prahu NFL2 („průměrná“ hodnota šumu). K sumě noise2 je tedy připočten NFL2 násobený počtem nulovaných binů DC složky a základní harmonické složky. Dále je vypočten funkcí ARMS2calc() kvadrát efektivní hodnoty základní harmonické složky fundRMS2. Protože jsou šumovým prahem nahrazeny i biny základní harmonické složky je nutno ponížit energii základní harmonické složky před vypočtením poměru. Proto je kvadrát efektivní hodnoty základní harmonické složky ponížen tolikrát o hodnotu kvadrátu šumového prahu, kolik binů hlavní lalok základní harmonické složky obsazuje (hlavní bin základní harmonické ± šířka hlavního laloku lmax). Před ponížením kvadrátu efektivní hodnoty základní harmonické složky se ještě spočítá parametr SFSR poměr amplitudy základní harmonické k polovině celkového rozsahu AD převodníku (fullscale) pro výpočet efektivního počtu bitů. Nyní lze stanovit poměr signál k šumu a zkreslení SINAD jako odmocnina poníženého kvadrátu efektivní hodnoty základní harmonické a celkové energie šumu noise2 plus celková energie harmonického zkreslení distor2. Efektivní počet bitů ENOB je stanoven podle definice (viz Rovnice 39). Výsledky jsou uloženy do výstupů SINAD, ENOB, SFSR. 5.5.4. Příklad funkce v C Použití funkce pro výpočet poměru signálu k šumu je v následujícím příkladu: #include "addynam.h" #include "io.h"
85
Software pro testování AD převodníků 5.5 Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB int main() { unsigned char bits = 16; double Uref = 2.5; unsigned char hmax = 5; unsigned long ** ADcode; unsigned long length; unsigned long K; double * w; unsigned char lmax; double NNPG; double ** ADU; double ** xw; double ** Xabs; double * Xabsavg; double * nrmXabs2half; unsigned long lhalfc; double fundfreq; unsigned long * fundharmbin; double SINAD; double ENOB; double SFSR; unsigned long i; csv2adcdyn_in("ADoutdyn.csv", &ADcode, &length, &K); ADU = (double **) malloc (K * sizeof(**ADU)); xw = (double **) malloc (K * sizeof(**xw)); Xabs = (double **) malloc (K * sizeof(**Xabs)); window(W_NUTTALL, length, &w, &lmax, NULL, &NNPG); for (i = 0; i != K; i++) { AD2sig(bits, Uref, ADcode[i], length, &ADU[i]); windowsignal(ADU[i], w, length, &xw[i]); dft(xw[i], length, &Xabs[i], NULL); } avgdft(Xabs, K, length, &Xabsavg); nrmXabs2halfcalc(Xabsavg, length, NNPG, &nrmXabs2half, &lhalfc); fundchar(nrmXabs2half, lhalfc, lmax, NULL, &fundfreq, NULL); harmlocator(length, fundfreq, hmax, lmax, &fundharmbin, NULL); SINADcalc(nrmXabs2half, lhalfc, lmax, hmax, fundharmbin, Uref, &SINAD, &ENOB, &SFSR); printf("signal noise and distortion ratio SINAD of this ADC is: SINAD = %e [-]\n",SINAD); printf(" SINAD = %f [dB]\n",20*log10(SINAD)); printf("number of effective bits (ENOB from SINAD) is: ENOB = %f [bits]\n",ENOB); printf("signal to fullscale ratio SFSR while estimating ENOB is: SFSR = %f [dBFS]\n",20*log10(SFSR)); alldyninonecalc(bits, Uref, ADcode, length, K, W_NUTTALL, hmax, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &SINAD, &ENOB, &SFSR); for (i = 0; i != K; i++) { free(ADU[i]);free(xw[i]);free(Xabs[i]); } free(ADU);free(xw);free(Xabs); free(w);free(Xabsavg);free(nrmXabs2half);free(fundharmbin); return (0); }
86
Software pro testování AD převodníků 5.5 Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB Výstupní data 16 bitového AD převodníku (fullscale Uref = 2,5 V) jsou načteny funkcí csv2adcdyn_in() ze souboru ADoutdyn.csv (viz Příloha CD), který obsahuje 4 náměry po 2048 vzorcích. Poté je alokován první rozměr polí ADU, xw a Xabs podle počtu náměrů K. Funkcí window() (viz 4.2.1) je vypočtena okénkovací funkce okna NUTTALL a parametry NNPG („zeslabení okna“) a lmax (polovina šířky hlavního laloku) tohoto okna. Každý náměr je v cyklu převeden funkcí AD2sig() z hodnoty kódového slova na hodnotu napětí (podle Uref), oknován funkcí windowsignal() (viz 4.2.1) a jsou vypočteny amplitudové DFT spektra. Funkce avgdft() (viz 4.1.2) vytvoří průměrované DFT spektrum a funkce nrmXabs2halfcalc() (viz 4.1.2) vypočte normalizované DFT spektrum. Poté je funkcí fundchar() nalezena v normalizovaném DFT spektru nrmXabs2half základní harmonická složka a její odhadnutá frekvence v binech fundfreq. Čísla binů všech harmonických složek jsou vypočteny funkcí harmlocator() a uloženy do pole fundharmbin. Nyní je stanoven požadovaný poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB AD převodníku funkcí SINADcalc() (viz 5.5.2) a výsledky jsou vypsány. Celý postup určení poměru signálu k šumu a zkreslení SINAD od načtení vstupního souboru lze provést jedinou funkcí alldyninonecalc(). Nakonec jsou řádně uvolněna všechna dynamicky alokována pole. Výsledek: signal noise and distortion ratio SINAD of this ADC is: SINAD = 8.462383e+03 [-] SINAD = 78.549854 [dB] number of effective bits (ENOB from SINAD) is: ENOB = 13.076295 [bits] signal to fullscale ratio SFSR while estimating ENOB is: SFSR = -1.938199 [dBFS]
Pozn. Pro jednoduchost nejsou v tomto příkladě testovány použité funkce na výsledek. V praktickém použití je doporučeno testovat funkce na nulovost, jen tehdy je zaručeno, že funkce proběhly v pořádku. Všechny použité funkce jsou také podrobně popsány v knihovnách addynam.c a io.c. 5.5.5. Příklad funkce v konzolové aplikaci Parametr –SINAD určuje funkci aplikace pro výpočet poměru signálu k šumu a zkreslení a pro výpočet effektivního počtu bitů. Výstupní kódová slova AD převodníku jsou uloženy v csv souboru ADoutdyn.csv, počet sloupců určuje počet náměrů a počet řádků určuje počet vzorků. Počet bitů bits = 16, referenční napětí (fullscale) Uref = 2.5 V, použité okno č. 6 (Nuttall) a požadovaný počet harmonických hmax = 5 (včetné základní). addynam.exe –SINAD ADoutdyn.csv 16 2.5 6 5 addynam.exe –SINAD ADoutdyn.csv 16 2.5 6 5 –file sinad.csv
V prvním příkladě výsledky poměr signálu k šumu a zkreslení (poměr, dB) a efektivní počet bitů včetně poměru signálu k fullscale (dBFS) budou vypsány na obrazovku, ve druhém příkladě budou výsledky uloženy (ve sledu: SINAD, ENOB, SFSR) do souboru sinad.csv. Pro zobrazení nápovědy v konzole je potřeba spustit program bez parametrů nebo s parametrem –?. addynam.exe -?
87
Software pro testování AD převodníků 6 Naměřené výsledky
6. Naměřené výsledky V této kapitole budou ukázány výsledky stanovených statických a dynamických parametrů AD převodníku na naměřených datech.
6.1. Statické parametry AD převodníku Naměřená data k testování statických parametrů AD převodníku poskytla firma STMicroelectronics. Data jsou naměřena na 10 bitovém AD převodníku. Vstupní napětí bylo generováno napěťovým kalibrátorem po krocích 0,25 mV od –10 mV do 2,505 V, referenční napětí AD převodníku Uref = 2,5 V. Na jedno kódové slovo AD převodníku připadá při této přenosové funkci průměrně 10 vzorků. Chyba nuly (viz 2.1) AD převodníku: zeroerr = –1,4096 LSB Chyba zesílení (viz 2.3) AD převodníku: gainerr = –0,2528 LSB
DNL [LSB]
Diferenciální nelinearita (viz 2.5) AD převodníku: 0,6 0,4 0,2 0 -0,2 -0,4 -0,6 -0,8 0
128
256
384
512
640
768
896
1024 AD code
maximání hodnota DNL na kódovém slově: DNL[511] = –0,69272 LSB
INL [LSB]
Integrální nelinearita (viz 2.6) AD převodníku: 1 0,5 0 -0,5 -1 0
128
256
384
512
640
768
896
1024 AD code
maximání hodnota INL na kódovém slově: INL[251] = –0,8639 LSB
88
Software pro testování AD převodníků 6.1 Statické parametry AD převodníku
histogram
Histogram kódových slov AD převodníku (viz 2.8): 50 40 30 20 10 0 0
128
256
384
512
640
768
896
1024 AD code
DNLh [LSB]
Diferenciální nelinearita (viz 2.8) AD převodníku stanovená z histogramu: 0,6 0,4 0,2 0 -0,2 -0,4 -0,6 -0,8 0
128
256
384
512
640
768
896
1024 AD code
maximání hodnota DNLh na kódovém slově: DNLh[511] = –0,69272 LSB
INLh [LSB]
Integrální nelinearita (viz 2.8) AD převodníku: 1 0,5 0 -0,5 -1 0
128
256
384
512
640
768
896
1024 AD code
maximání hodnota INLh na kódovém slově: INLh[251] = –0,8639 LSB Test monotónnosti (viz 2.9) AD převodníku odhalil chyby monotónnosti u 59 kódových slov, na 986. kódovém slově byly nalezeny dvě chyby monotónnosti. Všechny chyby monotónnosti měly hodnotu 1 LSB.
89
Software pro testování AD převodníků 6.2 Dynamické parametry AD převodníku
6.2. Dynamické parametry AD převodníku Stanovení dynamických parametrů bude porovnáno s [17]. Data AD převodníku jsou naměřena s generátorem Brüel & Kjar 1049 low-distortion generátor na 16 bitovém převodníku ADC module AD976A jako součást přístroje AD Transfer Standard. Vzorkovací frekvence fs = 156 kHz, počet vzorků length = 32768, při výpočtu dynamických parametrů je bráno v úvahu 20 harmonických složek. Naměřeny jsou 3 náměry pro frekvence základní harmonické složky ff = 1,333 kHz, 10,333 kHz a 20,333 kHz. Naměřená data (viz Příloha CD) poskytl pan Ing. David Slepička Ph.D. Naměřené hodnoty knihovnou addynam.c, použité okno Nuttall:
detekována ff [kHz] SFSR [dBFS] NFL [dBV] THD [dB] SFDR [dB] SNHR [dB] SINAD [dB] ENOB [bit]
ff = 1,333 kHz 1,3282 –0,09596 –128,94 –96,56 102,04 85,63 85,34 13,9
ff = 10,333 kHz 10,317 –0,1803 –126,84 –97,13 102,83 83,44 83,30 13,57
ff = 20,333 kHz 20,305 –0,403 –123,63 –90,61 92,71 80,01 79,69 13,01
Tabulka 3 Naměřená data, dynamické parametry addynam.c, okno Nuttall
Naměřené hodnoty knihovnou addynam.c, použité okno Blackman-Harris 7-term:
detekována ff [kHz] SFSR [dBFS] NFL [dBV] THD [dB] SFDR [dB] SNHR [dB] SINAD [dB] ENOB [bit]
ff = 1,333 kHz 1,3282 –0,09596 –128,95 –96,32 101,86 85,63 85,35 13,9
ff = 10,333 kHz 10,317 –0,1803 –126,81 –96,66 102,76 83,41 83,28 13,59
ff = 20,333 kHz 20,305 –0,403 –123,63 –90,28 92,72 80,01 79,69 13,01
Tabulka 4 Naměřená data, dynamické parametry addynam.c, okno Blackman-Harris 7-term
Naměřené hodnoty v [17], použité okno Blackman-Harris 7-term:
clsTHD [dB] SNR [dB] SINAD [dB]
ff = 1,333 kHz N/A N/A N/A
ff = 10,333 kHz –97 86 85
ff = 20,333 kHz –90 86 84
Tabulka 5 Data z [17], dynamické parametry, okno Blackman-Harris 7-term
90
Software pro testování AD převodníků 6.2 Dynamické parametry AD převodníku Ukázka výsledků dynamických parametrů v konzolové aplikaci pro ff = 20,333 kHz (viz Tabulka 4):
Obrázek 45 Konzolová aplikace addynam.exe – ukázka výsledků
91
Software pro testování AD převodníků 7 Závěr
7. Závěr Podle zadání byl vytvořen software pro stanovení všech požadovaných statických a dynamických parametrů AD převodníků. Funkce byly otestovány na reálných datech z AD převodníků (viz 6). Knihovna adstatic.c obsahuje funkce pro stanovení těchto statických parametrů: chyba nuly, chyba zesílení, diferenciální nelinearita DNL, integrální nelinearita INL a test monotónnosti převodní charakteristiky. Navíc knihovna adstatic.c obsahuje pro účely testování funkci převodníku (kvantizátoru) s definovatelnými statickými parametry. Knihovna addynam.c obsahuje následující funkce pro stanovení dynamických parametrů ve frekvenční oblasti, při nekoherentním vzorkování: šumový práh NFL, celkové harmonické zkreslení THD, poměr signálu k falešné složce SFDR, poměr signálu k šumu SNHR, poměr signálu k šumu a harmonickému zkreslení SINAD a efektivní počet bitů ENOB. Z knihovny addynam.c jsou dále k dispozici funkce pro výpočet okénkovací funkce a jejích parametrů, stanovení a průměrování DFT, výpočet normalizovaného DFT spektra (definované v 4.1.1). Bohužel se nestihlo v této práci implementovat funkce pro stanovení dynamických parametrů v časové oblasti metodou prokládané sinusovky. Knihovna addynam.c obsahuje dvě hotové funkce pro stanovení 3 parametrového odhadu prokladem sinusovkou (pevná frekvence) dle [1] a [3]. Obsahuje také funkci pro LU rozklad matic, který je využit při optimální implementaci [1] výpočtu inverzních matic, to je důležité pro stanovení 4 parametrového odhadu prokladem sinusovkou. Funkce pro 4 parametrový odhad dle [3] je rozpracovaná, není hotová. Při implementaci funkcí se vycházelo ze standardů pro testování AD převodníků: IEEE 1057–2007 [1], IEEE 1241–2000 [2] a DYNAD [3]. Ke knihovnám byla také vytvořena konzolová aplikace zkompilovaná pro platformu win32 (adstatic.exe, addynam.exe) a linux (./adstatic, ./addynam), která umožňuje rychlé a snadné vypočtení požadovaných parametrů AD převodníku. Konzolová aplikace může výsledky přímo zobrazit nebo používá jako vstup a výstup soubory typu csv (oddělené hodnoty oddělovačem), se kterými lze následně jednoduše pracovat např. v tabulkovém procesoru nebo matematickém softwaru. Software pro testování AD převodníků byl napsán v programovém jazyce ANSI C, využívá jen standardní knihovny a jednu externí dll knihovnu FFTW pro výpočet DFT [11], ta může být v případě potřeby jednoduše nahrazena (viz funkce dft(), kapitola 4.1). Čistý ANSI C kód je vhodný pro kompilaci programu pod různými platformami např. win32, linux, solaris atd. Důraz byl také kladen na důslednou dokumentaci zdrojového kódu a modularitu funkcí pro možné následné použití v dalších projektech katedry měření.
92
Software pro testování AD převodníků Seznam použitých zdrojů
Seznam použitých zdrojů [1] IEEE Instrumentation and Measurement Society. IEEE Std 1057™-2007: Standard for Digitizing Waveform Recorders. 2007. New York. [2] IEEE Instrumentation and Measurement Society. IEEE Std 1240™-2000: Standard for Terminology and Test Methods for Analog-to-Digital Converters. 2000. New York. [3] European project DYNAD - SMT4-CT98-2214-Draft standard - Version 3.3. Methods and draft standards for the DYNamic characterisation and testing of Analogue to Digital converters. 2000. [4] Martin Novotný, David Slepička, Miloš Sedláček. Uncertainty Analysis of the RMS Value and Phase in the Frequency Domain by Noncoherent Sampling. 2007. [5] Dominique Dallet, David Slepička, Yannick Berthoumieu, Djamel Haddadi, Philippe Marchegay. ADC Characterization in Time Domain Frequency Estimation to Linearize TimeDomain Analysis of AD Converters. 2006. [6] Albert H. Nuttall. Some Windows with Very Good Sidelobe Behavior. 1981. [7] Fredric J. Harris. On the Use of Windows for Harmonic Analysis with the Discrete Fourier Transform. 1978. [8] V. Hlaváč, M. Sedláček. Zpracování signálů a obrazů. 2000. Praha. [9] M. Sedláček, Z. Štoudek. Iterative design of DSP cosine windows by placing spectrum zeros, and some new classes of DSP cosine window. Paper in press (23.04.2010). [10] V. Haasz, J. Roztočil, J. Novák. Číslicové měřicí systémy. 2000. Praha. [11] Matteo Frigo, Steven G. Johnson. FFTW manual for version 3.2.2. 2009. Dostupné (24.04.2010) na url: http://www.fftw.org. [12] Autar Kaw. Textbook, Chapter 04.07 LU Decomposition. Univesity of South Florida. Dostupné (07.05.2010) na url: http://numericalmethods.eng.usf.edu/topics/lu_decomposition.html. [13] Gökseli Göde, António Manuel Couto Pinto, Domenico Luca Carni, Attila Sárhegyi, Martin Gustafsson. Frequency Domain analysis of ADCs in IEEE-1241 and DYNAD: A comparison. 2006. [14] Quicksort. Dostupné (08.02.2010) na url: http://en.wikipedia.org/wiki/Quicksort. [15] Binary search algorithm. Dostupné (08.02.2010) na url: http://en.wikipedia.org/wiki/Binary_search_algorithm. [16] STMicroelectronics Andrle Milan. Zadání pro stanovení statických parametrů ADC. Dokument ze dne (09.06.2009) (viz Příloha CD). [17] Vladimír Haasz, Jaroslav Roztočil, David Slepička. Evaluation of ADC Testing Systems Using ADC Transfer Standard. Praha. 93
Software pro testování AD převodníků Seznam obrázků, rovnic, tabulek a příloh
Seznam obrázků Obrázek 1 Příklad chyby nuly .................................................................................................................. 7 Obrázek 2 Blok funkce chyby nuly ........................................................................................................... 8 Obrázek 3 Příklad korekce chyby nuly ................................................................................................... 10 Obrázek 4 Blok funkce korekce chyby nuly ........................................................................................... 11 Obrázek 5 Příklad chyby zesílení ........................................................................................................... 13 Obrázek 6 Blok funkce chyby zesílení.................................................................................................... 14 Obrázek 7 Příklad korekce chyby zesílení.............................................................................................. 16 Obrázek 8 Blok funkce korekce chyby zesílení ...................................................................................... 17 Obrázek 9 Příklad diferenciální nelinearity ........................................................................................... 20 Obrázek 10 Blok funkce diferenciální nelinearity.................................................................................. 21 Obrázek 11 Příklad integrální nelinearity (výpočet z DNL) .................................................................... 24 Obrázek 12 Blok funkce integrální nelinearity (výpočet z DNL) ............................................................ 25 Obrázek 13 Příklad integrální nelinearity 2 (výpočet ze středu kódového slova) ................................. 27 Obrázek 14 Blok funkce integrální nelinearity 2 (výpočet ze středu kódového slova) ......................... 28 Obrázek 15 Příklad průběhu pro stanovení DNL a INL z histogramu .................................................... 32 Obrázek 16 Příklad histogramu pro stanovení DNL a INL ..................................................................... 32 Obrázek 17 Blok funkce DNL a INL z histogramu .................................................................................. 33 Obrázek 18 Příklad průběhu pro test monotónnosti ............................................................................ 36 Obrázek 19 Blok funkce test monotónnosti .......................................................................................... 37 Obrázek 20 Příklad řazení polí Uin a ADcode – adstaticsort() ............................................................... 40 Obrázek 21 Blok funkce pro řazení vstupních polí Uin a ADcode ......................................................... 41 Obrázek 22 Blok funkce pro načtení vstupů z csv ................................................................................. 42 Obrázek 23 Blok funkce pro uložení výstupů do csv ............................................................................. 42 Obrázek 24 Blokové schéma funkce kvantizátoru ................................................................................ 44 Obrázek 25 Blok funkce – generátor vstupu pro kvantizátor typu rampa ............................................ 47 Obrázek 26 Příklad oboustaného amplitudového DFT spektra ............................................................ 50 Obrázek 27 Blokové schéma funkce pro výpočet DFT .......................................................................... 51 Obrázek 28 Blokové schéma funkce pro průměrování DFT .................................................................. 52 Obrázek 29 Blokové schéma funkce pro výpočet normalizovaného DFT spektra ................................ 52 Obrázek 30 Blokové schéma pro výpočet okénkovací funkce .............................................................. 55 Obrázek 31 Blokové schéma pro aplikaci okénkovací funkce na vstupní signál ................................... 56 Obrázek 32 Blokové schéma funkce pro charakterizaci základní harmonické složky ........................... 58 Obrázek 33 Blokové schéma funkce lokalizace harmonických složek v normalizovaném DFT spektru 59 Obrázek 34 Blokové schéma funkce pro výpočet efektivní hodnoty (amplitudy) požadované složky . 59 Obrázek 35 Příklad výpočtu šumového prahu NFL ............................................................................... 62 Obrázek 36 Blok funkce pro výpočet šumového prahu NFL ................................................................. 63 Obrázek 37 Příklad výpočtu celkového harmonického zkreslení THD .................................................. 67 Obrázek 38 Blok funkce pro výpočet celkového harmonického zkreslení THD .................................... 68 Obrázek 39 Příklad výpočtu poměru signálu k falešné složce SFDR ..................................................... 72 Obrázek 40 Blok funkce pro výpočet poměru signálu k falešné složce SFDR ....................................... 73 Obrázek 41 Příklad výpočtu poměru signálu k šumu SNHR .................................................................. 77
94
Software pro testování AD převodníků Seznam obrázků, rovnic, tabulek a příloh Obrázek 42 Blok funkce pro výpočet poměru signálu k šumu SNHR .................................................... 78 Obrázek 43 Příklad výpočtu poměru signálu k šumu a zkreslení SINAD ............................................... 83 Obrázek 44 Blok funkce pro výpočet poměru signálu k šumu a zkreslení SINAD ................................. 84 Obrázek 45 Konzolová aplikace addynam.exe – ukázka výsledků ........................................................ 91
Seznam rovnic Rovnice 1 Výpočet chyby nuly ................................................................................................................. 8 Rovnice 2 Korekce chyby nuly ............................................................................................................... 11 Rovnice 3 Výpočet chyby zesílení .......................................................................................................... 13 Rovnice 4 Korekce chyby zesílení .......................................................................................................... 18 Rovnice 5 Výpočet diferenciální nelinearity .......................................................................................... 20 Rovnice 6 Definice integrální nelinearity (výpočet z DNL) .................................................................... 23 Rovnice 7 Výpočet integrální nelinearity .............................................................................................. 24 Rovnice 8 Příklad výpočtu integrální nelinearity z DNL ......................................................................... 24 Rovnice 9 Výpočet integrální nelinearity 2............................................................................................ 28 Rovnice 10 Diferenciální nelinearita z histogramu................................................................................ 31 Rovnice 11 Ideální počet výskytů kódového slova v histogramu .......................................................... 31 Rovnice 12 Integrální nelinearita z histogramu..................................................................................... 31 Rovnice 13 Příklad výpočtu ideálního počtu výskytů kódového slova .................................................. 32 Rovnice 14 Příklad výpočtu diferenciální nelinearity z histogramu ...................................................... 33 Rovnice 15 Příklad výpočtu integrální nelinearity z histogramu ........................................................... 33 Rovnice 16 Příklad výpočtu kvadratického průměru chyb monotónnosti ............................................ 37 Rovnice 17 Diskrétní Fourierova transformace – DFT ........................................................................... 49 Rovnice 18 Rozklad DFT na amplitudu a fázi ......................................................................................... 49 Rovnice 19 Průměrování amplitudového DFT spektra .......................................................................... 49 Rovnice 20 Výpočet jednostranného, normalizovaného, amplitudového DFT spektra........................ 50 Rovnice 21 Délka jednostranného, normalizovaného, amplitudového DFT spektra ............................ 51 Rovnice 22 Nekoherentní vzorkování ................................................................................................... 53 Rovnice 23 Výpočet okénkovací funkce ................................................................................................ 54 Rovnice 24 Aplikace okénkovací funkce na signál................................................................................. 54 Rovnice 25 Výpočet parametru NNPG použitého okna ........................................................................ 55 Rovnice 26 Výpočet parametru ENBW použitého okna ........................................................................ 55 Rovnice 27 Výpočet frekvence základní harmonické složky v normalizovaném DFT spektru .............. 57 Rovnice 28 Výpočet pozice (čísla binů) harmonických složek v normalizovaném DFT spektru ............ 57 Rovnice 29 Výpočet efektivní hodnoty požadované složky v normalizovaném DFT spektru ............... 58 Rovnice 30 Výpočet šumového prahu NFL ............................................................................................ 61 Rovnice 31 Příklad výpočtu šumového prahu NFL ................................................................................ 62 Rovnice 32 Výpočet harmonického zkreslení THD ................................................................................ 66 Rovnice 33 Příklad výpočtu harmonického zkreslení THD .................................................................... 67 Rovnice 34 Výpočet poměru signálu k falešné složce SFDR .................................................................. 71 Rovnice 35 Příklad výpočtu poměru signálu k falešné složce SFDR ...................................................... 72
95
Software pro testování AD převodníků Seznam obrázků, rovnic, tabulek a příloh Rovnice 36 Výpočet poměru signálu k šumu SNHR .............................................................................. 76 Rovnice 37 Příklad výpočtu poměru signálu k šumu SNHR ................................................................... 77 Rovnice 38 Výpočet poměru signálu k šumu a zkreslení SINAD ........................................................... 81 Rovnice 39 Výpočet efektivního počtu bitů ENOB ................................................................................ 82 Rovnice 40 Výpočet poměru amplitudy vstupního signálu k rozsahu fullscale SFSR ............................ 82 Rovnice 41 Příklad výpočtu poměru signálu k šumu a zkreslení SINAD ................................................ 83 Rovnice 42 Příklad výpočtu efektivního počtu bitů ENOB .................................................................... 83 Rovnice 43 Výpočet poměru amplitudy vstupního signálu k rozsahu fullscale SFSR ............................ 83
Seznam tabulek: Tabulka 1 Kritické parametry AD převodníků [2] .................................................................................... 5 Tabulka 2 Okna a jejich vlastnosti ......................................................................................................... 54 Tabulka 3 Naměřená data, dynamické parametry addynam.c, okno Nuttall ....................................... 90 Tabulka 4 Naměřená data, dynamické parametry addynam.c, okno Blackman-Harris 7-term ............ 90 Tabulka 5 Data z [17], dynamické parametry, okno Blackman-Harris 7-term ...................................... 90
Seznam příloh Příloha č. 1 – Podrobné nákresy příkladů. Příloha č. 2 – Ukázka zdrojových kódů. Příloha č. 3 – Ukázka konzolové aplikace adstatic a addynam. Příloha CD – Obsah přiloženého CD.
96
Software pro testování AD převodníků Příloha č. 1
Příloha č. 1 Podrobnější nákres průběhu použitého v příkladech pro stanovení statických parametrů AD převodníků (viz 2):
Podrobnější normalizované DFT spektrum použité v příkladech pro názorné stanovení dynamických parametrů (viz 5):
97
Software pro testování AD převodníků Příloha č. 2
Příloha č. 2 Ukázka zdrojového kódu software pro testování AD převodníků. Funkce pro výpočet diferenciální nelinearity difnonlin() (viz 2.5) AD převodníku z knihovny adstatic.c a funkce pro výpočet šumového prahu AD převodníku NFLcalc() (viz 5.1) z knihovny addynam.c: /************************************************************************** **************************** function difnonlin *************************** *************************************************************************** DESCRIPTION: Compute a static parameter of AD converter differential nonlinearity for all AD codes (in input unsigned long * ADcode). Differential nonlinearity is defined for this function as a difference of width of actual AD code to ideal width that is 1 LSB in voltage. Results are in voltage. For missing AD code result is -1. Output of this function is array of differential nonlinearity for every AD code and corresponding array of sorted single AD codes (e.g. for bits 10 is 0,1,2,3,4..1023). CONDITIONS: Array ADcode must be sorted with corresponding sorted array Uin. See functions qsortADcode() and qsortUinsep(). INPUTS: unsigned char bits : number of AD converter bits double Uref : reference voltage (fullscale unipolar) of AD converter, Uref should be 11..11 double * Uin : array of set voltage on input of ADC, sorted array (transfer function) unsigned long * ADcode : array of ADC digital output that responds to array double * Uin unsigned long length : number of elements in array double * Uin and unsigned long * ADcode OUTPUTS: unsigned long ** ADcode_s : pointer where is stored array of sorted single AD codes double ** DNL : pointer where is stored array of differential nonlinearity RESULT (int): 0 ok -1 error in INPUTS, e.g. length of array is incorrect **************************************************************************/ int difnonlin(unsigned char bits, double Uref, double * Uin, unsigned long * ADcode, unsigned long length, unsigned long ** ADcode_s, double ** DNL) { double ULSB; //voltage width of 1 LSB double DNLi; unsigned long i; //all ADcodes 0..2^bits unsigned long ADcodemax; //maximum of AD codes unsigned long j; //pointer to Uin array all values
98
Software pro testování AD převodníků Příloha č. 2 unsigned long * tempADcode_s; //temporary output ADcode_s array double * tempDNL; //temporary output DNL array if ((length <= 0) || (bits <= 0) || (ADcode == NULL) || (Uin == NULL) || (ADcode_s == NULL) || (DNL == NULL)) return (-1); ULSB = Uref/(pow(2,bits)); //voltage of 1 LSB ADcodemax = pow(2,bits); //maximum of AD codes j = 0; //init of pointer to Uin array tempADcode_s = (unsigned long *) malloc (ADcodemax * sizeof(*tempADcode_s)); //single AD codes tempDNL = (double *) malloc (ADcodemax * sizeof(*tempDNL)); //alloc for DNL output for (i = 0; i != ADcodemax; i++) { tempADcode_s[i] = i;
if (i == ADcode[j]) { DNLi = Uin[j];
//make single AD code array (iteration) //000,001..110,111 //test for missing AD code
//difference for AD code see prelast //line in this if j++; //save one while while ((j != length) && (i == ADcode[j])) //through one AD code, in //sorted array j++; if (j == length) //last ADcode j--; DNLi = Uin[j] - DNLi; //difference for AD code tempDNL[i] = DNLi / ULSB - 1; //store into DNL array
} else { tempDNL[i] = -1; }
//missing AD code
} tempDNL[0] = 0; tempDNL[ADcodemax-1] = 0; *ADcode_s = tempADcode_s; *DNL = tempDNL;
//no definition for first and last ADcode
// store outputs
return (0); }
99
Software pro testování AD převodníků Příloha č. 2 /************************************************************************** ****************************** function NFLcalc *************************** *************************************************************************** DESCRIPTION: Calculation of noise floor from DFT. Firstly function removes fundamental, harmonics with mainlobe bins (makes these bins zero). Then square of magnitudes through half of DFT (normalized DFT) is summed and diveded by remaining (after zeroing) bins number. [1] INPUTS: double * nrmXabs2half : one sided, squared and normalized abs (amplitude) DFT sperctrum unsigned long lhalfc : length of half DFT (including DFT half bin) (length of nrmXabs2half) unsigned char lmax : width of half main lobe of used window in bins, rectangular = 1, output of function window() unsigned char hmax : number of harmonics that are used to calculate NFL unsigned long * fundharmbin : array of estimated fundamental and harmonics bin location OUTPUTS (optional if NULL output is not saved): double * NFL : pointer where noise floor (magnitude) will be saved double * NFL2 : pointer where square of noise floor (magnitude) will be saved REFERENCES: [1] Project DYNAD - SMT4-CT98-2214-Draft standard - Version 3.3, September 22, 2000 RESULT (int): 0 ok -1 error in INPUTS, length of array is incorrect -2 error while allocationg memory -3 no output is requested -5 bad array indexing, main lobe of fundamental or harmonic is out of half DFT x may result with result of functions: ARMS2calc(), findmax() **************************************************************************/ int NFLcalc(double * nrmXabs2half, unsigned long lhalfc, unsigned char lmax, unsigned char hmax, unsigned long * fundharmbin, double * NFL, double * NFL2) { double tempNFL; //temporary output for noise floor double * nrmXabs2half_; //copy of nrmXabs2half, some bins gonna be //zeroed and array will be sorted unsigned long i; //index running through half DFT length, //length/2 unsigned char j; //index running through harmonics index, hmax unsigned char k; //index running through window main lobe //width, lmax unsigned long fhbin; //bin,index of fundamental or harmonics
100
Software pro testování AD převodníků Příloha č. 2 if ((nrmXabs2half == NULL) || (lhalfc == 0) || (lmax == 0) || (hmax == 0) || (fundharmbin == NULL)) return (-1); //parameters check if ((NFL == NULL) && (NFL2 == NULL)) return (-3); nrmXabs2half_ = (double *) malloc (lhalfc * sizeof(*nrmXabs2half_)); //alloc output for copy nrmXabs2half_ if (nrmXabs2half_ == NULL) return (-2); //allocating error for (i = 0; i != lhalfc; i++) { nrmXabs2half_[i] = nrmXabs2half[i]; }
//copy
tempNFL = 0; nrmXabs2half_[0] = 0; for (k = 1; k != (lmax + 1); k++) { nrmXabs2half_[k] = 0; } for (j = 0; j != hmax; j++)
//zeroing DC
//zeroing main lobe of DC
//zeroing fundamental, harmonics and //their window lobe
{ fhbin = fundharmbin[j]; //fundamental or harmonic max bin index if ((fhbin < ((unsigned long) lmax)) || ((fhbin+lmax) >= lhalfc)) //checking index array (fhbin - lmax) < 0 return (-5); nrmXabs2half_[fhbin] = 0; //zeroing fundamental or harmonic line for (k = 1; k != (lmax + 1); k++) { nrmXabs2half_[fhbin+k] = 0; //zeroing their main lobe nrmXabs2half_[fhbin-k] = 0; } } qsortd(0, (lhalfc-1), nrmXabs2half_);
for (i = 0; i != lhalfc; i++) { tempNFL = tempNFL + nrmXabs2half_[i]; }
//sorting array before summing for //better number (double) stability //in sum //sum for NFL calc //sum
tempNFL = tempNFL / (lhalfc - (lmax+1) - hmax*(2*lmax+1)); //dividing by number of bins, decreased of number of zeroed (DC //and harmonics) bins
101
Software pro testování AD převodníků Příloha č. 2
if (NFL2 != NULL) *NFL2 = tempNFL;
//store output if requested
tempNFL = sqrt(tempNFL);
//sqrt of square NFL
if (NFL != NULL) *NFL = tempNFL;
//store output if requested
free(nrmXabs2half_);
//free
return (0); }
102
Software pro testování AD převodníků Příloha č. 3
Příloha č. 3 Konzolová aplikace adstatic.exe (win32), zobrazení nápovědy:
103
Software pro testování AD převodníků Příloha č. 3 Konzolová aplikace addynam.exe (win32), zobrazení nápovědy:
104
Software pro testování AD převodníků Příloha CD
Příloha CD Obsah přiloženého CD. Adresářová striktura:
Console_app Zkompilované, konzolové aplikace adstatic a addynam pro platformu win32 a linux. DP_doc Tato diplomová práce ve formátu docx. Obsahuje také použité zdrojové obrázky v této práci. FFTW Knihovna FFTW použitá v této práci pro stanovení DFT (viz 4.1). [11] url: http://www.fftw.org Measure Naměřená reálná data AD převodníků použitá v kapitole 6 a další použitá vstupní data během testování. Sources_CVUT Použité zdroje licencované pro ČVUT v Praze. SW_ADC_testing Zdrojové kódy naprogramovaného softwaru pro testování AD převodníků. Knihovny adstatic, addynam, vstupné/výstupní knihovna io, zdrojové kódy konzolových aplikací main_adstatic a main_addynam. DP_2010_SARA.pdf Tato diplomová práce ve formátu pdf. Bc. Jakub Sára, 2010.
105