Programové vybavení pro testování AD převodníků

Podobné dokumenty
A/D převodníky - parametry

Snímání biologických signálů. A6M31LET Lékařská technika Zdeněk Horčík Katedra teorie obvodů

Realizace Sigma-Delta převodníku pomocí FPGA

Direct Digital Synthesis (DDS)

Quantization of acoustic low level signals. David Bursík, Miroslav Lukeš

Měření neelektrických veličin. Fakulta strojního inženýrství VUT v Brně Ústav konstruování

- DAC - Úvod A/D převodník převádějí analogové (spojité) veličiny na digitální (nespojitou) informaci. Základní zapojení převodníku ukazuje obr.

Binární data. Číslicový systém. Binární data. Klávesnice Snímače polohy, dotykové displeje, myš Digitalizovaná data odvozená z analogového signálu

DIPLOMOVÁ PRÁCE Lock-in zesilovač 500 khz 10 MHz

Úvod do zpracování signálů

KATEDRA ELEKTRICKÝCH MĚŘENÍ

CW01 - Teorie měření a regulace

5. A/Č převodník s postupnou aproximací

Vektorové obvodové analyzátory

Signál v čase a jeho spektrum

Vlastnosti členů regulačních obvodů Osnova kurzu

Měření na výkonovém zesilovači 1kW/144MHz by OK1GTH

Číslicový Voltmetr s ICL7107

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE DIPLOMOVÁ PRÁCE

Struktura a typy lékařských přístrojů. X31LET Lékařskátechnika Jan Havlík Katedra teorie obvodů

Analogově číslicové převodníky

- + C 2 A B V 1 V 2 - U cc

1 SENZORY V MECHATRONICKÝCH SOUSTAVÁCH

11. Odporový snímač teploty, měřicí systém a bezkontaktní teploměr

íta ové sít baseband narrowband broadband

2. GENERÁTORY MĚŘICÍCH SIGNÁLŮ II

Měření na nízkofrekvenčním zesilovači. Schéma zapojení:

DSY-4. Analogové a číslicové modulace. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Měřící přístroje a měření veličin

Číslicová filtrace. FIR filtry IIR filtry. ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická

Operační zesilovač (dále OZ)

základní vlastnosti, používané struktury návrhové prostředky MATLAB problém kvantování koeficientů

Lineární a adaptivní zpracování dat. 1. ÚVOD: SIGNÁLY a SYSTÉMY

31SCS Speciální číslicové systémy Antialiasing

KTE/TEVS - Rychlá Fourierova transformace. Pavel Karban. Katedra teoretické elektrotechniky Fakulta elektrotechnická Západočeská univerzita v Plzni

Základní metody číslicového zpracování signálu část I.

1. Navrhněte a prakticky realizujte pomocí odporových a kapacitních dekáda derivační obvod se zadanou časovou konstantu: τ 2 = 320µs

Praha technic/(4 -+ (/T'ERATU"'P. ))I~~

18A - PRINCIPY ČÍSLICOVÝCH MĚŘICÍCH PŘÍSTROJŮ Voltmetry, A/D převodníky - principy, vlastnosti, Kmitoměry, čítače, fázoměry, Q- metry

Číslicové filtry. Honza Černocký, ÚPGM

VY_32_INOVACE_E 15 03

1. Základy teorie přenosu informací

MĚŘENÍ A DIAGNOSTIKA

4. MĚŘENÍ NA SMĚŠOVAČI A MEZIFREKVENČNÍM FILTRU

ETC Embedded Technology Club setkání 6, 3B zahájení třetího ročníku

OPERA Č NÍ ZESILOVA Č E

Oddělovací moduly VariTrans

CW01 - Teorie měření a regulace

Struktura a architektura počítačů (BI-SAP) 5

APLIKACE ALGORITMŮ ČÍSLICOVÉHO ZPRACOVÁNÍ SIGNÁLŮ 1. DÍL

popsat princip činnosti základních zapojení čidel napětí a proudu samostatně změřit zadanou úlohu

Měření nelineárních parametrů

Harmonizace metod vyhodnocení naměřených dat při zkratových zkouškách

MĚŘENÍ TEPLOTY TERMOČLÁNKY

DUM 19 téma: Digitální regulátor výklad

Čísla, reprezentace, zjednodušené výpočty

Spektrální analyzátory

VÝVOJ ŘÍDICÍCH ALGORITMŮ HYDRAULICKÝCH POHONŮ S VYUŽITÍM SIGNÁLOVÉHO PROCESORU DSPACE

LabView jako programovací jazyk II

Teoretický úvod: [%] (1)

2 Teoretický úvod Základní princip harmonické analýzy Podmínky harmonické analýzy signálů Obdelník Trojúhelník...

Hlavní parametry rádiových přijímačů

Tel-30 Nabíjení kapacitoru konstantním proudem [V(C1), I(C1)] Start: Transient Tranzientní analýza ukazuje, jaké napětí vytvoří proud 5mA za 4ms na ka

ZÁKLADY AUTOMATICKÉHO ŘÍZENÍ

Technická kybernetika. Obsah. Principy zobrazení, sběru a uchování dat. Měřicí řetězec. Principy zobrazení, sběru a uchování dat

Struktura a typy lékařských přístrojů. X31LET Lékařskátechnika Jan Havlík Katedra teorie obvodů

Externí 12V / 200 ma (adaptér v příslušenství)

Teorie úlohy: Operační zesilovač je elektronický obvod, který se využívá v měřící, výpočetní a regulační technice. Má napěťové zesílení alespoň A u

Analýza a zpracování digitálního obrazu

Učební osnova předmětu ELEKTRICKÁ MĚŘENÍ

Pracoviště 1. Vliv vnitřního odporu voltmetru na výstupní napětí můstku. Přístroje: Úkol měření: Schéma zapojení:

Číslicové zpracování signálů a Fourierova analýza.

(s výjimkou komparátoru v zapojení č. 5) se vyhněte saturaci výstupního napětí. Volte tedy

Funkce komplexní proměnné a integrální transformace

Automatizace je proces při němž je řídicí funkce člověka nahrazována činností

Mikrosenzory a mikroelektromechanické systémy

SIGNÁLY A SOUSTAVY, SIGNÁLY A SYSTÉMY

Obr. 1 Činnost omezovače amplitudy

Srovnání kvality snímání analogových veličin řídících desek se signálovým procesorem Motorola DSP56F805. Úvod. Testované desky

TECHNICKÁ UNIVERZITA V LIBERCI

ROZDĚLENÍ SNÍMAČŮ, POŽADAVKY KLADENÉ NA SNÍMAČE, VLASTNOSTI SNÍMAČŮ

A/D a D/A PŘEVODNÍK 0(4) až 24 ma DC, 16 bitů

Elektronické praktikum EPR1

VSTUPNÍ VÝSTUPNÍ ROZSAHY

Laboratorní zdroj - 6. část

Návrh frekvenčního filtru

D C A C. Otázka 1. Kolik z následujících matic je singulární? A. 0 B. 1 C. 2 D. 3

Fakulta elektrotechnická Katedra aplikované elektroniky a telekomunikací. Diplomová práce. Testování a měření audio A/D a D/A převodníků

Dodatek k uživatelském manuálu Adash 4202 Revize MK

3 METODY PRO POTLAČENÍ ŠUMU U ŘE- ČOVÉHO SIGNÁLU

Operační zesilovač, jeho vlastnosti a využití:

ODHALOVÁNÍ PADĚLKŮ SOUČÁSTEK PARAMETRICKÝM MĚŘENÍM

SIGNÁLY A LINEÁRNÍ SYSTÉMY

Semestrální projekt. Vyhodnocení přesnosti sebelokalizace VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ. Fakulta elektrotechniky a komunikačních technologií

ČESKÁ TECHNICKÁ NORMA

I. Současná analogová technika

SIGNÁLY A LINEÁRNÍ SYSTÉMY

1 Zadání. 2 Teoretický úvod. 7. Využití laboratorních přístrojů v elektrotechnické praxi

Úvod do programování. Lekce 1

Modelování a simulace Lukáš Otte

Transkript:

Č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 Analog- Digital 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

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

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

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

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

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í Kritické parametry Požadavky na AD převodníky Automatizace, DNL, INL, monotónnost, Lineární přenosová funkce. senzory doba ustálení, Tepelná stabilita. Číslicové osciloskopy dlouhodobá stabilita SINAD, ENOB, NFL, šířka pásma, rychlá obnova ze saturace Plné využití rozsahu (fullscale). SINAD pro široké pásmo. Nízký tepelný šum. Geofyzika THD, SINAD dlouhodobá stabilita Odezva na velmi nízké frekvence (mhz). Radary a sonary SINAD, IMD, ENOB, SFDR, rychlá obnova ze saturace SINAD a IMD kvůli detekci Dopplerova jevu. Spektrální analyzátory SINAD, ENOB, SFDR SINAD a SFDR pro dynamický rozsah. Linearita v širokém pásmu. Širokopásmové přijímače SFDR, IMD, SINAD Linearita v dynamickém pásmu pro detekci velmi slabých signálů v zarušeném prostředí. Rychlé vzorkování. Telekomunikace SINAD, NFL, SFDR, IMD, kódová chybovost Mezikanálový přeslech. Nízká spotřeba energie. Video DNL, SINAD, SFDR Chyba zesílení, chyba fáze. Zpracování obrazu DNL, INL, SINAD, ENOB, rychlá obnova ze saturace DNL pro detekci hran. Rychlá obnova proti rozkvětu (blooming). Zpracování zvuku SINAD, THD Nízká spotřeba energie. Plné využití rozsahu (fullscale). Tabulka 1 Kritické parametry AD převodníků [2] kde DNL je diferenciální nelinearita INL je integrální nelinearita SINAD je poměr signálu k šumu a harmonickému zkreslení ENOB je efektivní počet bitů (efektivní rozlišitelnost) NFL je šumový práh THD je celkové harmonické zkreslení IMD je intermodulační zkreslení SFDR je 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

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

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 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 je chyba nuly ve Voltech rozdíl polohy první přechodové úrovně oproti ideální U ze 7

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 je chyba nuly v LSB U LSB je šířka LSB ve Voltech U ref je referenční napětí AD převodníku bits je 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

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

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

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 Uin zc je pole vstupních napětí AD převodníku po korekci chyby nuly Uin je pole vstupních napětí AD převodníku i je index polí Uin a Uin zc, i ϵ <0; length) zeroerr je chyba nuly AD převodníku v LSB U LSB je šířka LSB ve Voltech U ref je referenční napětí AD převodníku bits je počet bitů AD převodníku 11

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

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 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 U ge 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

2.3 Chyba zesílení kde gainerr je chyba zesílení v LSB U LSB je šířka LSB ve Voltech U ref je referenční napětí AD převodníku bits je 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

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

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

2.4 Korekce chyby zesílení 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 k je směrnice zesílení průběhu AD převodníku z příkladu je směrnice zesílení ideálního (zeleného) průběhu k ideal 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

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ň (U LSB ) korigována nebyla (pozn. hodnoty Uin před první přechodovou úrovní jsou touto korekcí ovlivněny): Rovnice 4 Korekce chyby zesílení kde Uin gc je pole vstupních napětí AD převodníku po korekci chyby zesílení Uin je pole vstupních napětí AD převodníku i je index polí Uin a Uin gc, i ϵ <0; length) gainerr je chyba zesílení AD převodníku v LSB U LSB je šířka LSB ve Voltech U ref je referenční napětí AD převodníku bits je 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

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

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 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 je šířka k-tého kódového slova ve Voltech U DNL[k] 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] je diferenciální nelinearita k-tého kódového slova v LSB U DNL[k] je šířka k-tého kódového slova ve Voltech U LSB je šířka LSB ve Voltech U ref je referenční napětí AD převodníku bits je 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

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 2 bits DNL pole diferenciální nelinearity, délka tohoto pole je 2 bits 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[2 bits 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

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

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

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 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 U INL[k] je 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] je integrální nelinearita k-tého kódového slova v LSB U INL[k] je vzdálenost pozice k-tého kódového slova oproti ideálnímu ve Voltech U LSB je šířka LSB ve Voltech U ref je referenční napětí AD převodníku bits je 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

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 2 bits INL pole integrální nelinearity, délka tohoto pole je 2 bits 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[2 bits 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

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

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 k- té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

2.7 Integrální nelinearita 2 (výpočet ze středu kódového slova) 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 U INL2[k] je 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] je integrální nelinearita 2 k-tého kódového slova v LSB U INL2[k] je vzdálenost středu k-tého kódového slova oproti ideálnímu středu ve Voltech U LSB je šířka LSB ve Voltech U ref je referenční napětí AD převodníku bits je 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 2 bits INL2 pole integrální nelinearity 2, délka tohoto pole je 2 bits 28

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[2 bits 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

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

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; 2 bits 2) occ k je počet výskytů k-tého kódového slova v histogramu je ideální počet výskytů kódového slova v histogramu occ ideal Rovnice 11 Ideální počet výskytů kódového slova v histogramu kde occ n je počet výskytů všech kódových slov v histogramu odpovídá délce pole ADcode occ 0 je počet výskytů prvního kódového slova (ADcode = 0) v histogramu occ 2bits 1 je počet výskytů posledního kódového slova (ADcode = 2 bits 1) v histogramu bits je 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

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 výstup AD převodníku kódové slovo occurence je počet vzorků na kódové slovo (počet výskytů kódového slova) ADcode width je šířka kódového slova v LSB (z počtu výskytů kódového slova) ideal occurence je 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

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 2 bits hist pole histogramu (počet výskytů ADcode), délka tohoto pole je 2 bits 33

2.8 DNL a INL z histogramu DNLh INLh pole diferenciální nelinearity vypočtené z histogramu, délka tohoto pole je 2 bits pole integrální nelinearity vypočtené z histogramu, délka tohoto pole je 2 bits 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

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

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

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 2 bits mnterrn pole počtů chyb monotónnosti u kódových slov, délka tohoto pole je 2 bits mntsigma pole kvadratických průměrů chyb monotónnosti u kódových slov, délka tohoto pole je 2 bits 37

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

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

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

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 počet bitů AD převodníku Uin pole vstupních napětí AD převodníku, bude ovlivněno řazením ADcode pole výstupních kódových slov AD převodníku, bude ovlivněno řazením length 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

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

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

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

3.3 Kvantizátor s definovatelnými statickými parametry Parametry: bits počet bitů AD převodníku/kvantizátoru Uref referenční napětí AD převodníku/kvantizátoru Uin pole vstupních napětí, které má být převedeno na kódová slova length délka pole Uin a také délka výstupního pole ADcode zeroerr požadovaná chyba nuly kvantizátoru v LSB gainerr požadovaná chyba zesílení kvantizátoru v LSB DNL pole požadované diferenciální nelinearity v LSB, pozice v poli odpovídá kódovému slovu, délka pole musí být 2 bits, 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

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

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 = 2 bits 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 2 bits ), 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

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

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] je obraz (amplituda, fáze) vstupního signálu ve spektru na k-tém frekvenčním binu k ϵ <0; M 1> x[n] je n-tý vzorek vstupního signálu, časová oblast M 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] je amplituda k-tého frekvenčního binu v DFT spektru φ[k] je fáze k-tého frekvenčním binu v DFT spektru M 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

4.1 Diskrétní Fourierova transformace DFT kde Xavg[k] je průměrovaná amplituda k-tého frekvenčního binu v DFT spektru k ϵ <0; M 1> X kn [k] 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

4.1 Diskrétní Fourierova transformace DFT Rovnice 21 Délka jednostranného, normalizovaného, amplitudového DFT spektra kde Xnrm[k h ] je amplituda k h -tého frekvenčního binu v normalizovaném DFT spektru k h ϵ <1; M/2 1> X[k h ] je amplituda k h -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 M C je délka jednostranného, normalizovaného, amplitudového DFT spektra 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: Hlavička funkce pro průměrování DFT: Obrázek 27 Blokové schéma funkce pro výpočet DFT int avgdft(double ** X, unsigned long K, unsigned long length, double ** Xavg); 51

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

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 je frekvence vstupního signálu (základní harmonické sinusovky) fs je vzorkovací frekvence M je počet vzorků vstupního signálu J je celé číslo, počet period vstupního signálu v záznamu εj je 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

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 lmax [bin] SLA [db] SLFO [db/oct] ΔSNHR [db], ADC [bit] Hann 2-31,47 18 6 db při 6 bit ADC Hamming 2-43 6 1 db při 4 bit ADC Blackman 3-58,11 18 2,4 db při 6 bit ADC Exact Blackman 3-68,24 6 2,5 db při 6 bit ADC Nuttall 4-98,17 6 5,3 db při 14 bit ADC Blackman-Harris 4-term 4-92,01 6,33 Blackman-Harris 7-term 7-175 0,13 db při 24 bit ADC Tabulka 2 Okna a jejich vlastnosti kde lmax je šířka půlky hlavního laloku SLA je odstup hlavního laloku k postranním (k nejvyššímu postrannímu laloku) SLFO je útlum postranních laloků na oktávu ΔSNHR je 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] je n-tý vzorek okénkovací funkce lmax je šířka půlky hlavního laloku okna (řád okna + 1), l ϵ <0; lmax> a k je k-tý koeficient použitého okna, suma těchto koeficientů je rovna 1 M je 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

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] je n-tý vzorek okénkovací funkce M 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] je n-tý vzorek okénkovací funkce M 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

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

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 f f je vypočtená frekvence základní harmonické složky v binech X nrm je normalizované DFT spektrum definované (viz 4.1.1) lmax je šířka půlky hlavního laloku použitého okna (viz 4.2) l je index binu hlavního laloku, l ϵ < lmax; lmax> J je číslo binu základní harmonické, maximum v X nrm po zamítnutí DC může být v intervalu J ϵ <0 + lmax + 1; M C lmax 1> M C je délka normalizovaného DFT spektra (viz 4.1.1) 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 fh bin [0] je číslo binu základní harmonické složky fh bin [h] je číslo binu (h + 1)-té vyšší harmonické složky h ϵ <1; hmax 1> f f je vypočtená frekvence základní harmonické složky (viz Rovnice 27) M je počet vzorků, délka oboustranného DFT spektra, M = 2 (M C 1) round je funkce: zaokrouhlení mod je funkce: zbytek po dělení 57

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 U RMS [k] je efektivní hodnota požadované složky na k-tém binu X nrm je normalizované DFT spektrum definované (viz 4.1.1) lmax je šířka půlky hlavního laloku použitého okna (viz 4.2) l je 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 č. (M C 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

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 (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 (volitelný výstup) fundfreq odhadnutá frekvence základní harmonické složky (volitelný výstup) epsilonj 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

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

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 NFL 2 je kvadrát efektivní hodnoty šumového prahu X nrm je normalizované DFT spektrum definované (viz 4.1.1) M C je délka normalizované DFT spektra (viz 4.1.1) k je index frekvenčního binu v X nrm lmax je šířka půlky hlavního laloku použitého okna (viz 4.2) l je index binu hlavního laloku, při výpočtu NFL l ϵ <0; lmax> hmax je počet harmonických složek včetně základní h je index harmonické složky, při výpočtu NFL h ϵ <2; hmax> J je číslo binu základní harmonické v X nrm 61

5.1 Šumový práh NFL εj je odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> round 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 (M C = 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

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 [V 2 ] (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

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

5.1 Šumový práh NFL printf("noise floor NFL of this ADC is: NFL = %e [V]\n",NFL); printf("nfl = %f [dbv]\n",20*log10(nfl)); printf("nfl = %f [dbc]\n",20*log10(nfl/sqrt(fundampl2))); printf("nfl = %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 this ADC is: NFL = 8.243227e-07 [V] NFL = -121.678054 [dbv] NFL = -121.678055 [dbc] NFL = -217.335509 [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

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 THD 2 je kvadrát celkového harmonického zkreslení X nrm je normalizované DFT spektrum definované (viz 4.1.1) lmax je šířka půlky hlavního laloku použitého okna (viz 4.2) l je index binu hlavního laloku, při výpočtu THD l ϵ < lmax; lmax> hmax je počet harmonických složek včetně základní h je index harmonické složky, při výpočtu THD h ϵ <2; hmax> J je číslo binu základní harmonické v X nrm εj je odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> round 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 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

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 (M C = 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

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

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

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

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 SFDR 2 je kvadrát poměru signálu k falešné složce X nrm je normalizované DFT spektrum definované (viz 4.1.1) lmax je šířka půlky hlavního laloku použitého okna (viz 4.2) l je index binu hlavního laloku, při výpočtu SFDR l ϵ < lmax; lmax> J je číslo binu základní harmonické v X nrm S je čí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

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 (M C = 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

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

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

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

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 SNHR 2 je kvadrát poměru signálu k šumu NFL 2 je kvadrát efektivní hodnoty šumového prahu (viz 5.1) X nrm je normalizované DFT spektrum definované (viz 4.1.1) M C je délka normalizovaného DFT spektra (viz 4.1.1) k je index frekvenčního binu v X nrm lmax je šířka půlky hlavního laloku použitého okna (viz 4.2) l je index binu hlavního laloku, při výpočtu SNHR l ϵ <0; lmax> hmax je počet harmonických složek včetně základní h je index harmonické složky, při výpočtu SNHR h ϵ <2; hmax> J je číslo binu základní harmonické v X nrm εj je odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> round je 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 (M C = 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

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 NFL 2 = 12,66 mv 2. 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

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

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

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

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 SINAD 2 je kvadrát poměru signálu k šumu NFL 2 je kvadrát efektivní hodnoty šumového prahu (viz 5.1) A zastupuje celkový šum B zastupuje celkové harmonické zkreslení (včetně části šumu vyšších harmonických) X nrm je normalizované DFT spektrum definované (viz 4.1.1) M C je délka normalizovaného DFT spektra (viz 4.1.1) k je index frekvenčního binu v X nrm lmax je šířka půlky hlavního laloku použitého okna (viz 4.2) l je index binu hlavního laloku, při výpočtu SINAD l ϵ <0; lmax> 81

5.5 Poměr signálu k šumu a zkreslení SINAD a efektivní počet bitů ENOB hmax je počet harmonických složek včetně základní h je index harmonické složky, při výpočtu SINAD h ϵ <2; hmax> J je číslo binu základní harmonické v X nrm εj je odchylka binu základní harmonické od skutečné frekvence (viz 4.2), εj ϵ (-0,5; 0,5> round je 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 (M C = 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 NFL 2 = 12,66 mv 2. 82

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

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

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

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

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

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 Diferenciální nelinearita (viz 2.5) AD převodníku: DNL [LSB] 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 Integrální nelinearita (viz 2.6) AD převodníku: INL [LSB] 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

6.1 Statické parametry AD převodníku Histogram kódových slov AD převodníku (viz 2.8): histogram 50 40 30 20 10 0 0 128 256 384 512 640 768 896 1024 AD code Diferenciální nelinearita (viz 2.8) AD převodníku stanovená z histogramu: DNLh [LSB] 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 Integrální nelinearita (viz 2.8) AD převodníku: INLh [LSB] 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

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 f s = 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 f f = 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: f f = 1,333 khz f f = 10,333 khz f f = 20,333 khz detekována f f [khz] 1,3282 10,317 20,305 SFSR [dbfs] 0,09596 0,1803 0,403 NFL [dbv] 128,94 126,84 123,63 THD [db] 96,56 97,13 90,61 SFDR [db] 102,04 102,83 92,71 SNHR [db] 85,63 83,44 80,01 SINAD [db] 85,34 83,30 79,69 ENOB [bit] 13,9 13,57 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: f f = 1,333 khz f f = 10,333 khz f f = 20,333 khz detekována f f [khz] 1,3282 10,317 20,305 SFSR [dbfs] 0,09596 0,1803 0,403 NFL [dbv] 128,95 126,81 123,63 THD [db] 96,32 96,66 90,28 SFDR [db] 101,86 102,76 92,72 SNHR [db] 85,63 83,41 80,01 SINAD [db] 85,35 83,28 79,69 ENOB [bit] 13,9 13,59 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: f f = 1,333 khz f f = 10,333 khz f f = 20,333 khz clsthd [db] N/A 97 90 SNR [db] N/A 86 86 SINAD [db] N/A 85 84 Tabulka 5 Data z [17], dynamické parametry, okno Blackman-Harris 7-term 90

6.2 Dynamické parametry AD převodníku Ukázka výsledků dynamických parametrů v konzolové aplikaci pro f f = 20,333 khz (viz Tabulka 4): Obrázek 45 Konzolová aplikace addynam.exe ukázka výsledků 91

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

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

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

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

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

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

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

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; //make single AD code array (iteration) //000,001..110,111 if (i == ADcode[j]) //test for missing AD code { DNLi = Uin[j]; //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

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

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; } //zeroing DC //zeroing main lobe of DC for (j = 0; j!= hmax; j++) //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

Příloha č. 2 if (NFL2!= NULL) *NFL2 = tempnfl; tempnfl = sqrt(tempnfl); if (NFL!= NULL) *NFL = tempnfl; free(nrmxabs2half_); //store output if requested //sqrt of square NFL //store output if requested //free return (0); } 102

Příloha č. 3 Příloha č. 3 Konzolová aplikace adstatic.exe (win32), zobrazení nápovědy: 103

Příloha č. 3 Konzolová aplikace addynam.exe (win32), zobrazení nápovědy: 104

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