Avtor: dr. Simon Vavpotič
2019_271_51
Brez digitalnega procesiranja signalov ni hitrih brezžičnih komunikacij in visoke ločljivosti videa in zvoka. Zanimalo nas je, kako izdelati programsko orodje za PC in/ali PIC32 za hitro analizo z A/D pretvornikom vzorčenih signalov.
Čeprav imamo velikokrat občutek, da je domači PC namenjen predvsem preprostemu pisarniškemu delu in popoldanskim zabavnim aktivnostim, med katerimi zagotovo ne manjka računalniških iger, je z ustreznim programskim orodjem v veliko pomoč tudi pri digitalni analizi signalov, na osnovi katere lahko preverimo modele za digitalno obdelavo signalnih tokov in jih kasneje prenesemo v ugnezdeno programsko opremo mikrokontrolerjev. Digitalni analizator lahko uporabimo tudi pri diagnostiki napak v elektronskih vezjih.
V preteklem nadaljevanju smo spoznali osnovne principe digitalne obdelave signalov v mikrokontrolerju ali peceju (oz. drugem osebnem računalniku). Tokrat se bomo podrobneje lotili razvoja programske opreme za analizo digitalnih signalov za PC in PIC32 in med drugim spoznali tudi različne implementacije hitre Fourierove transformacije ter digitalnih filtrov. Vsekakor ne bo poudarek na matematičnih opisih, temveč na oblikovanju praktičnih programskih rešitev in povezovanju različnih programskih knjižnic, ki jih potrebujemo pri gradnji kompleksnejših algoritmov. Pri tem se bomo lotili tudi mogočih napak in pasti, v katere se lahko zapletemo, če se napačno lotimo praktične implementacije.
Ta vsebina je samo za naročnike
Zgradba in delovanje programske opreme
Programsko opremo digitalnega analizatorja signalov sestavlja več logičnih nivojev. Na spodnjem nivoju je komunikacijska programska oprema, ki skrbi za pripravo strojne opreme za delovanje in sprotno zajemanje podatkov iz A/D pretvornikov. Tu je sodelovanje s strojno opremo najtesnejše, saj moramo pogosto uporabiti, tako funkcije mikrokontrolerjevih notranjih A/D pretvornikov, kot tudi funkcije zunanjih A/D pretvornikov, s katerimi komunicira mikrokontroler preko različnih vodil. Pri zajemu podatkov si pogosto lahko izdatno pomagamo tudi s prekinitvenim krmilnikom in krmilnikom DMA.
Natančna implementacija postopkov upravljanja posameznega priključnega A/D pretvornika je predpogoj za dober zajem podatkov. Zato si lahko pri tem pomagamo tudi z že izdelanimi programskimi knjižnicami (npr. v sklopu Microchip Harmony). Je pa tudi res, da pri povezovanju komponent različnih proizvajalcev, predvsem z novejšimi mikrokontrolerji, nemalokrat kakovostne programske knjižnice niso na voljo in najdemo v spletu zgolj primere uporabe za kak starejši in manj zmogljiv mikrokontroler. Zato nam pri povezovanju zunanjih A/D pretvornikov pogosto ne preostane drugega, kot da algoritme nekoliko vgradimo v lastno programsko knjižnico. Pri tem sta pomembna dva vidika. Za pravilno delovanje A/D pretvornika, moramo najprej izvesti njegovo inicializacijo glede na problem, ki ga želimo reševati, nato pa moramo vzpostaviti kontinuiran zajem toka digitaliziranih vzorcev. Pri nižjih hitrostih vzorčenja si lahko, tako pri vgrajenih A/D pretvornikih, kot pri zunanjih, pomagamo s prekinitvenimi vektorji, pri višjih hitrostih vzorčenja pa je več kot dobrodošel krmilnik DMA, ki ga imajo le zmogljivejši mikrokontrolerji.
Krmilniki DMA podpirajo različne načine delovanja, vendar pa je pri zajemu vzorcev iz A/D pretvornika pomembno predvsem, da krmilnik DMA lahko prožimo z ustreznimi prekinitvenimi vektorji, ki jih prožijo A/D pretvorniki, in da lahko podatke zajema iz ene same ali krajšega zaporedja vhodnih lokaciji, oziroma registra ali registrov A/D pretvornika, ter jih zaporedno odlaga v trenutni izravnalnik v glavnem pomnilniku, medtem ko so drugi izravnalniki peceju na voljo za branje. Pomembno je tudi, da ima v ta namen mikrokontroler dovolj velik glavni pomnilnik, da je mogoče programsko vzpostaviti dovolj velik sistem izravnalnikov.
Prvi nivo programske opreme skrbi tudi za začetno kalibracijo A/D pretvornikov in popravke digitaliziranih vrednost glede na delovne pogoje (temperatura, relativna vlažnost zraka) pod katerimi deluje A/D pretvornik. Včasih si lahko pri tem pomagamo tudi z referenčnim A/D pretvornikom (npr. pri ADS1263, o katerem sem pisal v SE266, SE267 in SE268 v seriji člankov A/D pretvorniki z visoko ločljivostjo), s katerim lahko vzorčenje bolj prilagodimo konkretnemu merjenemu signalu, tako da, na primer ustrezno nastavimo predojačenje.
Kakorkoli, tudi priprava krmilnika DMA za delovanje in podpora njegovemu delovanju, spadata na prvi nivo programske opreme, ki mora biti kakovostno implementiran in mora podpirati API (aplikacijski programski vmesnik) za povezovanje z višjimi nivoji. Pri tem mora omogočati tudi izbiro načina delovanja glede na izbrane vrste analiz digitaliziranih vzorcev in glede na vrste signalov, ki jih želimo analizirati; pri čemer navadno najpogosteje spreminjamo hitrost in ločljivost vzorčenja, lahko pa tudi velikost medpomnilnikov.
Omenimo še, da na prvi nivo sodi tudi standardna komunikacijska programska opreme za komunikacijo med mikrokontrolerjem in PC, vendar te ne obravnavamo v tem članku. Potrebne programske knjižnice so na voljo na spletni strani https://sites.google.com/site/pcusbprojectsdownloads v datotekah hid_basic for PIC32MZ EC Starter Kit – firmware 2.9.2.zip (firmware za PIC32MZ2048ECH144) in LIB_PCUSBProjects v7.0.NET4x64.dll (programska knjižnica za Microsoft Visual Basic 2015.NET). Potrebni so tudi standardni gonilniki za naprave USB, ki pa so del operacijskega sistema in jih zato tukaj ne omenjamo. Omenimo le še, da digitalno analizo signalov na PC izvajamo z aplikacijo PC Digital Signal Analyser, ki jo najdemo v datoteki PC Digital Signal Analyser.zip (primer programske aplikacije za digitalno analizo signalov).
Drugi nivo programske opreme
Naslednji nivo predstavljajo funkcije za osnovno pripravo digitaliziranih vzorcev merjenih napetosti za različne obdelave. Preveriti morajo konsistentnost in podatke združiti v strukture za nadaljnjo obdelavo. Pomembno je, da znajo za vsak vzorec natančno določiti (relativni) čas njegovega zajema in vrednost napetosti. Le na osnovi teh podatkov lahko nato digitalni analizator izračuna natančne izmerjene vrednosti signalov, kot so efektivna napetost, faza, frekvenca itn. Obenem lahko na četrtem nivoju programske oprem pri grafičnem izrisu signala na tej osnovi pokažemo tudi ustrezne vrednost za posamične vzorce.
Navadno določitev relativnega časa vzorčenja ne predstavlja večje težave, saj relativni čas vzorčenja pri A/D pretvornikih praviloma poznamo. Vgrajeni A/D pretvorniki so vezani na sistemski oscilator mikrokontrolerja, zunanji pa na zunanji vir taktnih impulzov, ali na zunanji taktni signal mikrokontrolerja ali namenskega vezja. Precej drugače je z meritvijo napetosti. Digitalizirane vrednosti je mogoče preračunati v napetosti le, če natančno poznamo merilno območje A/D pretvornika, ki je povezano z vrednostmi referenčnih in/ali napajalnih napetosti. Pri določanju skrajnih meja merilnega območja je v veliko pomoč natančen zunanji vir referenčnih in napajalnih napetosti (predvsem analognega dela A/D pretvornika, če je ta ločen od digitalnega), ki ga lahko zagotovi, na primer laboratorijski napajalnik. Pri meritvah izmeničnih signalov nemalokrat potrebujemo negativno in pozitivno referenčno napetost, nekateri A/D pretvorniki pa znajo sami izdelati simetrično referenčno napetost iz pozitivne referenčne napetosti. Kakorkoli, pomembno je, da natančno poznamo tako negativno kot pozitivno referenčno napetost, saj lahko na osnovi obeh in na osnovi analognih napajalnih napetosti, po navodilih proizvajalca A/D pretvornika natančno izračunamo dejanski napetostni razpon merilnega intervala.
Pomembno vlogo pri črpanju podatkov iz A/D pretvornika imajo tudi medpomnilnik ali medpomnilniki, ki so opredeljeni na prvem nivoju programske opreme. Vendar mora drugi novo programske opreme določiti njihova velikost in število. Najenostavnejša je implementacija enega medpomnilnika, iz katerega hkrati beremo in vanj vpisujemo podatke, saj je zakasnitev odvisna le od dejanskega časa, ko mora mikrokontroler čakati na zahtevo PC za oddajo podatkov.
V primeru ciklične uporabe več medpomnilnikov pa večji medpomnilniki zahtevajo več časa za polnjenje in je zato zakasnitev pri obdelavi signala v realnem času nekoliko večja. Tako smo ponovno pri problemu hitrosti vzorčenja. Pri hitrem vzorčenju s hitrostjo 100 kHz in več si brez težav privoščimo velike medpomnilnike (če ima mikrokontroler dovolj RAMa), pri počasnem vzorčenju z nekaj 100 Hz pa temu ni tako. Če hočemo zagotoviti delovanje digitalnega analizatorja signalov v realnem času, smejo biti izravnalniki le tako veliki, da je zakasnitev še sprejemljiva. Tu je najbolje uporabiti en ciklično medpomnilnik.
Število potrebnih medpomnilnikov je torej odvisno od načina branja podatkov. Če podatke beremo in pišemo kontinuirano, zadošča en sam, pri čemer imamo ločena kazalca za pisanje in branje podatkov ter števec količine začasno shranjenih podatkov.
Tretji nivo programske opreme
Lahko trdimo, da je tretji nivo programske opreme najpomembnejši, saj vsebuje programske knjižnice s funkcijami za numerične obdelave podatkov, na osnovi katerih tvorimo algoritme za izvajanje različnih analiz digitaliziranih signalov. V preteklem nadaljevanju (v SE270) smo tem programskim knjižnicam že namenili nekaj prostora, prav tako smo omenili tudi Fourierjevo transformacijo, inverzno Fourierjevo transformacijo, izdelavo digitalnih filtrov s končnim odzivom itn. Omenili smo tudi, da moramo tovrstne programske knjižnice včasih izdelati tudi sami, še posebej, če uporabljamo manj uveljavljeno razvojno okolje. Pri tem si lahko izdatno pomagamo z izvorno kodo, ki ji najdemo na spletu, ali pa v okviru plačljivih programskih knjižnic.
Osnovne analize podatkov so sorazmerno enostavne, saj temeljijo predvsem na statističnih obdelavah podatkov in omogočajo predvsem ustrezno predstavitev podatkov, ki smo jih zajeli z drugim nivojem programske opreme, in njihovo razpoložljivost četrtemu nivoju programske opreme. Sem, denimo sodijo določanje časa vzpona signala, določanje dolžine periode, samodejno izbiro merilnega podobmočja, glede na največje in najmanjše vrednosti signala v določenem časovnem intervalu in druge enostavne operacije v časovnem prostoru, ki omogočajo ustrezno predstavitev signala.
Naslednji sklop funkcij izvajamo v frekvenčnem prostoru, za kar moramo najprej na ustrezen način izvesti Fourierjevo transformacijo. Pri tem je pomembno, ali nas zanima le frekvenčni spekter, ali pa tudi fazni zamiki signalov, vsebovanih v frekvenčnem spektru, ali pa morda efektivne vrednosti moči po posameznih frekvencah. Hitri Fourierjevi transformaciji (FFT) in hitri inverzni Fourierjevi transformaciji (IFFT) smo precej prostora namenili že v preteklem nadaljevanju, zato nas bo tokrat zanimala predvsem praktična implementacija obeh. Gre namreč najpomembnejša algoritma, na osnovi katerega lahko izvajamo spektralno analizo in hkrati gradimo digitalne signalne filtre, na snovi katerih lahko izdelamo tudi digitalne signalne demodulatorje.
Implementacija FFT in IFFT
Ker je FFT izredno pomembna funkcija za spektralno analizo, je prav, da nekaj besed namenimo tudi njeni implementaciji. Predpogoj je standardna matematična knjižnica programskega jezika C s trigonometričnimi funkcijami, ki ima navadno glavo math.h. Bojazni, da je ne bi imeli na razpolago skoraj ni, saj gre za standardno cejevsko knjižnico. Vsekakor še enkrat omenimo, da imamo tisti, ki uporabljamo Microchip Harmony FFT že v osnovi na voljo, o čemer ste lahko prebrali v preteklem nadaljevanju v SE270.
Če se FFT iz kateregakoli vzroka lotevamo sami, lahko algoritem izvedemo v treh korakih. V prvem zaporedje digitaliziranih vzorcev napetosti pretvorimo v zaporedje kompleksnih vrednosti (kot smo omenili, lahko za to poskrbimo že pri vzorčenju). Nato s pomočjo bitne reverzije, ki zagotavlja ključno pohitritev FFT v primerjavi z računanjem klasične Fourierjeve transformacije, preuredimo tabelo vzorcev tako, da jo pripravimo za izvajanje glavne transformacijske programske zanke, ki v tretjem koraku s pomočjo trigonometričnih funkcij po Danielson-Lanczosovem algoritmu izračuna nove kompleksne vrednosti, ki ustrezajo Fourierjevi transformaciji.
Vendar je potrebno poudariti, da lahko FFT z bitno reverzijo uporabimo le na tabelah, katerih velikost (N) je potenca števila 2 (npr. 2,4,8,…, 32,64,128,….,1024,2048,4096,….). Z večanjem tabele narašča tudi natančnost izračuna FFT v določenem trenutku. FFT sicer vedno računamo iz preteklega končnega zaporedja kompleksnih števil, od t-N do t, pri čemer moramo za izračun FFT v naslednjem trenutku uporabiti tabelo z vrednostmi od t-N+1 do t+1. Z drugimi besedami, za izračun FFT v realnem času uporabljamo drseče časovno okno, pri čemer je natančnost FFT odvisna od velikosti tabele vzorcev (N).
Pri tem se moramo zavedati, da poteka v omenjenem primeru FFT nad podatki v istem delu pomnilnika, kamor smo naložili prvotno časovno zaporedje kompleksnih vrednosti digitaliziranih vzorcev. Če želimo slednjega ohraniti, moramo predhodno tabelo s časovnim zaporedjem prekopirati v pomnilnik, kjer bomo izvajali FFT. Po drugi strani, je prednost omenjenega algoritma FFT predvsem ta, da za izvajanje spektralne analize ne potrebujemo nujno dvakrat večjega pomnilnika, kot ga potrebujemo za hrambo digitaliziranih vzorcev. Zato je priročna tudi pri izdelavi manjših prenosnih naprav, kjer nas ne zanima časovno zaporedje, temveč le njegova Fourierjeva transformacija, še posebej če potrebujemo slike frekvenčnega prostora v daljših časovnih presledkih, ki obenem ne temeljijo na drsečih oknih. Slednje je primerno za (vizualno) spremljanje slike v frekvenčnega prostora, ne pa tudi za digitalno obdelavo signalov v frekvenčnem prostoru (npr. filtriranje) in njihovo vrnitev v časovni prostor.
Drugi premislek pri implementaciji FFT je glede uporabe tabele pretvorjenih vrednosti ter določitve natančnih vrednosti frekvenc in napetosti po posameznih opazovanih frekvenčnih področjih. Slednje je v veliko meri določeno z velikostjo tabele digitaliziranih vzorcev (N), nad katero izvajamo FFT.
Poleg FFT pogosto potrebujemo tudi njen inverz, IFFT (inverzna FFT), na osnovi katerega lahko izdelamo različne digitalne filtre, tako da natančno izberemo frekvence ali frekvenčni obseg signalnega spektra, ki ga želimo prepuščati, pri čemer lahko v frekvenčnem prostoru oblikujemo poljubno filtrsko funkcijo, ki ojači ali zaduši določene frekvence. Naslednji korak je uporaba IFFT, s katerim preračunano zaporedje ponovno pretvorimo v zaporedje časovnih vrednosti, ki predstavlja filtriran signal.
Izvedba IFFT je s prikazanim algoritmom (program 1 in program 2) preprosta. Kot vhodno tabelo vstavimo tabelo kompleksnih vrednosti v frekvenčnem prostoru, nakar nastavimo vrednost parametra isign na -1, namesto na 1, kot je pri FFT. Nato zaporedoma izvedemo program 1 in program 2. Rezultat je tabela z digitalnimi vrednostmi signala v časovnem prostoru.
Četrti nivo programske opreme
Zadnji nivo programske opreme prestavlja grafični vmesnik aplikacije PC Digital Signal Analyser s sistemom menijev in funkcij za grafični prikaz izmerjenih signalov in posameznih vrednosti, ki dobro sodeluje z aplikacijskim programskim vmesnikom (API) operacijskega sistema. Tu imamo programerji največ »umetniške« svobode; veliko pa je odvisno tudi od tega, ali aplikacijo izdelujemo za lastne potrebe ali za prodajo. Vsekakor se je potrebno pri slednji veliko bolj potruditi in uporabniški vmesnik dobro »izpiliti«, da je intuitiven in enostaven za uporabo tudi uporabnikom brez znanja programiranja.
Bistvo uporabniškega vmesnika je njegova uporabnost pri izvajanju različnih meritev in analiz, pri čemer se splača zagotoviti tudi možnost tabelaričnega izvoza podatkov (npr. v zapisu *.csv), kot tudi shranjevanja grafičnih prikazov v različnih slikovnih zapisih (npr. *.jpg, *.tif, *.bmp, …). Vse to sodi bolj med programerska kot elektrotehnična znanja, zato poudarimo predvsem to, da se moramo pri implementaciji četrtega nivoja programske opreme v PC zanesti predvsem na programski jezik, ki ga uporabljamo, in njemu priložene grafične knjižnice, lahko pa tudi programske knjižnice s spleta; medtem bi bili pri morebitni implementaciji prenosnega digitalnega analizatorja signalov v mikrokontrolerju omejeni z lastnostni prikazovalnika, oziroma strojne opreme, ki jo uporabljamo.
Microchip Harmony ima sicer vgrajeno tudi grafično knjižnico, ki podpira prikazovalnike nekaterih proizvajalcev, medtem ko moramo podporno programsko opremo za večino drugih izdelati sami po navodilih njihovih proizvajalcev. Nekateri zmogljivejši barvni grafični prikazovalniki (TFT) razumejo tudi kompleksnejše ukaze (npr. nariši piko na lokaciji X,Y v barvi B, ali črto med dvema lokacijama), večina drugih sprejema zgolj bitno grafiko; kar pomeni, da moramo vse osnovne grafične funkcije najprej podpreti programski knjižnici in šele nato lahko izrišemo spektrogram, ali drugo analizo digitaliziranega signala v grafiki. Sam sem namesto tega raje uporabil kar PC, katerega veliki monitor je za laboratorijsko delo vsekakor primernejši.
Digitalni analizator za domačo rabo
Analizator digitalnih signalov za domačo rabo najlažje sestavimo, če združimo zmogljivosti PC in PIC32, ali drugega izbranega mikrokontrolerja, ki omogoča povezovanje s PC preko vrat USB ali omrežnega priključka. Sam sem uporabil Microchipovo razvojno ploščo PIC32MZ EC Starter Kit z razširitvami PIC32MZ EC Adaptor Board (AC320006) za povezavo z Starter Kit I/O Expansion Boardom in Starter Kit I/O Expansion Board (DM320002) in dodanim Texas Instrumentsovim A/D pretvornikom, ADS1263, za priklop katerega sem izdelal prototipno tiskano vezje. S tem sem se v veliki meri izognil spajkanju, hkrati pa sem lahko izkoristil sorazmerno veliko zmogljivost PIC32MZ2048ECH144 z 200 MHz taktom in se lotil predvsem izdelave ustrezne ugnezdene programske opreme, kakor tudi programske opreme za digitalno analizo signalov za PC.
Digitalni analizator signalov ima tako na voljo več A/D pretvornikov. Hitri A/D pretvornik z multiplekserjem je vgrajen v mikrokontrolerski čip, medtem ko sta preostala dva v veliko natančnejšem ADS1263. Ker ima mikrokontroler tudi kar zajeten RAM (512 kB), ga bilo moč uporabiti za sistem izravnalnikov, v katere se stekajo podatki iz A/D pretvornikov. Samo na ta način je namreč mogoče zagotavljati nepretrgan, brezizgubni tok podatkov. Pravzaprav, je glavni krivec za potrebo po zajetnih izravnalnikih v mikrokontrolerju PC, ki vselej poganja veliko več kot 100 procesov. Zato ne more vselej zagotavljati tolikšne odzivnosti in razpoložljivosti, da izravnalniki v mikrokontrolerju ne bi bili potrebni.
Kakorkoli, pri prenosu podatkov med mikrokontrolerjem in PC je pomembna dovolj velika pretočnost komunikacijskega kanala v smeri proti PC-ju, saj mora ta pri hitrih A/D pretvorbah zajemati precej podatkov; medtem, ko pri počasnih A/D pretvorbah z ADS1263 to ni tak problem. Praktična implementacija komunikacijskega protokola temelji na katerem od hitrejših načinov prenosa podatkov preko USB, ali na protokolu TCP/IP, ki je nekoliko zahtevnejši za implementacijo, a ga je zahvaljujoč programski knjižnici Microchip Harmony vseeno dovolj enostavno implementirati.
Naloga PIC32MZ2048ECH144 je zajem in digitalizacija analognih signalov, pri čemer prevzame delo prvega in drugega nivoja programske opreme, lahko pa tudi tretjega; medtem, ko PC prevzame naloge tretjega in četrtega nivoja programske opreme, lahko pa le četrtega. Vendar je zaradi računske zahtevnosti pri izbiri visoke natančnosti bolje, da FFT izvaja kar PC z veliko zmogljivejšim procesorjem. Tako mikrokontroler skrbi za pripravo in osnovno obdelavo zajetih vzorcev signala pa tudi njihovo vmesno shranjevanje pri transportu v PC, medtem ko PC izvaja analizo signalov.
Program 3 prikazuje detajl prekinitvenega programa, s pomočjo katerega se polni medpomnilnik. Prikazana je izvedba medpomnilnika s pomočjo enega samega cikličnega izravnalnika, v katerega prekinitveni program posamično vnaša pretvorjene vrednosti iz prvega A/D pretvornika ADS1263. Če bi uporabljali blokovni način prenosa podatkov s pomočjo krmilnika DMA, bi bilo prikladneje uporabiti več enako velikih izravnalnikov. Tako pa imamo en sam ciklični izravnalnik s kazalcema za pisanje, appData.DataBufWp in kazalcem za branje appData.DataBufRp. Slednjega premika PC med branjem podatkov s PIC32MZ2048ECH144 preko povezave USB. Tako preprost način prenosa podatkov smo si lahko privoščili zaradi sorazmerne počasnosti ADS1263, ki je namenjen za natančno 32-bitno vzorčenje. Upravljanje in nadzor nad vzorčenjem podatkov izvaja PC z aplikacijo PC Digital Analyser, ki izkorišča mikrokontrolerjev upravljavski API, ki omogoča nastavljanje vseh ključnih parametrov pretvorbe in zajem vzorcev…
Prihodnjič
Tokrat smo se lotili praktične implementacije digitalnega analizatorja signalov ter praktičnih programskih rešitev in uporabe različnih programskih knjižnic, pri čemer smo izpostavili tudi pomen hitrega prenosa podatkov s pomočjo krmilnika DMA. Prihodnjič se bomo lotili še podrobnosti, med katerimi je gotovo izredno pomembna izdelava izjemno stabilnega napetostnega vira, ki bo omogočil natančno vzorčenje analognih signalov z ADS1263. Vsekakor velja premislek pri izbiri kakovosti napajalnega vira A/D pretvornika. Pri majhni ločljivosti (od 12 do okoli 16 bitov) navadno zadošča že sorazmerno enostaven napetostni regulator, s katerim ustvarimo referenčne napetosti, za večje natančnosti pa je potreben izjemno stabilen napetostni vir (reda nV), saj še tako majhna izmenična komponenta pokvari meritev. Zanimiva možnost je tudi uporaba nastavljivega vira referenčnih napetosti, ki omogoča spreminjanje merilnega območja. Uporaben je predvsem pri A/D pretvornikih brez lastnega predojačevalnika.
Prav tako se nam ne bodo izmuznile nekatere ključne podrobnosti implementacije programske opreme v PC, s kateri izvajamo analize, kot so umetno-inteligenčne in statistične razširitve. Ogledali si bomo tudi delovanje programske aplikacije PC DIgital Signal Analyzer in preverili možnosti za izdelavo avtonomnega analizatorja signalov na osnovi mikrokontrolerja PIC32MZ2048ECH144 in barvnega prikazovalnika TFT.Program 1: Bitna reverzija tabele vzorcev pri implementaciji FFT in IFFT v programskem jeziku C
unsigned int n, mmax, m, j, istep, i; int isign=1; // FFT: isign = 1, IFFT: isign = -1 double wtemp, wr, wpr, wpi, wi, theta; double tempr, tempi; n = nn << 1;j = 1; for(i = 1 ;i < n;i += 2){ if (j > i){ tempr = data[j]; data[i] = data[j]; data[i] = tempr; tempi = data[j + 1];data[j + 1] = data[i + 1]; data[i + 1] = tempi;} m = n >> 1; while (m >= 2 && j > m){j -= m; m >>= 1;} j += m; }
Program 2: Izračun vrednosti v frekvenčnem prostoru s pomočjo trigonometričnih funkcij pri implementaciji FFT in IFFT v programskem jeziku C
mmax = 2; while (n > mmax){ istep = mmax << 1; theta = isign * (2 * Math::PI / mmax); wtemp = Math::Sin(0.5 * theta);wpr = -2.0 * wtemp * wtemp; wpi = Math::Sin(theta);wr = 1.0;wi = 0.0; for (m = 1; m < mmax; m += 2){ for (i = m; i <= n; i += istep){ j = i + mmax; tempr = wr * data[j] - wi * data[j + 1]; tempi = wr * data[j + 1] + wi * data[j]; data[j] = data[i] - tempr; data[j + 1] = data[i + 1] - tempi; data[i] += tempr; data[i + 1] += tempi;} wr = (wtemp = wr) * wpr - wi * wpi + wr; wi = wi * wpr + wtemp * wpi + wi;} mmax = istep; }
Program 3: Detajl prekinitvenega programa za zajemanje podatkov iz ADS1263
… dta=READ_ADS1263_ADC1(); appData.DataBuf[appData.DataBufWp]=dta; appData.DataBufWp++;appData.DataBufCnt++; if(appData.DataBufWp>=appData.DataBufMax)appData.DataBufWp=0; if(appData.DataBufCnt<appData.DataBufMax){IEC0bits.INT3IE=1;}