Moving Genomsnittet Pic


Som 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 är mer till det, men vid första anblicken implementeras FIR-filter som uttryckliga omvälvningar och IIR-filter med ekvationer. Speciellt IIR-filter Jag använder mycket i mikrokontroller är ett enda poligt 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 lådfilter som du använder De flesta användningarna av ett lådfilter som jag har stött på är en följd av att någon 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 enkelspårigt lågpassfilter bättre bästa sättet att implementera en digitalt i en mikrokontroller är vanligtvis. FILT - FILT FF NEW - FILT. FILT är en del av beständig stat Detta är den enda bestående va Riable du behöver beräkna detta filter NEW är det nya värdet som filtret uppdateras med denna iteration FF är filterfraktionen som justerar filterets tyngd. Se på denna algoritm och se till att för FF 0 är filtret oändligt tungt eftersom Utgången ändras aldrig För FF 1 är det verkligen inget filter alls eftersom utmatningen följer bara ingången. På små system väljer du FF att vara 1 2 N så att multipliceringen med FF kan utföras som ett rätt skift av N-bitar Exempelvis kan FF vara 1 16 och multiplicera med FF därför en rättväxling på 4 bitar. Annars behöver detta filter endast en subtrahera och en tillägg, även om siffrorna vanligtvis behöver vara bredare än ingångsvärdet mer på numerisk precision I en separat sektion 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 motsvarigheten till två RC-filter i serie och dämpas med 12 dB oktav över rollen Frekvens Men för AD-avläsningar är det vanligtvis mer relevant att titta på filtret i tidsdomänen 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 som bara betyder att du väljer FF och bestämmer hur många av dem som ska kaskad använder jag mitt program FILTBITS Du anger antalet växlingsbitar för varje FF i den kaskadade serien filter och det beräknar stegsvaret och andra värden my wrapper script PLOTFILT Detta kör FILTBITS, som gör en CSV-fil, sedan plottar CSV-filen Till exempel här är resultatet av PLOTFILT 4 4.De två parametrarna till PLOTFILT betyder att det kommer att finnas två filter kaskad av den ovan beskrivna typen Värdena av 4 anger antalet skiftbitar för att inse 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 den viktigaste att titta på. Säger du att om ingången ändras omedelbart kommer utmatningen av det kombinerade filtret 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 amplitudspik 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 utgången. Det blå spåret är att ge en subjektiv Känslan av vad det här filtret gör med vitt brus Detta är inte ett strikt test eftersom det inte finns någon garanti för vad exakt innehållet i slumpmässiga siffror valts som den vita brusinmatningen för denna körning av PLOTFILT Det är bara för att ge dig en grov känsla av hur mycket det blir squashed och hur smidigt det är. PLOTFILT, kanske FILTBITS, och många andra användbara saker, speciellt för PIC-firmwareutveckling finns i programvarulicens för PIC Development Tools på min nedladdningar av programvaran. Dedikerad om numerisk precision. I ser från kommentarerna och nu ett nytt svar att det finns intresse att diskutera antalet bitar som behövs för att implementera detta filter Observera att multiplikationen med FF kommer att skapa logg 2 FF nya bitar under binärpunkten På små system , Är FF vanligtvis vald att vara 1 2 N så att denna multiplicering faktiskt realiseras med 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 till exempel filtrerar 10 bitars AD-avläsningar och N 4 FF 1 16 behöver du 4 fraktion bitar under 10 bitars heltal AD-läsningar. En av processorerna gör du 16 bitars heltalstransaktioner på grund av 10-bitars AD-avläsningarna I det här fallet kan du fortfarande göra exakt samma 16 bitars integeroperationer, men börja med AD-avläsningarna vänster förskjutna med 4 bitar. Processorn känner inte till skillnaden och behöver inte. Att göra matte på hela 16 bitars heltal fungerar om du Anser att de är 12 4 fast punkt eller sann 16 bitars heltal 16 0 fixpunkt. 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 skulle det andra filtret av två ha Att ha 10 4 4 18 bitar för att inte förlora information I praktiken på en 8-bitars maskin betyder det att du använder 24 bitars värden. Tekniskt sett behöver endast den andra polen av två ha det bredare värdet, men för enkelhetsgraden för fasta program använder jag vanligtvis samma representation, Och därmed samma kod för alla poler i ett filter. Normalt skriver jag en subrutin eller ett makro för att utföra en filterpoleoperation och applicera sedan den på varje pol Om en subrutin eller ett makro beror på huruvida cykler eller programminne är viktigare i det speciellt projekt Hur som helst använder jag en del repetillstånd för att skicka NEW till subrutinen makro, som uppdaterar FILT, men laddar också in i samma skrapstat NYHET var i Detta gör det enkelt att tillämpa flera poler eftersom den uppdaterade FILT-en av en pol är NE W av nästa När en subrutin är det användbart att peka på 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 för att fungera 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.Both dessa exempel implementeras som makron med min PIC assembler preprocessor som är mer kapabel än någon av de inbyggda makro anlä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åstegs kaskad 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? Medel Enkelt glidande medelvärde. Medeltal Enkelt glidande medelvärde Du är Uppmuntras att lösa den här uppgiften enligt uppgiftsbeskrivningen, med vilket språk som helst som du kanske känner till det enkla rörliga genomsnittsvärdet för en serie tal. Skapa en stateful-funktionsklass förekomst som tar en period och returnerar en rutin som tar ett tal som argument och returnerar en Enkelt glidande medelvärde av dess argument hittills. Ett enkelt glidande medelvärde är en metod för att beräkna ett medelvärde av en ström av siffror genom att endast beräkna de sista P-talen från strömmen, där P är känd som perioden. Det kan implementeras genom att ringa en initialiseringsrutin med P som dess argument, IP, som då ska returnera en rutin som när den kallas med enskilda successiva medlemmar i en ström av tal, beräknar medelvärdet av upp till, den sista P o F dem, kan vi ringa detta SMA. Ordet stateful i uppgiftsbeskrivningen hänvisar till behovet av SMA att komma ihåg viss information mellan samtal till den. Perioden, P. An beställd behållare av åtminstone de sista P-talen från var och en av dess individuella calls. Stateful betyder också att successiva samtal till jag, initialiseraren, ska returnera separata rutiner som inte delar sparad status så att de kan användas på två oberoende dataströmmar. Pseudo-kod för en implementering av SMA är. Denna version använder en ihållande kö för att hålla de senaste p-värdena Varje funktion som returneras från init-moving-genomsnittet har sitt tillstånd i en atom som håller ett kövärde. Denna implementering använder en cirkellista för att lagra siffrorna i fönstret i början av varje iterationspekare hänvisar till Till listcellen som håller värdet bara förflyttning ur fönstret och att ersättas med det justerade värdet. Användning av en Closure edit. Currently kan denna sma inte vara nogc eftersom den allokerar en stängning på högen Några escape analys sis kan ta bort allokeringsallokering. Använda en strukturredigering. Den här versionen undviker hålfördelningen av förslutningen och håller data i stapelramen för huvudfunktionen Samma utmatning. För att undvika att de flytande punktens approximationer fortsätter att växa upp och växer, skulle koden kunna Utföra en periodisk summa för hela cirkulärkö-arrayen. Denna implementering producerar två funktionsobjekt delningstillstånd Det är idiomatiskt i E för att separera inmatning från utgången läs från skriv istället för att kombinera dem i ett objekt. Strukturen är densamma som implementeringen av Standard Avvikelse E. Elixirprogrammet nedan genererar en anonym funktion med en inbäddad period p, som används som perioden för det enkla glidande medlet. Körningsfunktionen läser numerisk ingång och skickar den till den nyupprettade anonyma funktionen och inspekterar därefter resultatet till STDOUT. Produkten visas nedan, med medelvärdet, följt av den grupperade ingången, som utgör grunden för varje glidande medelvärde. Tidigare har stängningar men oföränderliga variabler Bles En lösning är då att använda processer och ett enkelt meddelande som passerar baserade API. Matrix-språk har rutiner för att beräkna glidande avarages för en given sekvens av objekt. Det är mindre effektivt att slinga som i följande kommandon. Ställer kontinuerligt på en inmatning I som läggs till i slutet av en lista L1 L1 kan hittas genom att trycka på 2ND 1 och medelvärden finns i List OPS. Press ON för att avsluta programmet. Function som returnerar en lista som innehåller den genomsnittliga data för det medföljande argumentet. Program Som returnerar ett enkelt värde vid varje invocation. list är listan som medelvärde p är perioden 5 returnerar den genomsnittliga listan. Exempel 2 Använda programmet movinav2 i, 5 - Initiera glidande medelberäkningen och definiera perioden 5 movinav2 3, xx - Nya data i listvärdet 3 och resultatet lagras på variabel x och visas movinav2 4, xx - nytt datavärde 4 och det nya resultatet lagras på variabel x och visas 4 3 2.Deskription av funktionen movinavg variabel r - är r Esult den genomsnittliga listan som kommer att returneras variabel i - är indexvariabeln och den pekar på slutet av dellistan listan är medelvärdesvariabler z - en hjälparvariabel. Funktionen använder variabel i för att bestämma vilka värden i listan Kommer att övervägas i nästa genomsnittliga beräkning Vid varje iteration pekar variabeln i till det sista värdet i listan som kommer att användas i medelberäkningen Så vi behöver bara ta reda på vilka som kommer att vara det första värdet i listan Vanligtvis har vi att överväga p-element, så det första elementet kommer att vara det som indexeras av ip 1 Men vid de första iterationerna kommer denna beräkning vanligtvis att vara negativ, så följande ekvation kommer att undvika negativa index max ip 1,1 eller arrangera ekvationen, max ip , 0 1 Men antalet element på de första iterationerna kommer också att vara mindre, det korrekta värdet blir slutindex - börja index 1 eller ordna ekvationen, i - max ip, 0 1 1 och sedan i-max ip , 0 Variabel z har det gemensamma värdet max ip, 0 s o startindex kommer att vara z 1 och nummerfältet kommer att vara iz. mid list, z 1, iz kommer att returnera listan över värde som kommer att vara medelvärde summa summan iz ri kommer att genomsnittsa dem och lagra resultatet på lämpligt ställe i Resultatlistan. fp1 skapar en partiell applikation som fixar i det här fallet andra och tredje parametrar. Det kan vara om du tillämpar en vikt som är invers proportionell mot fönstret size. public class AverageCounter int RunningAvg int RunningCount Detta ersätter den cirkulära listan int WindowSize. public AverageCounter int windowSize WindowSize windowSize. public void AddValue float NewValue växa fönsterstorleken när fler prover spelas in om RunningCount WindowSize RunningCount. Rekursivt glidande medelvärde av W-1 W avg n-1 1 W prov där W är fönsterstorlek RunningAvg RunningCount - 1 RunningCount RunningAvg 1 RunningCount NewValue. public float Genomsnittlig avkastning RunningAvg .-- modifierad vid 13 53 fredag ​​9 november, 2007.pwasser 8-Jan-08 16 25.Den här formeln fungerar bra för att uppskatta rörliga medelvärdet så länge som några begränsningar hålls i åtanke. Det beräknar en uppskattning av det rörliga genomsnittet inte det verkliga rörliga genomsnittet baserat på det viktiga antagandet att provvärdena är Normalt fördelat på medelvärdet. Jag pekade på detta i en tidigare post. toadth 9-okt-11 15 46. Väl det var dumt var det inte.4 år på och jag kanske har ett bättre förslag Snarare än att använda en cirkellista, använd En länkad lista och manuellt behålla den maximala liststorleken På så sätt kan du hålla en sammanlagd löpande summa - när du lägger till i länklistan, lägg till aggregatet, när du trimmer en nod, dras det värdet från aggregatet för en genomsnittlig räknare med 5 noder, kanske du inte kommer att märka ap Förbättringsförbättring, men i många fall med tusentals noder det skulle hända.1 I AddValue-metoden lägger du till en ny länklista nod och lägger till i AVERAGE 2 Efter att du har lagt till, kontrollera storleken 3 Om storleken tröskeln drar av från AVERAGE och sedan Trimma av nod. För ännu mer effektivitet, istället för att använda länkad lista, kan du implementera din egen cirkulära lista baserat på en uppsättning av värdena - subtrahera från AVERAGE när du ersätter ett array värde. Marc Clifton 10-okt-11 1 37,4 år På och jag kanske har ett bättre förslag. Inneed, det skulle fungera bättre. Jag är inte certainn av den rätta lösningen men eftersom summering av genomsnittet för varje prov skulle införa en hel del avrundningsfel. Jag undrar om separering av fraktionerad del från hela delen skulle hjälpa att dela upp hela delen av varje nummer med räkningen Håll tre löpande summor 1 Medelantalet av hela delarna, 2 Återstoden av varje delning och 3 Den delade delen av varje nummer. Varje gång hela delen av en Numret är delad delas hela delresultatet till den genomsnittliga löpande summan och resten läggs till resten av löpande summan. När återstående löpande summa erhåller ett värde som är större än eller lika med räkningen divideras den med räkningen med hela delresultatet Läggs till den genomsnittliga löpande summan och resten läggs till återstående löpande summa. Vid varje beräkning läggs delningsdelen till fraktionell löpande summa. När medelvärdet är färdigt delas återstående löpande summa av räkningen och resultatet läggs till den genomsnittliga löpande summan som ett flytande tal. Exempelvis. Nu gör du vad som ska göras med den delade löpande summan. Risken för överflöde är mycket mindre sannolikt här, men ändå möjligt, så det enda sättet att hantera det skulle vara att dela delningen summan av räkningen i slutet och lägg till den i vårt resultat. Ett alternativ skulle vara att kolla den bråkdelade summan vid varje beräkning för att se om den är större än eller lika med räkningen. När det händer gör bara samma t Hing som vi gör med återstående löpande summan.

Comments