Sensor glad en optimale wiskunde op die Arduino As deel van my poging om soveel as moontlik te laai op 'n Arduino. Ek het ook 'n LIS302DL versnelling in die mengsel en gebruik die uitset Y-as 'n strook van LEDs ry deur 'n paar TLC5916 LED bestuurders. Ek is die monsterneming van die versnelling elke 10msec en dit jittered 'n bietjie, so ek wou 'n paar smoothing voeg tot die sensor waardes. Daar is allerhande fancy glad algoritmes beskikbaar, maar 'n eenvoudige Eksponensiële bewegende gemiddelde gewerk net mooi, en was maklik om te bereken: Die werklike sensor waarde is 'n getekende 8-bis integriteit en die normale 1G lees (dit wil sê wanneer dit word eenvoudig gekantel en nie rondgeswaai) wissel van sowat -55 tot 55, sodat ek beperk die waarde op +/- 50 en bygevoeg 50 om dit te 'n waarde tussen 0 en 100 wat ek dan kon voed in die eksponensiële bewegende gemiddelde berekening voor kartering van die waarde op die LED strook, met 'n horisontale "wat lei tot die middel LED op die strook wat verlig word, en die verligte LED beweeg aan die ander kant as die strook gekantel. Alles goed en wel, die wiskunde is eenvoudig en alles werk goed. Maar die AVR het nie swaai-punt hardeware ondersteuning, so ek wou kyk of ek die prestasie van die berekening hierbo kan verbeter. Die gebruik van heelgetal rekenkunde is die mees voor die hand liggende manier, maar dit nie gedoen kan word direk as daar fraksionele faktore wat in berekening gebring word. Maar daar is 'n standaard manier om dit te doen wat tot vaste punt rekenkundige gebruik. Om dit te doen, is al die getalle wat betrokke vermenigvuldig met 'n skaal faktor in werking beweeg die desimale punt na regs. 'N Voorbeeld sou doen finansiële berekeninge in pennies eerder as pond. Daarbenewens / aftrekking van afgeskaal getalle werk soos normaal net soos vermenigvuldiging / afdeling van 'n skaal deur 'n unscaled nommer. Die bedrywighede wat spesiale hantering nodig is vermenigvuldiging / afdeling van twee afgeskaal getalle. Hier's hoekom: As ons twee getalle a en b wat afgeskaal deur S en ons hulle vermenigvuldig ons kry so * BS. Dit vereenvoudig om ABS 2. sodat die skaal korrek moet ons verdeel deur die skaalfaktor na vermenigvuldiging sodat ons uiteindelik met ABS hou. Afdeling is die omgekeerde, ons het om te vermeerder deur S om dinge reg te hou. Ten slotte, as ons te doen het met binêre getalle, as ons die skaalfaktor n krag van twee ons kan die skaalfaktor berekeninge so doeltreffend bietjie skofte te implementeer, eerder as om te vermenigvuldig en deel te doen. Daar is in werklikheid beperkte ondersteuning vir vaste punt wiskunde in AVR gcc maar so ver as wat ek kan sê dit is slegs beskikbaar as 'n kol, wat sou beteken dat my AVR packages hercompileren. Maar dit is eenvoudig genoeg om vaste punt jouself te implementeer, so dit is wat ek gedoen het. Die eerste en belangrikste ding is om die skaalfaktor kies, versigtig om nie 'n waarde wat nie lei tot oorloop by enige punt in die berekening haal. In hierdie geval, ek het geweet dat die omvang van die sensor waardes gaan wees tussen 0 en 100. As ek kies 'n skaalfaktor van 2 5 die berekening hierbo in vaste punt vorm sal dus wees: So het die maksimum intermediêre waarde sal 100 * 2 5 * 9 of 28800 wat goed binne die grense van 'n 16-bit ongetekende heelgetal wees. 'N Paar dinge om op te let: die skaal / unscaling word gedoen deur eenvoudig die verskuiwing van 5 stukkies links of regs soos toepaslik, en die 0.1 en 0.9 vermenigvuldiging van die swaai-punt weergawe geword / 10 en * 9/10 onderskeidelik. Ten slotte, om die unscaled gemiddelde waarde te kry wat ons nodig het om die ekwivalent van die toevoeging van 0,5 en afronding voor unscaling die waarde en dit is wat die byvoeging van 16 is vir doen - 2 5/2 = 16. Daarna het ek het 'n klein program wat 'n reeks gevoer van waardes in beide die swaai en vaste punt weergawes en vergelyk met die resultate. In alle gevalle, die verskil tussen die swaai en vaste punt weergawes is nie meer as + -1, wat perfek voldoende was. Omdat die sensor waardes word getoets op 100Hz die vaste punt eksponensiële bewegende gemiddelde konvergeer om dieselfde waarde as die swaai-punt waarde binne slegs 'n paar monsters, selfs wanneer daar 'n verskil. Die volgende stap was om werklik te meet hoe lank die swaai-punt en vaste punt berekeninge het. Om dit te doen, ek het 'n bietjie losstaande program wat die waardes 0. 100 gevoer in die berekening, en dan herhaal dat 1000 keer. Ek het toe aangeteken die begin en einde van tyd in mikrosekondes rondom die lus, wat my die tyd om uit te voer 100,000 van die berekeninge het. Ek snel ook 'n leë lus met net 'n NOP instruksie sodat ek kon die lus oorhoofse by die berekening aftrek. Die SVE loop op 16MHz en elke NOP neem 1 siklus, so ek die tyd kan aftrek vir die Nops van die totale oorhoofse. Sonder die Nops is daar 'n goeie kans om die gcc optimaliseerder sal uitvind dat die lus doen niks en optimaliseer dit weg heeltemal, die verslaan van die doel van die oorhoofse berekening. OK, kom ons hardloop dat en kyk na die resultate, die CPU klok koers is 16MHz en die tye is in mikrosekondes per berekening: Wag 'n bietjie - die vaste punt berekening is stadiger as die swaai-punt weergawe! Hoe op aarde kan dit wees? Hmmm. Wel, die swaai en vaste punt weergawes is nie presies ekwivalent. Die swaai-punt weergawe maak gebruik van twee vermeerder, die vaste punt weergawe maak gebruik van twee afdelings en 'n vermenigvuldig. Kom ons herskryf die swaai-punt weergawe en maak dit presies gelyk aan die vaste punt weergawe: Nou is die resultate is: OK, wat ten minste verduidelik wat die probleem is nie - dit is die afdeling stappe in die berekening. Terwyl die AVR het 8-bit hardeware vermeerder instruksies, het dit geen hardeware afdeling. Dit blyk dat verdeeldheid is harder en dus en stadiger te implementeer as vermenigvuldiging, sowel in hardeware en sagteware. Vermenigvuldiging kan gedoen word deur eenvoudig herhaalde optelling, afdeling vereis toets aftrek en vergelykings. Daar is 'n goeie Atmel aansoek nota AVR200 dat sommige vergelykende tye vir vermenigvuldiging en deling heeltemal geïmplementeer in sagteware gee: 'N nader kyk na die Advanced CODAS bewegende gemiddelde Algoritme Veelsydige bewegende gemiddelde in Gevorderde CODAS algoritme filters golfvorm geraas, uittreksels bedoel, en elimineer basislyn drif. Die bewegende gemiddelde is 'n eenvoudige wiskundige tegniek hoofsaaklik gebruik word om afwykings te skakel en openbaar die werklike tendens in 'n versameling van data punte. Jy kan vertroud is met dit uit gemiddeld lawaaierige data in 'n groentjie fisika eksperiment, of uit die dop van die waarde van 'n belegging wees. Jy kan nie weet dat die bewegende gemiddelde is ook 'n prototipe van die eindige impulsrespons filter, die mees algemene tipe filter gebruik in rekenaar-gebaseerde toerusting. In gevalle waar 'n gegewe golfvorm word gewy word met geraas, waar 'n gemiddelde onttrek moet word van 'n periodiese sein, of waar 'n stadig dryf basislyn moet uitgeskakel word van 'n hoër frekwensie sein, kan 'n bewegende gemiddelde filter toegepas die gewenste te bereik gevolg. Die bewegende gemiddelde algoritme van Advanced CODAS bied hierdie soort van golfvorm filter prestasie. Gevorderde CODAS is 'n analise sagteware pakket wat werk op bestaande golfvorm data lêers geskep deur die eerste generasie WinDaq of tweede generasie WinDaq data verkryging pakkette. Benewens die bewegende gemiddelde algoritme, Advanced CODAS sluit ook 'n verslag generator nut en sagteware roetines vir golfvorm integrasie, differensiasie, piek en dal vaslegging, regstelling, en rekenkundige operasies. Bewegende gemiddelde filter Teorie DATAQ instrumente 'bewegende gemiddelde algoritme kan 'n groot mate van buigsaamheid in golfvorm filter aansoeke. Dit kan gebruik word as 'n laaglaatfilter om die geraas deel is van baie soorte golfvorms verswak, of as 'n hoë-pass filter om 'n drywende basislyn van 'n hoër frekwensie sein uit te skakel. Die prosedure wat gevolg word deur die algoritme om die bedrag van filters bepaal behels die gebruik van 'n glad faktor. Dit glad faktor, deur jou beheer word deur die sagteware, kan verhoog of verlaag die aantal werklike golfvorm data punte of monsters wat die bewegende gemiddelde sal strek spesifiseer. Enige periodieke golfvorm kan wees gedink as 'n lang tou of versameling van data punte. Die algoritme accomplishes 'n bewegende gemiddelde deur twee of meer van hierdie datapunte uit die verkry golfvorm, toe te voeg, te verdeel hul som van die totale aantal datapunte bygevoeg, die vervanging van die eerste data punt van die golfvorm met die gemiddelde net bereken en herhaal die stappe met die tweede, derde en so aan datapunte tot die einde van die data bereik word. Die resultaat is 'n tweede of gegenereer golfvorm bestaan uit die gemiddeld data en met dieselfde aantal punte as die oorspronklike golfvorm. Figuur 1 - Enige periodieke golfvorm kan beskou word as 'n lang tou of versameling van data punte. In die bostaande illustrasie, is agtereenvolgende golfvorm data punte deur & quot; y & quot; om te illustreer hoe die bewegende gemiddelde bereken word. In hierdie geval, 'n glad faktor van drie toegepas, wat beteken dat drie agtereenvolgende datapunte vanaf die oorspronklike golfvorm bygevoeg, hulle som gedeel deur drie, en dan is dit kwosiënt is geplot as die eerste data punt van 'n gegenereer golfvorm. Die proses herhaal met die tweede, derde en so aan datapunte van die oorspronklike golfvorm tot aan die einde van die data bereik word. 'N Spesiale & quot; vere & quot; tegniek gemiddeldes die begin en einde data punte van die oorspronklike golf-vorm om te verseker dat die gegenereerde golfvorm bevat dieselfde aantal datapunte as die oorspronklike. Figuur 1 illustreer hoe die bewegende gemiddelde algoritme is toegepas op datapunte (wat verteenwoordig word deur y) golfvorm. Die illustrasie beskik oor 'n glad faktor van 3, wat beteken dat die gemiddelde waarde (verteenwoordig deur a) word bereken oor 3 agtereenvolgende golfvorm datawaardes. Let op die oorvleueling wat in die bewegende gemiddelde berekeninge bestaan. Dit is hierdie oorvleueling tegniek, saam met 'n spesiale beginning - en eindpunt behandeling wat dieselfde aantal datapunte in die gemiddelde golfvorm genereer as bestaan het in die oorspronklike. Die manier waarop die algoritme bereken 'n bewegende gemiddelde verdien 'n nader kyk en kan geïllustreer met 'n voorbeeld. Sê ons op 'n dieet gewees het vir twee weke en ons wil ons gemiddelde gewig bereken die afgelope 7 dae. Ons wil ons gewig op te som op dag 7 met ons gewig op dae 8, 9, 10, 11, 12, en 13; en dan vermenigvuldig met 1/7. Om die proses te formaliseer, kan dit uitgedruk word as: 'n (7) = 1/7 (y (7) + y (8) + y (9) +. + y (13)) Hierdie vergelyking kan verder veralgemeen. Die bewegende gemiddelde van 'n golfvorm kan bereken word deur: a = gemiddeld waarde N = datapunt posisie s = glad faktor y = werklike data punt waarde Figuur 2 * - Die vrag sel uitsetgolfvorm getoon oorspronklike en ongefiltreerde in die top-kanaal en as 'n 11-punt bewegende gemiddelde golfvorm in die onderste kanaal. Die geraas wat op die oorspronklike golfvorm te wyte was aan die intense vibrasies geskep deur die pers gedurende die verpakking werking. Die sleutel tot buigsaamheid van hierdie algoritme is sy wye verskeidenheid van te kies glad faktore (van 2 - 1000). Die glad faktor bepaal hoeveel werklike datapunte of monsters sal gemiddeld. Spesifisering enige positiewe glad faktor simuleer 'n laaglaatfilter terwyl spesifiseer van 'n negatiewe glad faktor simuleer 'n hoë-pass filter. Gegewe die absolute waarde van die smoothing faktor, hoër waardes groter glad beperkings op die gevolglike golfvorm en omgekeerd, laer waardes minder glad. Met die toepassing van die korrekte glad faktor, kan die algoritme ook gebruik word om die gemiddelde waarde van 'n gegewe periodieke golfvorm te onttrek. 'N Hoër positiewe glad faktor is tipies aangewend vir die opwekking van gemiddelde golfvorm waardes. Die toepassing van die bewegende gemiddelde Algoritme 'N belangrike kenmerk van die bewegende gemiddelde algoritme is dat dit baie keer toegepas kan word om dieselfde golfvorm indien nodig om die gewenste filter resultaat te kry. Golfvorm filter is 'n baie subjektiewe oefening. Wat kan 'n behoorlik gefilter golfvorm om 'n gebruiker kan onaanvaarbaar lawaaierige na 'n ander te wees. Net jy kan oordeel of die aantal gemiddeld punte gekies te hoog, te laag, of net reg was. Die buigsaamheid van die algoritme kan jy die smoothing faktor aan te pas en maak 'n ander pas deur die algoritme toe bevredigende resultate nie bereik word met die aanvanklike poging. Die aansoek en vermoëns van die bewegende gemiddelde algoritme kan die beste geïllustreer deur die volgende voorbeelde. Figuur 3 * - Die EKG golfvorm getoon oorspronklike en ongefiltreerde in die top-kanaal en as 'n 97-punt bewegende gemiddelde golfvorm in die onderste kanaal. Let op die afwesigheid van basislyn drif in die onderste kanaal. Beide golfvorms word in 'n saamgeperste voorwaarde vir aanbieding doeleindes. A Ruisonderdrukking Aansoek In gevalle waar 'n gegewe golfvorm is deurmekaar met geraas, kan die bewegende gemiddelde filter toegepas word op die geraas te onderdruk en lewer 'n duideliker prentjie van die golfvorm. Byvoorbeeld, is 'n gevorderde CODAS kliënt met behulp van 'n pers en 'n vrag sel in 'n verpakking werking. Hul produk was om saamgepers tot 'n voorafbepaalde vlak (gemonitor word deur die vrag sel) om die grootte van die pakket wat nodig is om die produk bevat verminder. Vir gehaltebeheer redes, het hulle besluit om die pers in samewerking met instrumentasie te monitor. 'N Onverwagse probleem verskyn toe hulle begin lees van die real-time vrag sel uitset. Sedert die druk masjien vibreer aansienlik terwyl dit in werking, die vrag sel se uitsetgolfvorm was moeilik om te onderskei, want dit 'n groot hoeveelheid van die geraas wat as gevolg van die vibrasie soos in die top-kanaal van Figuur 2. Dit geraas uitgeskakel deur die opwekking van 'n 11-punt bewegende gemiddelde kanaal soos in die onderste kanaal van Figuur 2. Die gevolg was 'n baie duideliker prentjie van uitset die vrag sel se. 'N Aansoek in die uitskakeling van Basislyn Drift In gevalle waar 'n stadig dryf basislyn behoeftes van 'n hoër frekwensie sein te verwyder, kan die bewegende gemiddelde filter toegepas word op die drywende basislyn te skakel. Byvoorbeeld, 'n EKG golfvorm vertoon tipies 'n mate van basislyn dwaal soos gesien kan word in die top-kanaal van figuur 3. Dit basislyn drif kan uitgeskakel word sonder om of die eienskappe van die golfvorm ontstellend soos in die onderste kanaal van figuur 3. Dit word bereik deur die toepassing van 'n toepaslike negatiewe waarde glad faktor tydens die bewegende gemiddelde berekening. Die toepaslike glad faktor bepaal word deur 'n golfvorm tydperk (in sekondes) deur die kanaal se voorbeeld interval. Die kanaal se voorbeeld interval is eenvoudig die omgekeerde van die kanaal se monster tempo en is gerieflik vertoon op die bewegende gemiddelde nut spyskaart. Die golfvorm tydperk is maklik bepaal uit die skerm deur die posisionering van die muis op 'n gerieflike plek op die golfvorm, die opstel van 'n tyd merker, en dan beweeg die wyser een volledige siklus weg van die vertoon tyd merker. Die tydsverskil tussen wyser en tyd merker is een golfvorm tydperk en vertoon aan die onderkant van die skerm in sekondes. In ons EKG byvoorbeeld die golfvorm besit 'n kanaal voorbeeld interval van 0,004 sekondes (verkry uit die bewegende gemiddelde nut spyskaart) en een golfvorm tydperk is gemeet aan 0,388 sekondes strek. Die verdeling van die golfvorm tydperk deur die kanaal se voorbeeld interval het ons 'n glad faktor van 97. Aangesien dit die basislyn drif wat ons is geïnteresseerd in die uitskakeling van ons toegepas n negatiewe glad faktor (-97) om die bewegende gemiddelde algoritme. Dit in werking afgetrek die bewegende gemiddeld gevolg van die oorspronklike golfvorm sein, wat die basislyn drif uitgeskakel sonder om golfvorm inligting. Ander Golfvorm bewegende gemiddelde Kwessies Wat ook al die aansoek, die universele rede vir die toepassing van 'n bewegende gemiddelde filter is om & quot; stryk & quot; die hoë en lae afwykings en openbaar 'n meer verteenwoordigende intermediêre golfvorm waarde. Wanneer dit te doen, moet die sagteware nie ander kenmerke van die oorspronklike golfvorm kompromie in die proses vir die opwekking van 'n bewegende gemiddeld golfvorm. Byvoorbeeld, moet die sagteware outomaties die kalibrasie inligting wat verband hou met die oorspronklike data lêer aan te pas, sodat die bewegende gemiddeld golfvorm is in die toepaslike ingenieurswese eenhede toe gegenereer. * Alle lesings in die syfers is geneem met behulp van WinDaq Data Acquisition sagteware
No comments:
Post a Comment