Glidande Medelvärde Filter I C Kod


Är det möjligt att implementera ett glidande medelvärde i C utan att det behövs ett fönstersamtal Ive har funnit att jag kan optimera lite genom att välja en fönsterstorlek som är en kraft av två för att tillåta bitskiftning istället för att dela men behöver inte en buffert skulle vara trevligt. Finns det ett sätt att uttrycka ett nytt glidande medelresultat endast som en funktion av det gamla resultatet och det nya provet Definiera ett exempel glidande medelvärde, över ett fönster med 4 prov att vara: Lägg till nytt prov e: Ett glidande medel kan implementeras rekursivt , men för en exakt beräkning av glidande medelvärde måste du komma ihåg det äldsta inmatningsprovet i summan (dvs. a i ditt exempel). För ett längd N rörligt medelvärde beräknar du: var yn är utsignalen och xn är ingångssignalen. Eq. (1) kan skrivas rekursivt som Så du måste alltid komma ihåg provet xn-N för att beräkna (2). Som påpekat av Conrad Turner kan du använda ett (oändligt långt) exponentiellt fönster istället, vilket gör det möjligt att beräkna utmatningen endast från tidigare utmatning och aktuell ingång: men det här är inte ett vanligt (obetydligt) glidande medelvärde men exponentiellt viktade glidande medelvärde, där prov i det förflutna får en mindre vikt, men (åtminstone teoretiskt) glömmer du aldrig någonting (vikterna blir bara mindre och mindre för prover långt ifrån). Jag implementerade ett glidande medelvärde utan individuellt objektminne för ett GPS-spårningsprogram som jag skrev. Jag börjar med 1 prov och dela med 1 för att få nuvarande avg. Sedan lägger jag till ett exempel och delar upp med 2 till den nuvarande avg. Detta fortsätter tills jag når längden på medeltalet. Varje gång efteråt lägger jag till i det nya provet, får medelvärdet och tar bort det genomsnittet från summan. Jag är inte matematiker men det verkade som ett bra sätt att göra det. Jag tänkte att det skulle vända på magen på en riktig matte kille men det visar sig att det är ett av de accepterade sätten att göra det. Och det fungerar bra. Kom bara ihåg att ju högre längden desto långsammare följer du vad du vill följa. Det kan inte ha betydelse för det mesta, men när du följer satelliter, kan du vara långsiktig, om det är långt ifrån det faktiska läget och det kommer att se dåligt ut. Du kan ha ett mellanrum mellan mitten och de efterföljande prickarna. Jag valde en längd på 15 uppdaterad 6 gånger per minut för att få tillräcklig utjämning och inte komma för långt från den faktiska lätta positionen med de släta spårpunkterna. svarat 16 november 16 kl 23:03 initialisera totalt 0, count0 (varje gång vi ser ett nytt värde) Då en inmatning (scanf), en lägg till totalnevValue, en ökning (räkning), en delningsgenomsnitt (totalantal) Detta skulle vara ett glidande medelvärde över alla ingångar För att beräkna medelvärdet över endast de senaste 4 ingångarna, skulle det behöva 4 ingångsvariabler, kanske kopiering av varje ingång till en äldre ingångsvariabel och sedan beräkning av det nya glidande medlet. Som summan av de fyra ingångsvariablerna dividerat med 4 (höger skift 2 skulle vara bra om alla ingångar var positiva för att få den genomsnittliga beräkningen besvarad 3 feb 15 kl 4:06 som faktiskt kommer att beräkna det totala genomsnittet och INTE det rörliga genomsnittet. När räkningen blir större blir effekten av ett nytt ingångsprov försvinnande liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, Inc Jag vet att detta kan uppnås med boost enligt: ​​Men jag vill verkligen undvika att använda boost. Jag har googled och inte hittat några lämpliga eller läsbara exempel. I grund och botten vill jag spåra rör på sig Medelvärdet av en pågående ström av en ström av flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Vad är det enklaste sättet att uppnå detta jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov bäst. Frågade 12 juni 12 kl 4:38 Om dina behov är enkla kan du bara försöka använda ett exponentiellt glidande medelvärde. Enkelt, du gör en ackumulatorvariabel, och när din kod tittar på varje prov uppdateras koden med ackumulatorn med det nya värdet. Du väljer en konstant alfa som ligger mellan 0 och 1 och beräknar det här: Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för cirka 1000 prover. Hmm, jag är inte säker på att det här passar dig, nu när jag har lagt den här. Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida genomsnittet över de senaste 1000 siffrorna, utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, är det här ett mycket enkelt och snabbt sätt att göra det. Svarade 12 jun 12 kl 4:44 1 på ditt inlägg. Det exponentiella glidande medlet kan tillåta att alfabetet är variabelt. Så det här låter det användas för att beräkna tidbasvärdena (t ex byte per sekund). Om tiden sedan den senaste ackumulatorns uppdatering är mer än 1 sekund, låter du alfa vara 1,0. Annars kan du låta alpha vara (usecs sedan senaste uppdateringen1000000). ndash jxh Jun 12 12 at 6:21 I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 numren som ett dataprov. Observera att nedanstående uppdaterar summan som element som läggs till, vilket undviker kostnadskrävande O (N) - korsning för att beräkna summan som behövs för genomsnittet - efterfrågan. Totalt görs en annan parameter från T för att stödja t. ex. Använder en lång lång när totalt 1000 lång s, ett int för char s, eller en dubbel till totalt float s. Det här är lite bristfälligt, eftersom numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long. eller använd en extra bool data medlem för att spela in när behållaren fylls första gången medan cykeltalsprover runt arrayen (bäst omnämndes något oskadd som pos). svarade den 12 juni 12 kl 5:19 antar man att kvoträttsoperatören (T-prov) citationstecken är faktiskt quotvoid operatorltlt (T-prov) citat. Ndash oPless 8 juni 14 kl 11:52 oPless ahhh. Välspotted. egentligen menade jag att det skulle vara tomt operatör () (T-prov) men självklart kan du använda vilken anteckning du helst tyckte. Kommer att fixa, tack. ndash Tony D Jun 8 14 at 14:27As andra har nämnt, bör du överväga ett filter för IIR (oändligt impulssvar) istället för det FIR (ändliga impulssvar) filtret du använder nu. Det finns mer till det, men vid första anblicken implementeras FIR-filter som uttryckliga omvälvningar och IIR-filter med ekvationer. Det speciella IIR-filtret som jag använder mycket i mikrokontroller är ett enkeltpoligt lågpassfilter. Detta är den digitala motsvarigheten till ett enkelt R-C-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 stött på är ett resultat av att någon inte uppmärksammar sig i digital signalbehandlingsklass, 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 enkelspalt lågpassfilter bättre. Det bästa sättet att implementera en digitalt i en mikrokontroller är vanligtvis: FILT lt-- FILT FF (NEW - FILT) FILT är en del av kvarhållande tillstånd. Detta är den enda beständiga variabeln du behöver för att beräkna detta filter. NEW är det nya värdet som filtret uppdateras med denna iteration. FF är filterfraktionen. vilket justerar filtrets tyngd. 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 alls eftersom utmatningen bara följer ingången. Användbara värden är däremellan. På små system väljer du FF att vara 12 N så att multiplikationen med FF kan utföras som en rätt skift med N bitar. FF kan till exempel vara 116 och multiplicera med FF därför en högerväxling av 4 bitar. Annars behöver det här filtret endast en subtrahera och en tillägg, även om siffrorna vanligtvis behöver vara bredare än ingångsvärdet (mer om 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å R-C-filter i serie och dämpas med 12 dBoctave ovanför rullningsfrekvensen. 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 ändras. För att underlätta utformningen av dessa filter (vilket bara betyder att välja FF och bestämma hur många av dem som ska kaskad) använder jag mitt program FILTBITS. Du anger antalet skiftbitar för varje FF i den kaskadade serien med filter, och det beräknar stegsvaret och andra värden. Faktum är att jag brukar köra detta via mitt wrapper script PLOTFILT. Det här körs FILTBITS, vilket 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 typen som beskrivits ovan. Värdena på 4 anger antalet skiftbitar för att inse multipliceringen med FF. De två FF-värdena är därför 116 i detta fall. Det röda spåret är enhetens stegsvar, och är det viktigaste att titta på. Detta säger till exempel 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 fullamplitudspik. 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 detta filter gör med vitt brus. Det här är inte ett noggrant 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. Dess enda för att ge dig en grov känsla av hur mycket det kommer att squashed och hur smidig det är. PLOTFILT, kanske FILTBITS, och massor av andra användbara saker, speciellt för PIC-firmwareutveckling finns i programvarulicens för PIC Development Tools på min nedladdningssida för program. Tillagt om numerisk precision jag 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 multipliceringen med FF kommer att skapa logg 2 (FF) nya bitar under binärpunkten. På små system är FF vanligen valt att vara 12 N så att denna multiplication faktiskt realiseras av en rättväxling av N bitar. FILT är därför vanligtvis ett fast punkts 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 116) behöver du 4 fraktion bitar under 10 bitars heltal AD-värden. En av de flesta processorer, 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-avläsningarna vänster skiftad med 4 bitar. Processorn känner inte 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 fast punkt). I allmänhet behöver 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å behöva ha 1044 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 skulle bara den andra polen av två behöva 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. Vanligtvis 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 för det specifika projektet. I vilket fall som helst använder jag en del repetillstånd för att skicka NEW till subrutinemacroen, som uppdaterar FILT, men laddar också in i samma skrapläge NYHET var in. Det gör det enkelt att tillämpa flera poler eftersom den uppdaterade filmen av en pol är den nya av nästa. När en subrutin är användbar för att få en pekare till FILT på vägen in, som uppdateras till strax efter FILT på väg ut. På så sätt 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 vid varje iteration. Kodsexempel Här ä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: Båda dessa exempel implementeras som makron med min PIC assembler preprocessor. 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 firmware. Du kan skriva en enkelpolig lågpassfilter subrutin en gång och applicera den flera gånger. Faktum är att jag vanligtvis skriver en sådan subrutin för att ta en pekare i minnet till filtertillståndet, sedan få det förbi pekaren så att det kan kallas i följd lätt för att realisera flerpoliga filter. Ndash Olin Lathrop Apr 20 12 på 15:03 1. Tack så mycket för dina svar - alla av dem. Jag bestämde mig 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 dessa värdena har mycket olika dimensioner beroende på maskinvaran ville jag ta ett genomsnitt för att kunna reagera på dessa maskinvarespecifika ändringar automatiskt. ndash sensslen 21 maj 12 kl 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 göras på en lågpresterande mikro med ingen dedikerad delning eftersom det kan göras som en bitskift. Varje växlingsrätt är en kraft av två t. ex.: OP-enheten trodde att han hade två problem, delade i en PIC16 och minne för hans ringbuffert. Detta svar visar att uppdelningen inte är svår. Visserligen behandlar det inte minnesproblemet, men SE-systemet tillåter partiella svar, och användare 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 delningsoperation är de likaledes ofullständiga eftersom de inte visar hur man effektivt uppnår detta på en PIC16. ndash Martin Apr 20 12 at 13:01 Det finns ett svar för ett riktigt glidande medelfilter (aka boxcar filter) med mindre minne krav, om du inte har något emot downsampling. Dess kallas ett kaskad integratorkamfilter (CIC). Tanken är att du har en integrator som du tar skillnader över över en tidsperiod, och den viktigaste minnesbesparande enheten är att genom nedsampling behöver du inte lagra alla värden på integratorn. Det kan implementeras med hjälp av följande pseudokod: Din effektiva glidande medellängd är decimationFactorstatesize, men du behöver bara behålla programpunkter med stateize. Självklart kan du få bättre prestanda om din stateize och decimationFactor är krafter på 2, så att divisionen och återstående operatörer blir ersatta 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 en boxkarters frekvens-nuller, kommer ett 1-poligt eller 2-poligt lågpassfilter troligen att fungera bra. Å andra sidan, om du filtrerar i syfte att decimera (med en högprovsränta inmatning och medelvärdet för att användas av en lågprocess) kan ett CIC-filter vara precis vad du letar efter. (speciellt om du kan använda stateize1 och undvika ringbufferten helt och hållet med bara ett enda tidigare integratorvärde) Det finns en djup analys av matematiken bakom användningen av det första ordningens IIR-filter som Olin Lathrop redan har beskrivit över på Digital Signal Processing stack exchange (innehåller massor av vackra bilder.) Ekvationen för detta IIR-filter är: Detta kan implementeras med bara heltal och ingen delning med följande kod (kan behöva lite felsökning när jag skriver från minnet.) Detta filter approximerar ett glidande medelvärde av de sista K-proverna genom att ange värdet av alfa till 1K. 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 set BITS till 2, etc. (Jag bekräftar koden som anges här så snart jag får en ändring och redigera det här svaret om det behövs.) svarat den 23 juni kl 12:04 Hittar ett enkelpoligt lågpassfilter (glidande medelvärde, med cutoff-frekvens CutoffFrequency). Mycket enkelt, väldigt snabbt, fungerar bra och nästan inget minne överhuvudtaget. Obs! Alla variabler har räckvidd bortom filterfunktionen, förutom det som passerat i newInput Note: Detta är ett enstegsfilter. Flera steg kan kaskadas tillsammans för att öka filterets skärpa. Om du använder mer än ett steg måste du justera DecayFactor (som gäller Cutoff-Frequency) för att kompensera. Och självklart allt du behöver är de två linjerna placerade någonstans, de behöver inte sin egen funktion. Detta filter har en ramp-up tid innan det glidande medelvärdet representerar det för ingångssignalen. Om du behöver förbi denna ramp-up-tid 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. (CutoffFrequencySampleRate) har ett intervall mellan 0 och 0,5. DecayFactor är ett värde mellan 0 och 1, vanligen nära 1. Envärdig flotta är tillräckligt bra för de flesta saker, jag föredrar bara dubblar. 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 byta till höger som nämnare snarare än att dela upp under filterslingan). Om du exempelvis använder DecayFactor 0.99 och du vill använda heltal kan du ange 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 online, kapitel 19 om rekursiva filter: dspguidech19.htm 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, vi kan säga att du vill ha det föregående, cirka 6 objekt i genomsnitt, gör det diskret, youd lägg till 6 objekt och dela med 6, så Du kan ställa in AmplitudeFactor till 16 och DecayFactor till (1.0 - AmplitudeFactor). Svarade 14 maj 12 kl 22:55 Alla andra har kommenterat grundligt om nyttan av IIR vs FIR, och på power-of-two division. Jag gillar bara att ge några detaljer om genomförandet. Nedan fungerar bra på små mikrokontroller utan FPU. Theres ingen multiplikation, och om du behåller N en kraft av två, är hela uppdelningen bit-shifting med en cykel. Grundläggande FIR-ringbuffert: Håll en löpbuffert med de sista N-värdena och en kör 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 SUMN. Modifierad IIR ringbuffert: Håll igång SUM av de sista N-värdena. Varje gång ett nytt prov kommer in, SUM - SUMN, lägg till i det nya provet och mata ut SUMN. besvarad 28 aug 13 kl 13:45 Om jag läser dig rätt, beskriver du ett första-order IIR-filter, det värde som du subtraherar är det ä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 utsignalen är densamma för alla periodiska signaler. Vid en provkvot på 10 kHz matar 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 order IIR filter. ndash supercat Aug 28 13 på 15:31 kommer att ge en våg som kraftigt börjar stiga och gradvis nivåer nära (men inte vid) inmatnings maximalt, så börjar det kraftigt och faller gradvis av nära (men inte vid) inmatningsminimum. Mycket annorlunda beteende. Ndash 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. Scott Scott Seidman Aug 29 13 på 13:50 ScottSeidman: Inget behov av multiplicerar om man helt enkelt har varje steg i FIR-enheten, antingen matar in genomsnittet av inmatningen till det aktuella läget och dess tidigare lagrade värde och lagrar sedan inmatningen (om man har det numeriska området, man kan använda summan snarare än genomsnittet). Huruvida det är bättre än ett lådfilter beror på applikationen (stegresponsen av ett lådfilter med en total fördröjning på 1 ms, till exempel, kommer att ha en otäck d2dt-spik när ingången ändras och igen 1 m senare men kommer att ha det minsta möjligt ddt för ett filter med totalt 1 ms fördröjning). ndash supercat Aug 29 13 vid 15:25 Som mikeselektrisk material sa, om du verkligen behöver minska dina minnesbehov och du inte har något emot att ditt impulsrespons är exponentiellt (istället för en rektangulär puls) skulle jag gå för ett exponentiellt glidande medelfilter . Jag använder dem i stor utsträckning. Med den typen av filter behöver du ingen buffert. Du behöver inte lagra N tidigare prover. Bara en. Så, dina minneskrav får skära ner med en faktor N. Dessutom behöver du ingen delning för det. Endast multiplikationer. Om du har tillgång till flytande punkträkning, använd flytande punktmultiplikationer. Annars gör du multipelantal och går till höger. Vi är dock 2012, och jag rekommenderar dig att använda kompilatorer (och MCU) som låter dig arbeta med flytande punktnummer. Förutom att vara mer minneseffektivt och snabbare (du behöver inte uppdatera objekt i någon cirkulär buffert), skulle jag säga att det också är mer naturligt. eftersom ett exponentiellt impulsrespons matchar bättre hur naturen beter sig, i de flesta fall. svarat 20 april 12 kl 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 biastruncation). förutsatt att N är en kraft av två, och endast heltalsräkning används, eliminerar växlingsrätten systematiskt LSB: erna i det nya provet. Det betyder att hur länge seriet någonsin kan vara, kommer genomsnittet aldrig att ta hänsyn till dem. Antag till exempel en långsamt 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 historia för 6, etc. Tänk nu på motsatsen. serien går upp. Medelvärdet kommer att förbli på 7 för alltid, tills provet är stort nog för att få det att förändras. Naturligtvis kan du korrigera för bias genom att lägga till 12N2, men det går inte att lösa precisionsproblemet. i så fall kommer den minskande serien att stanna för alltid vid 8 tills provet är 8-12 (N2). För N4 till exempel behåller något prov över noll genomsnittet oförändrat. Jag tror att en lösning för det skulle innebära att en ackumulator av de förlorade LSB: erna finns. 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 nyttan av detta Det kan sträcka sig från en enkel medelvärde av n-värden till ett exponentiellt medelvärdefilter till ett mer sofistikerat filter som arbetar med frekvenser. Mer sofistikerade versioner av lågpassfilter kan skapas genom att konvertera elektroniska lågpassfilter som används vid digital signalbehandling (som Butterworth-filter etc.) Jag hittade att denna webbplats skulle innehålla mycket resurser på digital signalbehandling (The Scientist and Engineer039s Guide Till digital signalbehandling). Första exemplet är ett glidande medelfilter, nästa är ett rekursivt filter följt av ett exempel på hur man skapar ett lågpassfilter med en cutoff-frekvens, givet en samplingsfrekvens och en filterkonstant RC, motiverad av lågpassbeteendet eller RC-kretsen . Kom bara ihåg: Genomsnittet för tidsdomäner kommer att röra med frekvensdomänrepresentationen, och frekvensdomänfiltrering kommer att röra med tidsdomänrepresentationen. Så ett filter som arbetar på tidsdomänen resulterar i ett icke-användbart frekvenssvar eftersom filter039s egen 039signal039 har blivit konvolverad med den aktuella signalen. Å andra sidan, om du tar bort högfrekventa ljud i frekvensdomänen, förvänta dig inte att se en smidig signal i tidsdomänen. PS: Gör aldrig båda. Aldrig någonsin göra frekvens cutoff följt av medelvärdet i tidsdomänen (eller vice versa) såvida inte. det finns inget annat alternativ (som vanligtvis finns) 14.7k Visningar mitten Visa Upphöjda mitten Inte för reproduktion

Comments

Popular posts from this blog

Handels Binary Alternativ On Mt4

Spartan Forex Handel Rum Inspelningar Of Hundar

Alternativ Trading Historia