Sunday 29 October 2017

Glidande Medelvärde Filter Hårdvara


Jag m kodar någonting för tillfället där jag mår en massa värden över tiden från en hårdvarukompass Denna kompass är mycket exakt och uppdateras mycket ofta, med det resultat att om det jiggles något slutar jag med det udda värdet som är vildt I motsats till sina grannar vill jag släta ut dessa värderingar. Jag har gjort lite läsning, det verkar som att jag vill ha ett högpassfilter, ett lågpassfilter eller ett glidande medelvärde. behåll en historia av de senaste 5 värdena eller vad som helst och använd medelvärdet av dessa värden nedströms i min kod där jag en gång bara använde det senaste värdet. Det borde jag, släpper ut dem jigglar snyggt, men det slår mig att Det är förmodligen ganska ineffektivt, och det här är förmodligen ett av de kända problemen med riktiga programmerare som det var en väldigt snygg kladdmatrislösning. Jag är dock en av de hemska självlärda programmörerna utan att ha en formell utbildning i någonting jämnt Vagt relaterat till CompSci eller Math Läs lite om att detta kan vara ett högt eller lågt passfilter, men jag kan inte hitta någonting som förklarar vad som är begripligt för ett hack som jag, hur effekten av dessa algoritmer skulle vara på en rad värden, låt Ensam hur matematiken fungerar Svaret som ges här till exempel svarar tekniskt min fråga, men bara i begrepp som är begripliga för dem som förmodligen redan vet hur man löser problemet. Det skulle vara en väldigt härlig och smart person som faktiskt kan förklara typ av problem det här är, och hur lösningarna fungerar, i termer av förståelse för en doktorsexamen. askad den 21 september 10 på 13 01. Om ditt rörliga medelvärde måste vara långt för att uppnå den nödvändiga utjämningen, och du behöver inte verkligen någon särskild form av kärnan, då blir du bättre om du använder ett exponentiellt förfallande rörligt medelvärde. Där väljer du liten för att vara en lämplig konstant, t. ex. om du väljer liten 1- 1 N, kommer den att ha lika mycket medelvärde som ett fönster Av storlek N, Men fördelas annorlunda över äldre punkter. Eftersom det nuvarande värdet av det rörliga genomsnittet bara beror på den tidigare och dina data behöver du inte behålla en kö eller något. Och du kan tänka på det som att göra något som, Jag har en ny punkt, men jag tror verkligen inte på det, så jag kommer att behålla 80 av min gamla uppskattning av mätningen och bara lita på den nya datapunkten 20 Det är ganska mycket detsamma som att säga, ja, jag Bara lita på den här nya punkten 20 och jag använder 4 andra punkter som jag litar på samma belopp, förutom att istället för att uttryckligen ta de 4 andra punkterna antar du att den genomsnittliga tiden du gjorde var förnuftig så att du kan använda din tidigare Work. answered 21 september 10 på 14 27.Hey, jag vet att det här är 5 år sent, men tack för ett fantastiskt svar jobbar jag på ett spel där ljudet ändras baserat på din hastighet, men på grund av att du kör spelet långsamt - as dator, hastigheten skulle fluktuera vildt, vilket var bra för styrning, men super irriterande i ter Ms of sound Detta var en väldigt enkel och billig lösning på någonting som jag trodde skulle vara ett väldigt komplext problem. Adam Mar 16 15 på 20 20. Om du försöker ta bort det enstaka udda värdet är ett lågpassfilter det bästa av Tre alternativ som du har identifierat lågpassfilter tillåter låghastighetsändringar som de som orsakas av att man roterar en kompass för hand, medan man avvisar höghastighetsförändringar, t. ex. de som orsakas av stötar på vägen, till exempel. Ett glidande medelvärde Kommer förmodligen inte vara tillräckligt eftersom effekterna av ett enda blip i dina data kommer att påverka flera efterföljande värden beroende på storleken på ditt glidande medelfönster. Om de odda värdena lätt kan detekteras kan du till och med vara bättre med en glitch - Borttagningsalgoritmen som fullständigt ignorerar dem. Här är ett gickdiagram för att illustrera. Det första diagrammet är ingångssignalen, med en obehaglig glitch. Det andra diagrammet visar effekten av ett 10-provets glidande medelvärde. Det slutliga diagrammet är en kombination av 10- Provmedel och th En enkel glitchdetektering algoritm som visas ovan När glitchen detekteras, används 10-medelvärdet i stället för det faktiska värdet. Det genomsnittliga jag kan komma ner med men det slår mig fast att det är nog ganska ineffektivt. Det är verkligen ingen anledning att Glidande medelvärde ska vara ineffektivt Du behåller antalet datapunkter du vill ha i en viss buffert som en cirkelkö. På varje ny datapunkt popar du det äldsta värdet och subtraherar det från en summa och trycker på det nyaste och lägger det till summan Så varje ny datapunkt innebär egentligen bara en pop-push, ett tillägg och en subtraktion. Det rörliga genomsnittet är alltid denna förskjutande sum dividerad med antalet värden i bufferten. Det blir lite svårare om du tar emot data samtidigt från flera trådar, men eftersom dina data kommer från en hårdvarubutik som tycks mycket tveksamt för mig. Och även hemska självlärda programmerare förenar. Det rörliga genomsnittet verkade ineffektivt för mig eftersom du måste lagra en buffert av värden - bättre att bara göra Några klara matriser med ditt inmatningsvärde och nuvarande arbetsvärde Jag tror att s hur exponentiell rörlig medelvärde fungerar En optimering jag har sett för den här typen av rörliga medelvärdet innebär att du använder en fast längdskön en pekare till var du befinner dig i den köen och bara Wrapper pekaren runt med eller en om Voila Inget dyrt tryck pop Kraft till amatörerna, bror Henry Cooke Sep 22 10 på 0 54. Henry För ett rakt uppåtgående medel behöver du bufferten helt enkelt så att du vet vilket värde som blir poppat när nästa värde blir skjutet Det sagt är den fasta kön en pekare du beskriver är exakt vad jag menade med cirkulär kö Det var därför jag sa att det inte är ineffektivt Vad tyckte du att jag menade Och om ditt svar är en matris som ändrar sina värden tillbaka på varje indexerat borttagande som stdvektor i C-brunn, då är jag så ont jag vill inte ens prata med dig längre Dan Tao 22 september 10 på 1 58. Henry Jag vet inte om AS3 men En Java-programmerare har samlingar som CircularQueue till hans förfogande är jag inte en Java-utvecklare så jag är säker på att det finns bättre exempel där ute, det är precis det jag hittade från en snabb Google-sökning, som precis implementerar funktionaliteten vi talar om Jag är ganska säker på majoriteten av medellånga och språk på låg nivå med standardbibliotek har något liknande, t ex i köet T Hur som helst, jag var filosofi själv, så allt är förlåtet Dan Tao 22 september 10 på 12 44. Ett exponentiellt förfallande glidande medelvärde kan beräknas för hand med endast trend om du använder rätt värden Se om en idé om hur man gör det här snabbt med en penna och papper om du letar efter exponentiellt jämnt glidande medelvärde med 10 utjämning Men eftersom du har en dator, vill du förmodligen göra binärväxling som i motsats till decimalväxling. På så sätt är allt du behöver en variabel för ditt nuvarande värde och en för genomsnittsvärdet. Nästa genomsnitt kan sedan beräknas från den. svarade 21 september 10 vid 14 39. det var så kallat tekniken en intervall grind t hatt fungerar bra med felaktiga prover med låg förekomst, förutsatt att användningen av en av de ovannämnda filterteknikerna rör sig i genomsnitt, exponentiell, när du har tillräcklig historia en tidskonstant kan du testa det nya inkommande dataprovet för rimlighet innan det läggs till beräkningen. viss kunskap om den maximala rimliga frekvensen av signalen är nödvändig, det råa provet jämförs med det senaste släta värdet, och om det absoluta värdet av den skillnaden är större än det tillåtna intervallet, kastas detta prov Ut eller ersättas med någon heuristisk, t. ex. en förutsägelse baserad på lutningsskillnaden eller trendprediktionsvärdet från dubbel exponentiell utjämning. Ansökad 30 april 16 vid 6 56. Forskaren och ingenjörens guide till digital signalbehandling av Steven W Smith, Ph D. Kapitel 15 Flytta genomsnittliga filter. Relativa rörelserna för det rörliga medelfiltret. I en perfekt värld skulle filterdesigners bara behöva hantera tidsdomän eller frekvensdomänkodad information, men aldrig en blandning av de två i samma signal Tyvärr finns det vissa applikationer där båda domänerna är samtidigt viktiga. T. ex. TV-signaler faller i denna otäcka kategori Videoinformationen kodas i tidsdomänen, det vill säga formen på vågformen motsvarar till ljusstyrkets mönster i bilden Men under överföringen behandlas videosignalen enligt sin frekvenskomposition, såsom dess totala bandbredd, hur bärvågorna för ljudfärg läggs till, elimineringsåterställning av DC-komponenten osv. Som ett annat exempel Elektromagnetisk störning är bäst förstådd i frekvensdomänen, även om signalen s-information kodas i tidsdomänen. Exempelvis kan temperaturmonitorn i ett vetenskapligt experiment kontamineras med 60 hertz från kraftledningarna, 30 kHz från en växelströmsförsörjning eller 1320 kHz från en lokal AM-radiostation Släktingar till det glidande medelfiltret har bättre frekvensdomän prestanda nce, och kan vara användbar vid dessa blandade domänapplikationer. Multiple-pass glidande medelfilter innefattar att mata in insignalen genom ett glidande medelfilter två eller flera gånger. Figur 15-3a visar den totala filterkärnan som resulterar från en, två och fyra passerar två Passerar motsvarar att använda en triangulär filterkärna en rektangulär filterkärna sammanfogad med sig. Efter fyra eller fler passerar den ekvivalenta filterkärnan ut som en Gaussian återkallar den centrala gränsteorem. Såsom visas i b ger flera passeringar ett s-format stegsvar, som jämfört med den raka linjen i det enkla passet Frekvenssvaren i c och d ges av Eq 15-2 multiplicerat med sig själv för varje pass. Dvs, resulterar varje domän-konvolvering i en multiplicering av frekvensspektra. Figur 15-4 visar frekvensresponsen hos två andra släktingar i det glidande medelfiltret När en ren Gaussian används som en filterkärna är frekvenssvaret också en Gaussian, som diskuteras i kapitel 11 T Han Gaussian är viktig eftersom det är impulssvaret hos många naturliga och konstgjorda system. Till exempel kommer en kort pulsspänning in i en lång fiberoptisk transmissionsledning att gå ut som en Gaussisk puls på grund av de olika vägarna som fotonerna tar i fibern Den gaussiska filterkärnan används också i stor utsträckning i bildbehandling eftersom den har unika egenskaper som möjliggör snabba tvådimensionella omvälvningar se kapitel 24 Det andra frekvenssvaret i Fig 15-4 motsvarar att använda ett Blackman-fönster som en filterkärna. Termfönstret har ingen menar här det är helt enkelt en del av det här accepterade namnet på den här kurvan. Den exakta formen av Blackman-fönstret ges i kapitel 16 Eq 16-2, fig 16-2. Det ser dock ut som en gauss. Hur är dessa släktingar i rörelsen Genomsnittligt filter bättre än det rörliga genomsnittliga filtret självt Tre sätt För det första och viktigast har dessa filter bättre dämpningsdämpning än det glidande medelfiltret. För det andra tappar filterkärnorna till en mindre amplitud nära ändarna Minns att varje punkt i utsignalen är en viktad summa av en grupp av prover från ingången. Om filterkärnan försvinner, får prover i ingångssignalen som ligger längre bort ges mindre vikt än de som ligger nära Tredje, Stegsvaren är släta kurvor, snarare än den plötsliga raka linjen i det glidande medlet. Dessa två är vanligtvis av begränsad nytta, även om du kanske hittar applikationer där de är genuina fördelar. Det rörliga genomsnittliga filtret och dess släktingar handlar om samma vid reducerar slumpmässigt buller samtidigt som ett skarpt stegsvar upprätthålls. Oförklarligheten ligger i hur stegtiden för stegsvaret mäts. Om rittiden mäts från 0 till 100 i steget är det glidande medelfiltret det bästa du kan göra, som tidigare visat i Jämförelse, mätning av risetiden från 10 till 90 gör Blackman-fönstret bättre än det glidande medelfiltret. Poängen är, det här är bara teoretisk snuskning anser att dessa filter är lika med den här parametern. Den största skillnaden i dessa filter är exekveringshastigheten Med hjälp av en rekursiv algoritm som beskrivs nedan kommer det glidande medelfiltret att springa som blixtlampa i din dator. Det är faktiskt det snabbaste digitala filtret tillgängligt. Flera pass av det glidande medlet kommer att vara motsvarande långsammare , Men ändå väldigt snabbt I jämförelse är de gaussiska och blackmanfiltren oerhört långsamma, eftersom de måste använda konvoltering Tänk en faktor tio gånger antalet punkter i filterkärnan baserat på multiplikation är ca 10 gånger långsammare än tillsats En 100-punkts Gaussian är 1000 gånger långsammare än ett rörligt medel med recursion. As andra har nämnt bör du överväga ett IIR-oändligt impulssvarningsfilter i stället för det FIR-finitiva impulsresponsfiltret du använder nu. Det finns mer till det, men vid första ögonkastet FIR-filter implementeras som uttryckliga omvälvningar och IIR-filter med ekvationer. Det speciella IIR-filtret jag använder mycket i mikrofonen rocontrollers är ett enkelspalt lågpassfilter Detta är den digitala motsvarigheten till ett enkelt RC-analogfilter. För de flesta applikationer kommer dessa att ha bättre egenskaper än det boxfilter som du använder. De flesta användningarna av ett lådfilter som jag har stött på är ett resultat av någon som inte uppmärksammar sig i den digitala signalbehandlingsklassen, inte som ett resultat av att de behöver sina speciella egenskaper. Om du bara vill dämpa högfrekvenser som du vet är buller, är ett enkeltpoligt lågpassfilter det bästa sättet att implementera en digitalt i en Microcontroller är vanligtvis. FILT - FILT FF NEW - FILT. FILT är en del av kvarstående tillstånd Detta är den enda beständiga variabeln du behöver beräkna det här filtret NYTT är det nya värdet som filtret uppdateras med denna iteration FF är filtret fraktion som justerar filtrets tyngdhet Titta på denna algoritm och se till att för FF 0 är filtret oändligt tungt eftersom utmatningen aldrig ändras. För FF 1 är det verkligen inget filter vid allt eftersom utmatningen bara följer ingången Användbara värden är emellan På små system väljer du FF för att vara 1 2 N så att multiplikationen med FF kan utföras som en rätt växling med N-bitar. Exempelvis kan FF vara 1 16 och Multiplicera med FF därför en rätt skift på 4 bitar annars behöver det här filtret bara en subtrahera och en läggs till, även om siffrorna vanligtvis behöver vara bredare än ingångsvärdet mer på numerisk precision i ett separat avsnitt nedan. Jag brukar ta AD-avläsningar betydligt snabbare än de behövs och tillämpa två av dessa filter kaskad Detta är den digitala ekvivalenten av två RC-filter i serie och dämpas med 12 dB oktav över rullningsfrekvensen. För AD-avläsningar är det vanligtvis mer relevant för att titta på filtret i Tidsdomän genom att överväga sitt stegsvar Detta berättar hur snabbt ditt system kommer att se en förändring när den sak du mäter förändringar. För att underlätta utformningen av dessa filter, vilket bara betyder att du väljer FF och bestämmer hur många av dem att kaskad använder jag mitt program FILTBITS Du specificerar antalet skiftbitar för varje FF i den kaskadade serien av filter, och det beräknar stegsvaret och andra värden. I själva verket kör jag vanligtvis detta via mitt omslagskript PLOTFILT Detta kör FILTBITS, vilket skapar en CSV-fil, och plottar sedan CSV-filen. Exempelvis här är resultatet av PLOTFILT 4 4.De två parametrarna till PLOTFILT betyder att det kommer att finnas två filter som är kaskad av den ovan beskrivna typen. Värdena 4 anger antalet växlingsbitar till realisera multipliceringen med FF De två FF-värdena är därför 1 16 i det här fallet. Det röda spåret är enhetens stegsvar och är det viktigaste att titta på. Till exempel berättar detta om att om ingången ändras omedelbart, blir utsignalen från det kombinerade filtret kommer att lösa sig till 90 av det nya värdet i 60 iterationer Om du bryr dig om 95 avvecklingstid måste du vänta på 73 iterationer och för 50 avvecklingstid bara 26 iterationer. Det gröna spåret visar utmatningen från en enda full amplitud e spike Detta ger dig en uppfattning om slumpmässigt brusundertryck Det verkar som om inget enda prov kommer att orsaka mer än en 2 5 förändring i utmatningen. Det blå spåret är att ge en subjektiv känsla av vad det här filtret gör med vitt brus Detta är inte ett noggrant test eftersom det inte finns någon garanti för vad exakt innehållet i slumpmässiga nummer valts som det vita bruset som ingången för denna körning av PLOTFILT Det är bara för att ge dig en grov känsla av hur mycket det kommer att bli squashed och hur smidig det är. PLOTFILT, kanske FILTBITS, och massor av andra användbara saker, särskilt för PIC-firmwareutveckling finns i programvarulisens PIC Development Tools på min nedladdningar av programvaran. Lägg till om numerisk precision. Jag ser från kommentarerna och nu ett nytt svar som finns intresse för att diskutera antalet bitar som behövs för att implementera detta filter Observera att multipliceringen med FF kommer att skapa logg 2 FF nya bitar under binärpunkten På små system är FF vanligtvis valt att vara 1 2 N så att denna multiplicera är ac realiseras av en rättväxling av N bitar. FILT är därför vanligtvis ett fastpunkts heltal Observera att detta inte ändrar någon av matematiken från processorns synvinkel. Om du t. ex. filtrerar 10 bitars AD-avläsningar och N 4 FF 1 16, då behöver du 4 fraktion bitar under 10 bitars heltal AD-läsningar En av de flesta processorer gör att du gör 16 bitars heltalstransaktioner på grund av 10-bitars AD-avläsningar. I det här fallet kan du fortfarande göra exakt samma 16 bitars heltalsoperationer , men börja med AD-läsningarna vänster förskjutna med 4 bitar Processorn känner inte till skillnaden och behöver inte göra Om matematiken på hela 16 bitars heltal fungerar, om du anser att de är 12 4 fasta eller äkta 16 bitars heltal 16 0 fast punkt. Generellt måste du lägga till N bitar varje filterpole om du inte vill lägga till ljud på grund av den numeriska representationen. I exemplet ovan måste det andra filtret av två ha 10 4 4 18 bitar för att inte förlora Information I praktiken på en 8-bitars maskin betyder det yo Ut använda 24-bitars värden Tekniskt sett skulle bara den andra polen av två behöva det bredare värdet, men för enkelhetsprogrammet för fastware använder jag vanligtvis samma representation, och därigenom samma kod, för alla poler i ett filter. Normalt skriver jag en subrutin eller ett makro till Utföra en filterpoleoperation och applicera sedan på den på varje pol Om en subrutin eller ett makro beror på huruvida cykler eller programminne är viktigare för det aktuella projektet. I vilket fall som helst använder jag en del repetillstånd för att överföra NEW till subrutinen makro som uppdaterar FILT , Men laddar också in i samma repetillstånd NYHET var i Detta gör det enkelt att tillämpa flera poler eftersom den uppdaterade FILT av en pol är NYHET av nästa. När en subrutin är det användbart att få en pekare till FILT på Vägen in, som uppdateras till strax efter FILT på vägen ut Således fungerar subrutinen automatiskt på efterföljande filter i minnet om det kallas flera gånger Med ett makro behöver du inte en pekare eftersom du skickar in adressen till Operera på varje iteration. Code Examples. Here är ett exempel på ett makro som beskrivits ovan för en PIC 18. Och här är ett liknande makro för en PIC 24 eller dsPIC 30 eller 33.But dessa exempel implementeras som makron med hjälp av min PIC assembler förprocessor som är mer kapabel än någon av de inbyggda makroanläggningarna. clabacchio Ett annat problem som jag borde ha nämnt är implementering av fast programvara. Du kan skriva en enkelpolig lågpassfilter subrutin en gång och sedan applicera den flera gånger. Faktum är att jag vanligtvis skriver en sådan subrutin för att peka i minnet till filtertillståndet, sedan ha det förskott Pekaren så att den kan kallas i följd lätt för att realisera flera poliga filter Olin Lathrop Apr 20 12 på 15 03.1 Tack så mycket för dina svar - alla bestämde jag för att använda det här IIR-filtret, men det här filtret används inte som ett Standard LowPass-filter eftersom jag behöver genomsnittliga räknevärden och jämför dem för att upptäcka ändringar i en viss räckvidd eftersom de här värdena har mycket olika dimensioner beroende på maskinvara jag ville ta ett genomsnitt för att kunna reagera på dessa hårdvaror specifika ändringar automatiskt senselen 21 maj 12 på 12 06. Om du kan leva med begränsningen av en kraft av två antal objekt i genomsnitt dvs 2,4,8,16,32 etc så kan delningen enkelt och effektivt ske på en Lågpresterande mikro med ingen dedikerad delning eftersom det kan ske som en bitskift. Varje växlingsrätt är en kraft av två. OP-enheten trodde att han hade två problem, delade i en PIC16 och minne för hans ringbuffert. Detta svar visar att delningen Det är inte svårt Visserligen behandlar det inte minnesproblemet, men SE-systemet tillåter partiella svar, och användarna kan ta något från varje svar för sig själva, eller till och med redigera och kombinera andra svar. Eftersom några av de andra svaren kräver en delning, är likaledes ofullständiga eftersom de inte visar hur man effektivt kan uppnå detta på en PIC16 Martin 20 april 12 på 13 01. Det finns ett svar på ett riktigt glidande medelfilter aka boxcar filter med mindre minne krav, om du inte har något att tänka på. Kallas ett kaskadintegrator-comb filter CIC Tanken är att du har en integrator som du tar skillnader över en tidsperiod, och den viktigaste minnesbesparande enheten är att genom downsampling behöver du inte lagra eve Ry-värdet på integratorn Det kan implementeras med följande pseudokod. Din effektiva glidande medellängd är decimationFactor stateize men du behöver bara behålla statusprover självklart. Du kan självklart få bättre prestanda om din stateize och decimationFactor är krafter på 2, så att divisions - och återstående operatörer ersättas av skift och mask-ands. Postscript Jag håller med Olin om att du alltid bör överväga enkla IIR-filter före ett glidande medelfilter Om du inte behöver frekvens-nollarna hos ett boxcarfilter, en 1-polig Eller 2-poligt lågpassfilter kommer antagligen att fungera bra. Om du filtrerar i syfte att decimera med en högprovsränta inmatning och med medelvärdet för användning med en lågprocess, då ett CIC-filter Kan vara precis vad du letar efter speciellt om du kan använda stateize 1 och undvika ringbufferten helt och hållet med bara ett enda tidigare integratorvärde. Det finns en djupgående analys av matematiken bakom användandet av de första orden er IIR-filter som Olin Lathrop redan har beskrivit på Digital Signal Processing-stackutbytet innehåller massor av vackra bilder Ekvationen för detta IIR-filter är. Detta kan implementeras med hjälp av heltalserier och ingen delning med följande kod kan behöva lite felsökning som jag Skrivte från minnet. Detta filter approximerar ett glidande medelvärde av de sista K-proven genom att ställa in värdet av alfa till 1 K Gör det här i föregående kod genom att definiera BITS till LOG2 K, dvs för K 16 set BITS till 4, för K 4 sätta BITS till 2 osv. Jag ska verifiera koden som anges här så snart jag får en ändring och rediger detta svar om det behövs. Svarade 23 juni 12 kl 04 04. Här är ett poligt lågpassfilter glidande medelvärde med Cutoff frekvens CutoffFrequency Mycket enkel, mycket snabb, fungerar bra och nästan inget minne överhead. Notera Alla variabler har räckvidd bortom filterfunktionen, utom det som passerade i newInput. Note Detta är ett enda stegsfilter Flera steg kan kaskadas tillsammans för att öka Skärpa av Filtret Om du använder mer än ett steg måste du justera DecayFactor som relaterar till Cutoff-Frequency för att kompensera. Och självklart allt du behöver är de två linjerna placerade någonstans, de behöver inte egen funktion. Detta filter har en uppstartstid innan det rörliga genomsnittet representerar det för ingångssignalen Om du behöver kringgå den här uppstartstiden kan du bara initiera MovingAverage till det första värdet av newInput istället för 0, och hoppas att den första newInput inte är en outlier. CutoffFrequency SampleRate har ett intervall mellan 0 och 0 5 DecayFactor är ett värde mellan 0 och 1, vanligen nära 1.Single-precision floats är tillräckligt bra för de flesta saker, jag föredrar bara dubbelar. Om du behöver hålla fast med heltal kan du konvertera DecayFactor och Amplitude Factor till fraktionella heltal, där täljaren lagras som heltalet och nämnaren är ett heltalseffekt på 2 så att du kan bitskiftas till höger som nämnaren i stället för att dela upp under filterslingan För Exempel om DecayFactor 0 99, och du vill använda heltal, kan du ställa DecayFactor 0 99 65536 64881 och sedan när du multiplicerar med DecayFactor i din filterslinga, skiftar du bara resultatet 16. För mer information om detta, en utmärkt bok som S online, kapitel 19 om rekursiva filter. PS För det Moving Average-paradigmet, kan ett annat sätt att ställa in DecayFactor och AmplitudeFactor som kan vara mer relevant för dina behov, låt oss säga att du vill ha föregående, ca 6 poster i genomsnitt tog Eter, gör det diskret, du lägger till 6 föremål och delas med 6, så du kan ställa in AmplitudeFactor till 1 6 och DecayFactor till 1 0 - AmplitudeFactor. answered 14 maj 12 på 22 55. Alla andra har kommenterat noggrant på verktyget Av IIR vs FIR, och på power-of-two-division Jag vill bara ge några detaljer om genomförandet Nedan fungerar det bra på små mikrokontroller utan FPU Det finns ingen multiplicering, och om du håller N en kraft av två delar hela divisionen Är encyklisk bitskiftning. Baskisk FIR-ringspuffbuffert håller en löpbuffert med de sista N-värdena och ett löpande SUM av alla värden i bufferten Varje gång ett nytt prov kommer in, subtrahera det äldsta värdet i bufferten från SUM , Ersätt det med det nya provet, lägg till det nya provet till SUM och mata ut SUM N. Modified IIR-ringbufferten, fortsätt SUM av de sista N-värdena Varje gång ett nytt prov kommer in, lägg till SUM-SUM N, lägg till det nya Prov och output SUM N. answered 28 aug 13 på 13 45. Om jag läser dig rätt beskriver du en första order IIR filtrera det värde du subtraherar är det t äldsta värdet som faller ut, men istället är det genomsnittet av tidigare värden Första ordningens IIR-filter kan säkert vara användbart men jag är inte säker på vad du menar när du föreslår att utgången är samma för alla periodiska signaler Vid en provkvot på 10 kHz matas en 100 Hz kvadratvåg i ett 20-stegs filter med en signal som stiger jämnt för 20 prover, sitter högt för 30, sjunker jämnt för 20 prover och sitter lågt för 30 En första ordning IIR filter supercat aug 28 13 vid 15 31. kommer att ge en våg som kraftigt börjar stiga och gradvis nivåer nära men inte vid ingångens maximala nivå, börjar sedan kraftigt falla och gradvis nivåer av nära men inte vid ingången minimum Mycket annorlunda beteende supercat Aug 28 13 på 15 32. Ett problem är att ett enkelt glidande medel kan eller inte kan vara användbart Med ett IIR-filter kan du få ett fint filter med relativt få beräkningar. Den FIR du beskriver kan bara ge dig en rektangel i tid - en sync i Freq - och du kan inte hantera sidloberna Det kan vara väl värt att kasta in ett fåtal heltal multipliceras för att göra det till en fin symmetrisk avstämningsbar FIR om du kan spara klockan ticks Scott Seidman Aug 29 13 på 13 50. ScottSeidman Nej behöver multipliceras om man helt enkelt har varje steg i FIR-enheten antingen mata in medelvärdet av inmatningen till det aktuella läget och dess tidigare lagrade värde och lagra sedan inmatningen om man har numeriskt område, man kan använda summan snarare än genomsnittet Oavsett om det S bättre än ett lådfilter beror på applikationen stegresponsen hos ett lådfilter med en total fördröjning på 1ms, till exempel, kommer att ha en otäck d2 dt spik när ingången ändras och igen 1ms senare men kommer att ha det minsta möjliga d dt för ett filter med totalt 1ms fördröjning supercat aug 29 13 på 15 25.As mikeselektronik sagt, om du verkligen behöver minska dina minnesbehov, och du tänker inte på att ditt impulsrespons är en exponentiell istället för en rektangulär puls, jag skulle gå för en exponentiell rörlig ave raser filter Jag använder dem i stor utsträckning Med den typen av filter behöver du inte någon buffert. Du behöver inte lagra N tidigare prover. Bara en Så, dina minneskrav skärs med en faktor N. Även du behöver inte någon division för det Endast multiplikationer Om du har tillgång till flytande punkträkning, använd flytande punktmultiplikationer Annars gör vi multipelantal och ändringar till höger Vi är dock 2012 och jag rekommenderar dig att använda kompilatorer och MCU som tillåter dig För att arbeta med flytande punkter. Förutom att vara mer minneseffektivt och snabbare behöver du inte uppdatera objekt i någon cirkulär buffert. Jag skulle säga att det också är mer naturligt eftersom ett exponentiellt impulsrespons matchar bättre hur naturen beter sig, i de flesta fall. ansvarad 20 april 12 på 9 59. Ett problem med IIR-filtret som nästan berört av olin och supercat men tydligen ignoreras av andra är att avrundningen introducerar en viss oriktighet och eventuellt bias trunkering förutsatt att N i en kraft av två och enbart heltalsräkningar används, växlingen höger eliminerar systematiskt LSB: erna i det nya provet. Det betyder att hur lång serien någonsin kan vara, kommer genomsnittsvärdet aldrig att ta hänsyn till dem. För exempel, anta en långsammare minskande serie 8,8,8 8,7,7,7 7,6,6 och antar att medelvärdet verkligen är 8 i början Fist 7-provet kommer att ge genomsnittet till 7, oavsett filterstyrkan Bara för ett prov Samma berättar för 6 osv. Tänk på motsatsen går serien upp. Medelvärdet kommer att förbli på 7 för alltid tills provet är stort nog för att få det att ändras. Naturligtvis kan du korrigera för bias genom att lägga till 1 2 N 2, men som vann t verkligen lösa precisionsproblemet i så fall kommer den minskande serien att stanna för alltid vid 8 tills provet är 8-1 2 N 2 För N 4 till exempel kommer något prov över noll att hålla medeltalet oförändrat. Jag tror en lösning för Det skulle innebära att man höll en ackumulator av de förlorade LSB: erna men jag gjorde inte det tillräckligt långt för att få kod redo, Och jag är inte säker på att det inte skulle skada IIR-strömmen i några andra fall av serier, till exempel om 7,9,7,9 skulle vara genomsnittliga till 8 då. Olin, din tvåstegskaskad skulle också behöva någon förklaring. Menar du att du håller två genomsnittsvärden med resultatet av den första matas in i den andra i varje iteration Vad är fördelen med detta.

No comments:

Post a Comment