Aproximace množiny bodů křivkou (a elipsou) realizovatelná na 12MIPS MCU
Ahoj,
zase tu jsem s oříškem. Moje zařízení produkuje (hodnoty X a Y) něco takového na základě hodnot z AD převodníků:
Je to UI "křivka" dvou LED diod zapojených paralelně, přičemž jsou navzájem otočené. Jako výpočetní jednotku mám k dispozici pouze 12MIPS osmibitový mikrokontroler PIC18F4550. A teď potřebuji za krátkou dobu (maximální přípustná doba je 100ms, to máme nějakých 1,2 milionu instrukčních cyklů) z množiny bodů (je jich 128, obrázek je zvětšen tak, aby jeden bod měl velikost 4x4 pixelu na tom obrázku) dokázal vytvořit křivku. Obrovskej problém vidím v tom, že u diaků a hlavně, kondenzátorů a indukčností, to není takto jednoduché a jedna hodnota X má přiřazeny dvě různé hodnoty Y - je to prostě elipsa. Už jsem toho zkoušel hodně a nic mi zatím nedalo uspokojivý výsledek. Třeba nejjednodušší algoritmus - projíždět všechna X a průměrovat Y. To sice u diod jakžtakž funguje (i když nic moc), ale u kondenzátorů to pochopitelně udělá rovnou čáru. Oversampling už využívám a zpřesnit samotné měření tedy není možné. Už takhle jsem mimo specifikace a povolené rozsahy délky AD převodu. Pakliže by někdo věděl o algoritmu, který by toto dokázal, ať mi prosím napíše.
Díky moc za odpovědi.
Ja bych to prosel od spoda a rozhodil na dva skupiny min vlevo do jedne skupiny, vpravo do druhe skupiny. Nejdolnejsi a nejhorsnejsi bod do obou skupin (pokud se elipsa nikde nemuze krizit.
A nasledne spravny algoritmus na aproximaci, coz asi nebude prumerovani, ale metoda nejmensich ctvercu ci nejake regresni analyza na nejakem dvoj. exponencialnim modelu.
Mohl bys to prosím více upřesnit - moc jsem nepochopil, co dát do jakých polí. Mě teď napadlo, začít od jakéhokoliv bodu, prohledat okolí třeba 10 bodů a když tam nějaké jsou, tak z nich udělat průměrnou hodnotu a to bude jeden bod už výsledné lomené čáry, která se odešle do zobrazovacího PICu. Potom, co se udělá takovýhle bod, se opět prohledá okolí a tak dále, až nezbyde žádnej bod. Body, který nebudou patřit do žádného okolí se prostě vyřadí, protože jsou mimo. Ale tam je ještě spousta věcí k dořešení.
Problem je, ze jsi rekl, co ocekavas za vysledek a ne co je ucelem cviceni. Pokud ma byt vysledkem neco 2 rozmerneho, pak potrebujes reprezentovat minimalne dve cary (zjednodusene levou a pravou) proto jsem (algoritmus netusim, nevim ceho chces dosahnout) navrh rozdelit body na leve a prave (ciste podle obrazku a podle principu KISS = keep it simple, silly) a spocitat to nad levou pulkou a pravou pulkou a ty pak ciste spojit/protnout. S tim ze vypocet nad tema castma bude pak v zavislosti na tom ceho chces dosahnout od prumeru az po metodu nejmensich ctvercu v omezene vzdalenosti az pres ty refresni analyze - ted prichazi otazka jestli chces ciste spocitat jak vypada (lehci varianta) nebo z toho ma vypadnout vzorec - předpis té křivky (těžší varianta)
Jo, už jsem uvažoval nad tím, že to rozdělím na dvě půlky nebo dokonce po kvadrantech. Jako výsledek potřebuju jen tu křivku, předpis nepotřebuju, u mého zařízení jde čistě jen o to, jestli součástka je poškozená (bude tam blbě koleno UI křivky, bude tam ostrá hrana, nebude tam nic) nebo je v pořádku..
To mi neříkej, že na toto není 12MIPS dost...
jenže on nemá zdaleka linerání, on má nějakou dvosložkovou exponenciální, možná expo-lin-lin-expo nebo něco takévho ;)
Jo, já potřebuju zobrazit napěťově-proudové charakteristiky u diod (1 nebo 2 exponenciální fce), kondenzátorů (elipsy), rezistorů (přímka), tunelové diody ( tunnel.gif ), dalších součástek + jejich kombinací.
V tom pripade je ale vzorec znamej, ne? Aby jsi dokazal pak hledat pomoci regresni analyzy vzorce, ne?
Najdeš si předpis toho pruběhu a necháš "otevřené" keoficienty, které pak dopočítáš na základě metody nejmenších čtverců
Vzorec známý není, protože tam nebude nabídka toho, co to je (výběr součástky), já prostě potřebuju z bodů, které mají určitou chybu udělat přibližnou plynulou čáru.
Zkus se ještě mrknou na metodu nejmenších čtverců, snad by mohla pomoct. Nevím to jistě, už si z analýzy dat pamatuji pramálo...