Friday 8 December 2017

Glidande medelvärde filter accelerometer


Jag hittar följande kod för en enkel implementering av ett lågpassfilter. definiera alpha 0.1 accelX (acceleration. x alpha) (accelX (1.0-alfa)) Jag har experimenterat med värdet för alfa. Men jag vill veta hur exakt vi kan hitta detta värde för accelerometerdata (i Android). Jag förstår att vi skulle behöva samplingsfrekvensen och avskurningsfrekvensen. Hur kan jag hitta avstängningsfrekvensen för denna typ av data (jag antar att det här medför brusmodellering och att hitta dess frekvensområde Om så skulle hur ska jag göra det) frågade Mar 13 13 vid 5:52 Det är ett autoregressivt glidande medelvärde - en oändlig impulsresponsfilter. Börja med ekvationen ovan, ta z-transformen, och det ger frekvenssvaret. Det har inget att göra med ljudmodellen. Hittar freq-svaret för alfa 0,9, frekvensaxeln är skalad från 0 till din Nyquist-frekvens (halva din provtagningsfrekv) som genereras i oktav av freqz (0.9, 1 -0.1). Vad du har är ekvationen för ett poligt lågpassfilter . Detta är den diskreta ekvivalenten av det analoga R-C-filtret. Medan din ekvation är korrekt, tycker jag om att skriva den som FILT lt-- FILT FF (NEW - FILT) eftersom det här är lite bekvämare att realisera i en mikrokontroller i de flesta fall. Vanligtvis är tidsdomänvisningen av filtret mer direkt användbar när man implementerar en av dessa i en mikrokontroller. För det mesta är du mer oroad över samplingsfrekvens och responstid än frekvensrullningen. Men den senare kommer upp, varför jag byggt några anläggningar för att manipulera detta till min PIC preprocessor. Dokumentationen av de två relevanta inlinefunktionerna är: Jag utarbetade matematiken när jag skrev koden för de funktionerna, så jag hänvisar bara till det istället för att återuppliva det nu: Den faktiska matematiken för FFFREQ-funktionen är bara två rader kod, så du kan räkna ut det. Det ser ut som om detta bygger på vissa definitioner högst upp i filen: Om du råkar göra det på en PIC kanske du vill använda preprocessorn. Den ingår i PIC Development Tools-utgåvan på embedincpicdload. htm. Källkoden för preprocessorn ingår i värdkällkoden och allt släpps. svarat 13 mar 13 kl 12:45 En enkel, enkelpol, lågpass, rekursivt IIR-filter är snabbt och enkelt att implementera, t. ex. där x, y är de raka (ofiltrerade) XY-accelerometersignalerna, xf, yf är de filtrerade utsignalerna och k bestämmer filternas tidskonstant (vanligtvis ett värde mellan 0,9 och 0,9999. där en större k betyder en längre tidskonstant ). Du kan bestämma k empiriskt, eller om du vet din önskade avstängningsfrekvens, Fc. då kan du använda formeln: där Fs är provfrekvensen. Observera att xf, yf är de tidigare värdena för utsignalen på RHS och de nya utgångsvärdena på LHS i uttrycket ovan. Observera också att vi antar här att du kommer att samplera accelerometerns signaler med vanliga tidsintervaller, t. ex. var 10: e ms. Tidskonstanten kommer att vara en funktion både k och detta provtagningsintervall. Android Accelerometer: Lågpassfilter Uppskattad linjär acceleration Relevant kod och projekt: Acceleration Explorer: Acceleration Explorer är ett Android-kodexempel och ett arbetsprogram. Programmet tillåter användare att plotta och logga utdata från enhetens accelerationssensor och lågpassfilterbaserad linjär acceleration i realtid. Inställningarna på lågpassfiltret kan definieras av användaren så att lågpassfilterbaserade linjära accelerationsalgoritmer snabbt kan finjusteras över flera enheter. Du kan ladda ner Acceleration Explorer från Google Play-butiken gratis. Du kan gaffla källkoden för Acceleration Explorer från GitHub Linear Acceleration: En accelerometer kan mäta jordens statiska gravitationsfält (som en lutningssensor) eller det kan mäta mätning linjär acceleration ( som accelererar i ett fordon), men det kan inte mäta båda samtidigt. När vi talar om linjär acceleration i hänvisning till en accelerationssensor, menar vi egentligen Linjär Acceleration Measured Acceleration - Gravity (så vi kan bestämma själva accelerationen av enheten, oavsett hur enheten är orienterad). Den svåra delen är att bestämma vilken del av signalen som är tyngdkraften. Problemet: Det är svårt att sekvestrera gravitationskomponenten i signalen från den linjära accelerationen. Vissa Android-enheter implementerar Sensor. TYPELINEARACCELERATION och Sensor. TYPEGRAVITY som utför beräkningarna för dig. De flesta av dessa enheter är nya, avancerade och utrustade med ett gyroskop. Det är också värt att notera att Sensor. TYPELINEARACCELERATION faktiskt inte fungerar väldigt bra medan enheten accelererar på många enheter som jag testat. Detta beror på att accelerationssensorn ofta används för att kompensera för gyroskopets drift, vilket medför en återkopplingsslinga mellan de två sensorerna. När anordningen accelererar antar drift kompensationsalgoritmen att enheten faktiskt lutas i stället för att accelerera och börjar kompensera gyroskopet felaktigt. Detta ligger dock bortom artikelns räckvidd. Om du har en äldre enhet och inte har ett gyroskop, kommer du att möta vissa begränsningar med Sensor. TYPEACCELERATION. Enheten kan inte mätas noggrant, förutsatt att enheten inte uppvisar någon linjär acceleration. Den linjära accelerationen kan endast mätas exakt om tiltningen av enheten är känd. Vi kan emellertid uppskatta tiltningen med ett lågpassfilter och tillämpa korrigeringar selektivt. Denna implementering kan vara mycket fördelaktig eftersom när den är rätt inställd fungerar den mycket bra och använder endast en accelerationssensor istället för att förlita sig på sensorfusioner. En lågpassfilterlösning: I teorin kan tyngdkraften isoleras med ett lågpassfilter och sedan kan gravitationen subtraheras från råsignalen, vilket väsentligen skapar ett högpassfilter som isolerar den linjära accelerationen. Android Developer-dokumentationen ger ett exempel på ett genomförande som kan hittas här. Notera hur provperioden beräknas med en medelvärdesmetod. Detta görs eftersom provperioden mellan två på varandra följande uppdateringar (sampleTimeNew-sampleTimeOld) är mycket inkonsekvent. Medelvärdesmetoden ger en mycket mer stadig uppskattning av provperioden. Om det här inte ser ut som du är bekant kan du granska mina andra inlägg på lågpassfilter: Grunderna och lågpassfiltret: Optimera alfa. På papper är denna algoritm fantastiskt enklare än alternativa metoder, som Cardan-vinklar med sensorfusioner, som kräver en betydande mängd trigonometri. Linjär acceleration och rotation: Alpha 0.9: Statisk tilt: För testning användes en Droid Razr med en uppdateringsfrekvens på cirka 50 Hz. Algoritmen implementerar Wikipedia-versionen av lågpassfiltret med en filtertidskonstant på 0,002 sekunder. Tidskonstanten ger en alfa på ca 0,9. Om man antar att ingen linjär acceleration upplevs av accelerometern, kan lågpassfiltret effektivt sekvestrera gravitationen från linjär acceleration. Vi kan se att när enheten lutades på axeln mättes accelerometern med lutningen medan lågpassfiltret inte gjorde det. Detta beror på att nästan allt passerar genom filtret, vilket innebär att accelerationen i grunden subtraheras från sig själv. Effekten av LPF är mest synlig på Y-axeln (färgen grön). Du kan se den mörkgröna linjen (den råa accelerationen) rör sig mycket när enheten lutas fram och tillbaka. Den ljusgröna linjen (LPF linjär acceleration) rör sig väldigt lite i förhållande till den råa accelerationen, eftersom den kompenserar för lutningen av enheten. Du kan också se denna effekt i tiltmätare där mätaren till vänster (rak acceleration) heter högt på enheten och mätaren till höger (LPF linjär acceleration) kompenserar för lutningen. Observera att medan denna konfiguration fungerar bra för att demonstrera lutningskompensationen för LPF är tidskonstanten så kort att det bara effektivt subtraherar accelerationen från sig själv. Det betyder att om du faktiskt försökte mäta sann linjär acceleration med denna konfiguration, skulle det inte fungera väldigt bra alls. Linjär acceleration: Medan gravitationsberäkningen är responsiv med alfa vid .9 och en tidskonstant på 0,002 sekunder är det väldigt dåligt vid uppskattning av faktisk linjär acceleration. För att effektivt kunna mäta linjär acceleration måste tyngdkraftsuppskattningen vara mycket mer stel, dvs det behöver vara mindre mottagligt. Du kan se detta tydligast med Y-axeln. Den mörkgröna linjen är den råa accelerationen när telefonen accelereras fram och tillbaka och den ljusgröna linjen är LPF linjär acceleration. Vi kan se att den ljusgröna linjen betydligt under uppskattar den faktiska linjära accelerationen. Alfa 0,1: Statisk tilt: Med en tidskonstant på 0,18 sekunder och en alfa av 0,1, är gravitationsberäkningen mycket stabilare. Det tar längre tid för lutningen att kompensera, men det blir mer effektivt vid mätning av linjär acceleration (åtminstone under korta perioder). Linjär acceleration: Med gravitationskalkylen stabilare blir estimeringen av den linjära accelerationen effektivare. När alfa minskar kommer tidskonstanten att öka, vilket ökar fördröjningstiden och stabilitetsstabiliteten hos gravitationskalkylen. Vi kan se detta tydligast på Y-axeln (gröna linjer). Medan anordningen lutades vid 45 grader var den ljusgröna linjen (LPF linjär acceleration) nära amplituden för den mörkgröna linjen (rå acceleration) medan enheten accelererades fram och tillbaka. Medan denna implementering fungerar bra under korta perioder, löper du in i en vägg av sorter när man försöker mäta linjär acceleration under längre perioder. Detta skulle kräva en extremt lång tidskonstant, och lutningskompensationen skulle ta en extremt lång tid. till den punkt där syftet med lågpassfiltret besegras. Du kan dock arbeta runt detta genom att endast tillämpa lågpassfiltrets kompenseringar när enheten inte upplever linjär acceleration genom att analysera variansen eller storleken (eller båda) av accelerationssensorns ingångar. Detta ligger utanför ramen för denna artikel. Jag hittar följande kod för en enkel implementering av ett lågpassfilter. definiera alpha 0.1 accelX (acceleration. x alpha) (accelX (1.0-alfa)) Jag har experimenterat med värdet för alfa. Men jag vill veta hur exakt vi kan hitta detta värde för accelerometerdata (i Android). Jag förstår att vi skulle behöva samplingsfrekvensen och avskurningsfrekvensen. Hur kan jag hitta avstängningsfrekvensen för denna typ av data (jag antar att det här medför brusmodellering och att hitta dess frekvensområde Om så skulle hur ska jag göra det) frågade Mar 13 13 vid 5:52 Det är ett autoregressivt glidande medelvärde - en oändlig impulsresponsfilter. Börja med ekvationen ovan, ta z-transformen, och det ger frekvenssvaret. Det har inget att göra med ljudmodellen. Hittar freq-svaret för alfa 0,9, frekvensaxeln är skalad från 0 till din Nyquist-frekvens (halva din provtagningsfrekv) som genereras i oktav av freqz (0.9, 1 -0.1). Vad du har är ekvationen för ett poligt lågpassfilter . Detta är den diskreta ekvivalenten av det analoga R-C-filtret. Medan din ekvation är korrekt, tycker jag om att skriva den som FILT lt-- FILT FF (NEW - FILT) eftersom det här är lite bekvämare att realisera i en mikrokontroller i de flesta fall. Vanligtvis är tidsdomänvisningen av filtret mer direkt användbar när man implementerar en av dessa i en mikrokontroller. För det mesta är du mer oroad över samplingsfrekvens och responstid än frekvensrullningen. Men den senare kommer upp, varför jag byggt några anläggningar för att manipulera detta till min PIC preprocessor. Dokumentationen av de två relevanta inlinefunktionerna är: Jag utarbetade matematiken när jag skrev koden för de funktionerna, så jag hänvisar bara till det istället för att återuppliva det nu: Den faktiska matematiken för FFFREQ-funktionen är bara två rader kod, så du kan räkna ut det. Det ser ut som om detta bygger på vissa definitioner högst upp i filen: Om du råkar göra det på en PIC kanske du vill använda preprocessorn. Den ingår i PIC Development Tools-utgåvan på embedincpicdload. htm. Källkoden för preprocessorn ingår i värdkällkoden och allt släpps. besvarade mar 13 13 kl 12:45

No comments:

Post a Comment