Matematika v robotice 13. Střídavé signály

15. září 2013 v 2:54 | Petr |  Roboti a Matematika
Přestože se to nezdá, pořád se v "Matematice pro roboty" pohybujeme v brutálně zjednodušeném světě. Měříme napětí AD převodníkem a předpokládáme, že z něho lezou smysluplná čísla, ty pak proženeme algoritmy psanými v C a doufáme, že kompilátor ošetří všechny zákeřnosti.
Takže končí legrace a začínáme přitahovat šrouby, protože "ďábel se skrývá v detailech". Slabším povahám opakuju znovu a stále - šetřte své nervy a vyhoďtě si mně ze záložek dříve než to bude horší než ve škole - já nejsem zoufalec co touží po návštěvnosti svého blogísku, píšu jak umím a co umím nikoliv více, ale nikoliv méně.

Tedy - jedno z přechodzích zjednodušení bylo toto : psal jsem všude "svět celých čísel" ale ono to byl svět "celých kladných čísel" neboli svět "přirozených čísel" - když jsme počítali napětí baterky tak nikdo nepředpokládal, že procesor pojede při totálně zničené baterce s napětím -1V tudíž ani otázka měření záporných napětí nebyla na pořadu dne. Nicméně opakuju stále znovu - není nic lepšího než mít sonary s přímou digitalizací bez usměrňovače - a (ultra)zvuk je prostě střídavý signál Ať chceme nebo nechceme.

Takže ultrazvukový mikrofon nám produkuje signál od +XXX uV do -XXXuv což nám předzesilovač zesílí na nějaké rozumné milivolty a pak převede na AD převodník procesoru - je to tak ?
Není - vtip je v tom, že používáme operační zesilovače, které kdysi pracovaly se symetrickým napájením a dneska pracují s "virtuální zemí". Kvůli maximálnímu rozkmitu se napětí virtuální země dává rovno polovině měřícího rozsahu AD převodníku a všechny střídavé signály jsou pak součtem skutečného signálu a stejnosměrného napětí této "virtuální země".
No jestli jste z toho jeleni tak píšu jednoduše - AD převodník v AVR nebo PICce měří od 0 do 5V - tudíž nemůžeme měřit napětí -2V ale múžeme napětí -2V sečíst s konstatntím napětím virtuální země, kterou umísítíme do středu napájení takže -2V signálu je -2 + 2,5 = 0,5V na vstupu AD převodníku.
Takže když si v procesoru hrajeme na sinusovku která nám (v 8 bitovém rozlišení) kmitá od +127 do -128 (hodnot AD převodníku) - tak ve skutečnosti z AD převodníku leze sinusovka 0-256 honot - a signálu 0 voltů odpovídá hodnota 128 - Teoteticky !!!.
Jenomže ďábel se skrývá v detailech - takže co když virtuální zem není udělaná tak precizně aby měla napětí přesně 2,5 V - nebo není tak docela stabilní a někam nám ujíždí (třeba kvůli tepelné nestabilitě napěťové reference) ?
Jaké jsou naše možnosti
  1. Počítat se signálem 0-256 a střední hodnotu úplně ignorovat
  2. Počítat se střední hodnotu 128 a její nedokonalosti ignorovat
  3. Změřit střední hodnotu bez signálu a tu pak používat
  4. Počítat dlouhodobý průměr signálu a ten považovat za střední hodnotu.
  5. Počítat krátkodobý průměr.
  6. Spočítat průměrnou hodnotu off-line.
AD 1. Základní informací o signálu je amplituda, kterou spočtete jako
Amplituda = ABS ( DATA -128 )
tedy je to vlastně numerický ekvivalent usměrnění - bez toho budete všechny algoritmy psát extra pro kladnou a extra pro zápornou půlvlnu - což je zjevná kravina a příliš vysoká cena za vyhnutí se potížím s driftem střední hodnoty.

AD 2. Zcela legální varinata, v některých případech však vadí, že stav "bez signálu" pak není hodnota 0 z ADC - typicky to vadí třeba při kompresi a dekompresi zvukových signálů.

AD 3. Zcela legální varianta - akorát v některých případech ve stavu bez signálu je střední hodnota jiná než ze signálem - takto vzniklá chyba má stejné účinky jako v bodě 2.

AD 4. Střední hodnotu můžete spočítat jako klouzavý průměr všech hodnot - ten musí mít dostatečně dlouhou základnu takže třeba
Střed = (127 * Střed + DATA + 64) >> 7
Viz exponenciální klouzavé průměry - tato metoda je téměř dokonale odolná proti pomalému driftu střední hodnoty, ale u příliš rozkolísaných signálů - může sama začít s jistým zpožděním kolísat a signál nám zkreslit.

AD 5. - moje nejoblíbenější varianta - nutnou podmínkou je aby frekvence vzorkování byla celočíselným a nejlépe sudým násobkem frekvence sužitečného signálu. Příklad (už jsem ho popisoval) - Vzokrujeme na 4 násobku frekvence ultrazvuku - tedy na 160 kHz - tudíž každé periodě odpovídají 4 vzorky A, B, C, D, - z těc vytvoříme dva vzorky jako
I = A-C ; Q= B-D
Vtip je v tom, že pokud máme vzhorkovací frekvenci na 4x frekvence signálu - je jist騞e "ob jeden vzorek" bude signál posunutý o 180 stupňů a tedy to bude "opačná půlvlna" ať už je střední hodnota jakákoliv. JEdiný požadavek je aby drift střední hodnoty byl během 4 měření alespoň trochu konstantní - což není problém dodržet.

AD 6. Jediné "matematicky zcela korektní" řešení je - ukládat všechna měření do bufferu a střední hodnotu spočítat jako aritmetický průměr až nakonec. Tím, se opravdu zbavíte střední hodnoty bez ohledu na její drift - ale samozřejěm se tím dostanete do potíží s daty, která se na robota valí v reálném čase a taky je je třeba v reálném čase zpracovat a smazat.

Celé odečítání střední hodnoty, nebo "virtuální země" je vlastně něco jako převod čísla z "unsigned integer" na "signed integer". Ať už bychom počítali s jednou nebo s druhou variantou, vždy je při zpracování signálu řešit otázku co když nám signál přeteče takže jak se u 8 bitového zpracování postavit k výsledku "300" - jak na to probereme příště.

Dnes už zbývá jenom tradiční rada pro brunety - chcete aby vám miláček koukal do očí ? oblečte si tričko bez výstřihu a netvařte se , že to neděláte schválně.
 

Buď první, kdo ohodnotí tento článek.

Komentáře

1 Míra eM. Míra eM. | E-mail | 16. září 2013 v 12:38

Dobrý den pane Kubáči.
Problém s "umělou nulou" jsme již řešil ve své praxi nespočetkrát, asi nejlépe mi zatím fungovalo vřadit do cesty zdigitalizovaného signálu tzv. DC removal filter - filtr stejnosměrné hodnoty. Jedná se o velmi jednoduchou IIR strukturu, více info v odkaze: http://www.digitalsignallabs.com/dcblock.pdf

Chování filtru do jisté míry připomíná vazební kondenzátor u zesilovače - propustí jen střídavinu, stejnosměrný offset vyhodí.
Naposledy jsem ho nacpal do systému sw. fázového závěsu pro synchronizační účely a musím, říct, že odvádí vskutku výbornou práci.

Mějte se pěkně.

2 petr-kubac petr-kubac | 16. září 2013 v 12:58

[1]: Děkuji za odkaz - de-facto je to velmi mnoha slovy popsaná varianta 4. Ale přece jenom jsem se poučil, po odečtení stejnosměrné úrovně získané klouzavým průměrem se dá signál vylepšit, pomocí horní propusti, kterou v článku úporně nazývají Differentiator

Komentáře jsou uzavřeny.


Aktuální články

Reklama