Forskaren och ingenjörsguiden till digital signalbehandling av Steven W. Smith, Ph. D. En enorm fördel med det glidande medelfiltret är att det kan implementeras med en algoritm som är mycket snabb. För att förstå denna algoritm, föreställ dig att du skickar en insignal, x, genom ett sjupunkts glidande medelfilter för att bilda en utsignal, y. Se nu hur två närliggande utgångspunkter, y 50 och y 51, beräknas: Dessa är nästan samma beräkningspunkter x 48 till x 53 måste läggas till y 50 och igen för y 51. Om y 50 redan har beräknats , det effektivaste sättet att beräkna y 51 är: När y 51 har hittats med y 50 kan y 52 beräknas från prov y 51 och så vidare. När den första punkten är beräknad i y, kan alla andra punkter hittas med endast ett enda tillägg och subtraktion per punkt. Detta kan uttryckas i ekvationen: Observera att denna ekvation använder två datakällor för att beräkna varje punkt i utgången: poäng från inmatningen och tidigare beräknade punkter från utgången. Detta kallas en rekursiv ekvation, vilket innebär att resultatet av en beräkning används i framtida beräkningar. (Termen rekursiv har också andra betydelser, särskilt i datavetenskap). Kapitel 19 diskuterar en rad olika rekursiva filter mer detaljerat. Var medveten om att det rörliga genomsnittliga rekursiva filtret är väldigt annorlunda än typiska rekursiva filter. I synnerhet har de flesta rekursiva filtren ett oändligt långt impulsrespons (IIR), som består av sinusoider och exponentiella. Impulssvaret för det rörliga genomsnittsvärdet är en rektangulär puls (finitivt impulsrespons eller FIR). Denna algoritm är snabbare än andra digitala filter av flera anledningar. För det första finns det bara två beräkningar per punkt, oberoende av längden på filterkärnan. För det andra är addition och subtraktion den enda matteoperationen som behövs, medan de flesta digitala filter kräver tidskrävande multiplikation. För det tredje är indexeringsschemat mycket enkelt. Varje index i ekv. 15-3 hittas genom att lägga till eller subtrahera heltalskonstanter som kan beräknas innan filtreringsstart (dvs p och q). Framförallt kan hela algoritmen utföras med heltalsrepresentation. Beroende på vilken maskinvara som används kan heltal vara mer än en storleksordning snabbare än flytpunkten. Överraskande fungerar heltalsrepresentation bättre än flytpunkt med denna algoritm, förutom att det blir snabbare. Avrundningsfelet från flytpunktsräkning kan ge oväntade resultat om du inte är försiktig. Tänk dig till exempel att en 10.000 provsignal filtreras med denna metod. Det sista provet i den filtrerade signalen innehåller det ackumulerade felet på 10 000 tillägg och 10 000 subtraheringar. Detta visas i utsignalen som en driftoffset. Helheter har inte detta problem eftersom det inte finns något avrundningsfel i aritmetiken. Om du måste använda flytpunkten med denna algoritm, visar programmet i tabell 15-2 hur du använder en dubbel precisionsackumulator för att eliminera denna drift. Jag har i huvudsak en uppsättning värden så här: Ovanstående array är översimplifierad, jag samlar 1 värde per millisekund i min riktiga kod och jag måste bearbeta utmatningen på en algoritm som jag skrev för att hitta den närmaste toppen före en tidpunkt. Min logik misslyckas eftersom i mitt exempel ovan är 0.36 den riktiga toppen, men min algoritm skulle se bakåt och se det sista numret 0,25 som toppen, eftersom det är en minskning till 0,24 före den. Målet är att ta dessa värden och tillämpa en algoritm för dem som släpper ut dem lite så att jag har mer linjära värden. (dvs: Jag tycker att mina resultat är kurva, inte jaggediga) Jag har blivit tillsagd att tillämpa ett exponentiellt glidande medelfilter till mina värden. Hur kan jag göra det här Det är verkligen svårt för mig att läsa matematiska ekvationer, jag hanterar mycket bättre med kod. Hur bearbetar jag värden i min array, tillämpar en exponentiell glidande medelberäkning för att jämföra dem ut frågade feb 8 12 kl 20:27 för att beräkna ett exponentiellt glidande medelvärde. du behöver behålla en del tillstånd och du behöver en inställningsparameter. Detta kräver en liten klass (förutsatt att du använder Java 5 eller senare): Instantiate with decay parameteren du vill ha (det kan ta tuning ska vara mellan 0 och 1) och sedan använda genomsnittet () för att filtrera. När du läser en sida om någon matematisk återkommande, behöver allt du verkligen vet när du gör det till kod, att matematiker gillar att skriva index i arrays och sekvenser med prenumerationer. (Theyve några andra noteringar också, vilket inte hjälper.) EMA är dock ganska enkel eftersom du bara behöver komma ihåg ett gammalt värde, inga komplicerade tillståndsskivor krävs. svarat 8 feb 12 kl 20:42 TKKocheran: Ganska mycket. Det är inte bra när saker kan vara enkla (Om du börjar med en ny sekvens, få en ny medelvärde.) Observera att de första villkoren i den genomsnittliga sekvensen kommer att hoppa runt lite på grund av gränseffekter, men du får de med andra glidande medelvärden för. En bra fördel är dock att du kan förflytta den glidande genomsnittliga logiken till medelvärdena och experimentera utan att störa resten av ditt program för mycket. ndash Donal Fellows Feb 9 12 på 0:06 Jag har svårt att förstå dina frågor, men jag kommer att försöka svara ändå. 1) Om din algoritm hittat 0,25 istället för 0,36, då är det fel. Det är fel eftersom det förutsätter en monotonisk ökning eller minskning (det går alltid upp eller går alltid ner). Om du inte genomsnittar ALLA dina data, dina datapunkter --- som du presenterar dem --- är olinjära. Om du verkligen vill hitta det maximala värdet mellan två punkter i tid, skivar du din matris från tmin till tmax och hittar maximal av den subarrayen. 2) Nu är begreppet glidande medelvärden mycket enkelt: tänk att jag har följande lista: 1,4, 1,5, 1,4, 1,5, 1,5. Jag kan släta ut det genom att ta medeltalet av två nummer: 1,45, 1,45, 1,45, 1,5. Observera att det första numret är medeltalet 1,5 och 1,4 (andra och första siffror) den andra (nya listan) är genomsnittet av 1,4 och 1,5 (tredje och andra gamla listan) den tredje (nya listan) i genomsnitt 1,5 och 1,4 (fjärde och tredje), och så vidare. Jag kunde ha gjort det period tre eller fyra, eller n. Lägg märke till hur dataen är mycket mjukare. Ett bra sätt att se glidande medelvärden på jobbet är att gå till Google Finance, välj ett lager (försök Tesla Motors ganska flyktiga (TSLA)) och klicka på technicals längst ner i diagrammet. Välj Flytta genomsnittet med en given period och Exponentiell glidande medelvärde för att jämföra deras skillnader. Exponentiellt glidande medelvärde är bara en annan utarbetande av detta, men vikter äldre data mindre än de nya data så är det ett sätt att förspänna utjämningen mot baksidan. Vänligen läs Wikipedia-posten. Så det här är mer en kommentar än ett svar, men den lilla kommentarrutan var bara för liten. Lycka till. Om du har problem med matte kan du gå med ett enkelt rörligt medel istället för exponentiellt. Så den produkt du får är de sista x-termerna dividerad med x. Obestämd pseudokod: Observera att du måste hantera start - och slutdelarna av data eftersom det klart är att du inte kan räkna med de senaste 5 termerna när du befinner dig på din andra datapunkt. Det finns också mer effektiva sätt att beräkna detta glidande medelvärde (summa summan - äldsta nyaste), men det här är att få konceptet av vad som händer över. svarat 8 februari 12 kl 20: 41I statistik är ett enkelt glidande medelvärde en algoritm som beräknar det obegripade medelvärdet av de sista n-proverna. Parametern n kallas ofta fönsterstorleken, eftersom algoritmen kan anses som ett fönster som glider över datapunkterna. Genom att använda en rekursiv formulering av algoritmen reduceras antalet operationer som krävs per prov till en addition, en subtraktion och en division. Eftersom formuleringen är oberoende av fönsterstorleken n. runtime komplexiteten är O (1). d. v.s. konstant. Den rekursiva formeln för det obegripade glidande medlet är, där avg är det rullande medelvärdet och x representerar en datapunkt. Så, när fönstret glider åt höger, faller en datapunkt, svansen ut och en datapunkt, huvudet rör sig in. Implementering En implementering av det enkla glidande medlet måste ta hänsyn till följande Algoritminitialisering Så länge som Fönstret är inte fullt befolket med värden, den rekursiva formeln misslyckas. Lagring Tillgång till svanselementet krävs, vilket beroende på implementeringen kräver lagring av n-element. Min implementering använder den presenterade formeln när fönstret är helt befolket med värden och annars växlar till formeln, som uppdaterar medelvärdet genom att beräkna summan av de föregående elementen. Observera att detta kan leda till numeriska instabiliteter på grund av flytande punkträkning. När det gäller minneskonsumtion använder implementeringen iteratorer för att hålla reda på huvud och svanselement. Detta leder till en implementering med konstanta minneskrav oberoende av fönsterstorleken. Här är uppdateringsproceduren som glider fönstret till höger. I de flesta samlingarna ogiltigförklaras deras uppräknare när den underliggande samlingen är modifierad. Implementeringen beror emellertid på giltiga uppräknare. Speciellt i strömmande applikationer behöver den underliggande samlingen ändras när ett nytt element kommer fram. Ett sätt att hantera det är att skapa en enkel cirkulär faststorleksamling av storlek n1 som aldrig ogiltiggör dess iteratorer och växelvis tillägga ett element och ringa Skift. Jag önskar att jag kunde ta reda på hur man faktiskt genomför detta, eftersom testfunktionen är mycket förvirrande för mig8230 Behöver jag konvertera data till Array, kör sedan SMA SMA SMA (20, array) för en 20-årig SMA Hur hanterar jag? shift () funktion Är det nödvändigt att implementera konstruktörer. (förlåt för förvirring). Nej, du don8217t behöver konvertera dina data till en array så länge som dina data implementerar IEnumerable1 och den uppräknade typen är dubbel. Vad beträffar din privata meddelandehantering måste du konvertera DataRow till något som är uppräkningsbart för dubbla värden. Ditt tillvägagångssätt fungerar. Skift, glider fönstret ett läge till vänster. För en dataset med säg 40 värden och en 20-årig SMA har du 21 positioner som fönstret passar in (40 8211 20 1). Varje gång du ringer Skift () flyttas fönstret till vänster av en position och Average () returnerar SMA för det aktuella fönstret. Det vill säga det obegripade genomsnittet av alla värden inuti fönstret. Dessutom tillåter min implementering att beräkna SMA även om fönstret inte är fullt fyllt i början. Så i huvudsak hoppas det här hjälper. Några ytterligare frågor COPYRIGHT MEDDELANDE Christoph Heindl och cheind. wordpress, 2009-2012. Otillåten användning och / eller duplicering av detta material utan uttryckligt och skriftligt tillstånd från denna blogg är författare andor ägare strängt förbjudet. Utdrag och länkar kan användas, förutsatt att fullständig och tydlig kredit ges till Christoph Heindl och cheind. wordpress med lämplig och specifik riktning till det ursprungliga innehållet. Nya Inlägg
No comments:
Post a Comment