Esponenziale Mobile Media Filtro Algoritmo


È possibile implementare una media mobile in C senza la necessità di una finestra di campioni Ive pensa che si può ottimizzare un po ', scegliendo una dimensione della finestra thats di una potenza di due per consentire spostamento di bit invece di dividere, ma non necessitano un buffer sarebbe bello. C'è un modo per esprimere un nuovo risultato media mobile solo in funzione del vecchio risultato e il nuovo campione Definire un esempio media mobile, attraverso una finestra di 4 campioni essere: Aggiungere nuovo campione e: Una media mobile può essere implementato ricorsivamente , ma per un calcolo esatto della media mobile si deve ricordare il campione di ingresso più antico nella somma (cioè l'una nel tuo esempio). Per una media mobile lunghezza N si calcola: dove yn è il segnale di uscita e xn è il segnale di ingresso. Eq. (1) può essere scritta in modo ricorsivo come Quindi è sempre necessario ricordare il campione xn-N per calcolare (2). Come sottolineato da Corrado Turner, è possibile utilizzare un (infinitamente lungo) Finestra esponenziale, invece, che permette di calcolare l'uscita solo dall'uscita passato e l'ingresso corrente: ma questo non è uno standard (non ponderata) media mobile, ma un modo esponenziale ponderata media mobile, in cui i campioni ulteriormente in passato ottenere un peso minore, ma (almeno in teoria) non si scorda mai nulla (i pesi appena diventano più piccoli e più piccolo per i campioni di gran lunga in passato). Ho implementato una media mobile senza memoria singolo elemento di un programma di monitoraggio GPS che ho scritto. Comincio con 1 campione e dividere per 1 per ottenere la media corrente. Ho quindi aggiungere anothe campione e dividere per 2 il AVG corrente. Questo continua fino a ottenere la lunghezza della media. Ogni volta poi, aggiungo nel nuovo campione, ottenere la media e tolga la media del totale. Io non sono un matematico, ma questo sembrava un buon modo per farlo. Ho pensato che sarebbe girare lo stomaco di un vero e proprio ragazzo matematica, ma, si scopre che è uno dei modi accettati di farlo. E funziona bene. Basta ricordare che maggiore è la lunghezza più lento che sta seguendo ciò che si desidera seguire. Che non può importa la maggior parte del tempo, ma quando dopo i satelliti, se lento, il percorso potrebbe essere lontano dalla posizione attuale e sarà in cattiva luce. Si potrebbe avere un divario tra la SAT e i punti finali. Ho scelto una lunghezza di 15 aggiornato 6 volte al minuto per ottenere un'adeguata lisciatura e non troppo lontano dalla reale posizione con i puntini sentiero levigate sat. risposto 16 novembre 16 a 23:03 inizializzare totale 0, count0 (ogni volta che vede un nuovo valore Poi un ingresso (scanf), si aggiunge totalnewValue, un incremento (conteggio), una media divide (totalCount) Questa sarebbe una media mobile su tutti gli ingressi per calcolare la media nel corso solo gli ultimi 4 ingressi, richiederebbe 4 inputvariables, forse la copia di ogni ingresso a un vecchio inputvariable, quindi il calcolo della nuova media mobile. come somma dei 4 inputvariables, diviso per 4 (spostamento a destra 2 sarebbe bene se tutti gli ingressi sono stati positivi per fare il calcolo della media risposto 3 febbraio 15 a 4:06 che effettivamente calcolare la media totale e non la media mobile. Come conteggio diventa più grande l'impatto di ogni campione di ingresso nuovo diventa irrisorio ndash Hilmar febbraio 3 15 a 13:53 tua risposta 2017 Stack Exchange, IncIm codifica qualcosa nel momento in cui Im prendendo un gruppo di valori nel tempo da una bussola hardware. Questa bussola è molto accurata e aggiornamenti molto spesso, con la conseguenza che, se jiggles leggermente , io alla fine con il thats valore dispari selvaggiamente in contrasto con i suoi vicini. Voglio appianare quei valori fuori. Dopo aver fatto qualche lettura in giro, sembra che quello che voglio è un filtro passa-alto, un filtro passa-basso o una media mobile. media posso scendere con movimento, basta tenere una cronologia degli ultimi 5 valori o qualsiasi altra cosa, e utilizzare la media di quei valori a valle nel mio codice dove sono stato una volta solo usando il valore più recente. Questo dovrebbe, credo, appianare quei jiggles bene, ma mi sembra che la sua probabilmente abbastanza inefficiente, e questo è probabilmente uno di quei problemi noti per programmatori proprio a cui theres una soluzione veramente pulito intelligente Math. Sono, comunque, uno di quei programmatori autodidatti terribili senza uno straccio di istruzione formale in qualcosa anche vagamente correlate a CompSci o la matematica. Leggendo in giro un po 'suggerisce che questo potrebbe essere un filtro alto o passa-basso, ma non posso trovare qualche cosa che spiega in termini comprensibili ad un hack come me, quale sarà l'effetto di questi algoritmi sarebbe su un array di valori, per non parlare di come la matematica lavori. La risposta data qui. per esempio, fa tecnicamente rispondere alla mia domanda, ma solo in termini comprensibili a coloro che probabilmente già sapere come risolvere il problema. Sarebbe una persona molto bella e intelligente in effetti che potrebbe spiegare il tipo di problema si tratta, e come le soluzioni lavorare, in termini comprensibili a un laureato Arts. chiesto 21 settembre 10 alle 13:01 Se la media mobile deve essere lungo al fine di ottenere la lisciatura richiesto, e non avete veramente bisogno di alcuna particolare forma di kernel, poi tu sei meglio se si utilizza un diminuisce in modo esponenziale media mobile: dove scegliere piccolo per essere un costante appropriata (ad esempio, se si sceglie piccolo 1- 1N, avrà la stessa quantità di media come una finestra di dimensioni N, ma distribuita in modo diverso sui punti più anziani). In ogni caso, dal momento che il prossimo valore della media mobile dipende solo quello precedente ei dati, non dovete mantenere una coda o niente. E si può pensare a questo come fare qualcosa di simile, Bene, Ive ha ottenuto un nuovo punto, ma io non veramente fiducia, quindi ho intenzione di mantenere il 80 del mio vecchio stima della misura, e solo fiducia in questo nuovo punto di dati 20. Quello è più o meno lo stesso che dire, Beh, mi fido solo questo nuovo punto 20, e mal uso 4 altri punti che mi fido lo stesso importo, solo che invece di esplicitamente prendere gli altri 4 punti, sei partendo dal presupposto che la si media di fatto l'ultima volta era ragionevole in modo da poter utilizzare il lavoro precedente. risposto 21 settembre 10 alla 14:27 Hey, so che questo è di 5 anni di ritardo, ma grazie per una risposta impressionante. I39m lavorando su un gioco in cui il suono cambia, sulla base di velocità, ma a causa di eseguire il gioco su un computer lento-ass, la velocità sarebbe fluttuare selvaggiamente, che andava bene per la guida, ma super fastidioso in termini di suono. Questa è stata una soluzione molto semplice e poco costoso per qualcosa che ho pensato che sarebbe stato un problema molto complesso. ndash Adam 16 marzo 15 alle 20:20 Se si sta tentando di rimuovere il valore dispari occasionale, un filtro passa-basso è la migliore delle tre opzioni che avete identificato. filtri passa-basso consentono modifiche bassa velocità come quelle causate ruotando una bussola a mano, respingendo variazioni ad alta velocità come quelle causate da urti sulla strada, per esempio. Una media mobile probabilmente non sarà sufficiente, dal momento che gli effetti di una singola blip nei dati influenzeranno diversi valori successivi, a seconda della dimensione della finestra media mobile. Se vengono facilmente rilevati i valori dispari, si può anche essere meglio con un algoritmo problema tecnico-rimozione che li ignora completamente: Ecco un grafico per illustrare guick: Il primo grafico è il segnale di ingresso, con un difetto sgradevole. Il secondo grafico mostra l'effetto di una media mobile 10-campione. Il grafico finale è una combinazione della media 10-campione e l'algoritmo di rilevamento inconveniente semplice mostrato sopra. Quando viene rilevato il glitch, la media di 10 campioni è utilizzato al posto del valore effettivo. risposto 21 settembre 10 a 13:38 Bene spiegato, e punti fx per il grafico) ndash Henry Cooke 22 settembre 10 a 00:50 Wow. Raramente ho visto una bella risposta così ndash Mouse 4 giugno 13 a 9:14 La media mobile è un filtro passa-basso. ndash nomen 21 ottobre 13 ad 19:36 Prova una mediana runningstreaming invece. ndash kert 25 aprile 14 al 22:09 Media mobile posso scendere con. ma mi sembra che la sua probabilmente abbastanza inefficiente. C'è davvero alcun motivo di una media mobile dovrebbe essere inefficiente. Si mantiene il numero di punti di dati che si desidera in qualche tampone (come una coda circolare). Su ogni nuovo punto di dati, si pop il valore più vecchio e sottrarre da una somma, e spingere il più nuovo e aggiungerlo alla somma. Quindi ogni nuovo punto di dati realmente comporta solo poppush, una addizione ed una sottrazione. La vostra media mobile è sempre questa somma spostamento diviso per il numero di valori nel buffer. Si diventa un po 'più complicato se sei ricevere dati contemporaneamente da più thread, ma dal momento che i dati proviene da un dispositivo hardware che sembra assai dubbio per me. Oh, e anche: terribili programmatori autodidatti unire) La media mobile sembrava inefficiente perché si deve memorizzare un buffer di valori - meglio fare solo alcuni Clever matematica con il valore di ingresso e il valore di lavoro corrente penso that39s come media mobile esponenziale lavori. Un I39ve ottimizzazione visto per questo tipo di media mobile comporta l'uso di una coda di lunghezza fissa amp l'indicazione di dove ci si trova in quella coda, e solo avvolgendo il puntatore (con o se). Voila pushpop No costoso. Potere ai dilettanti, fratello ndash Henry Cooke 22 settembre 10 a 0:54 Henry: Per una media straight-up in movimento si ha bisogno semplicemente il buffer in modo da sapere quale valore viene spuntato quando il valore successivo ottiene spinto. Detto questo, la coda quotfixed lunghezza AMP A pointerquot si sta descrivendo è esattamente quello che volevo dire da queue. quot quotcircular That39s perché dicevo che isn39t inefficiente. Cosa hai pensato che volevo dire E se la vostra risposta è gamma quotan che sposta i suoi valori di nuovo su ogni removalquot indicizzato (come std :: vector in C). bene, allora, I39m così male ho don39t neanche voglia di parlare con te più) ndash Dan Tao 22 10 settembre a 1:58 Henry: Ho don39t so AS3, ma un programmer39s Java ottenuto collezioni come CircularQueue a disposizione hisher (I39m non un sviluppatore Java quindi I39m sicuro che ci sono esempi migliori là fuori that39s proprio quello che ho trovato da una rapida ricerca su Google), che implementa appunto la funzionalità we39re parlando. I39m abbastanza fiducioso la maggior parte dei linguaggi di medio e basso livello con le librerie standard di avere qualcosa di simile (ad esempio in there39s QueueltTgt). Comunque, ero filosofia me, quindi. tutto è perdonato. ndash Dan Tao 22 settembre 10 alle 12:44 una media mobile diminuisce in modo esponenziale può essere calcolato a mano con solo la tendenza se si utilizzano i valori corretti. Vedere fourmilab. chhackdiete4 per un'idea su come farlo rapidamente con carta e penna, se siete alla ricerca di media mobile esponenziale lisciato con 10 levigante. Ma dal momento che si dispone di un computer, è probabilmente vuole fare spostamento binario rispetto a decimale spostando) In questo modo, tutto ciò che serve è una variabile per il valore corrente e uno per la media. La media successivo può essere calcolata da questo. ha risposto 21 settembre 10 alla 14:39 ce n'è una tecnica chiamata un cancello gamma che funziona bene con i campioni spuri bassa occorrenza. ipotizzando l'utilizzo di una delle tecniche di filtro di cui sopra (media mobile, esponenziale), una volta che hai la storia sufficiente (una costante di tempo) è possibile testare il nuovo campione di dati in entrata per ragionevolezza, prima di essere aggiunto al calcolo. è richiesta una certa conoscenza del cambio di velocità di massimo ragionevole del segnale. il campione grezzo viene confrontato con il più recente valore livellato, e se il valore assoluto di questa differenza è maggiore del range consentito, il campione si lancia (o sostituito con qualche euristica, ad es. una previsione basata sul differenziale pendenza o la tendenza valore di previsione da doppia livellamento esponenziale) risponde 30 apr 16 anni al 6: algoritmo 56C per il valore zero latenza media mobile esponenziale Ultima modifica: 2012-08-13 Ive stato cercando di attuare un cut-off a bassa frequenza in c che prende essenzialmente un flusso di numeri e leviga fuori l'uscita (filtrando alta movementjitter frequenza), tuttavia è importante i numeri ponderati anteriori sono considerati immediatamente come i dati sono momento critico (che è quello di controllare una base simulazione movimento utilizzando output da un pò di software di gioco). Ive ha ottenuto un gruppo di lavoro mobile ponderata algoithm media ma potrebbe fare con qualcosa di un po 'più reattivo alla fine anteriore, e ho trovato questo: - La pseudo-codice vi è il seguente: Ingressi: Prezzo (NumericSeries), Periodo (NumericSimple) Variabili: factor (0), lag (0) se CurrentBar lt 1 poi iniziare fattore ZLEMA prezzo 2 (Period1) lag (Periodo-1) 2 fine altro iniziare fattore ZLEMA (2Price-Pricelag) (1-factor) fine ZLEMA1 Ive ha tradotto in a C e il codice è il seguente: Tuttavia, Non sembra comportarsi abbastanza aspettarsi Id. Sembra essere quasi arrivati, ma a volte ho un valore leggermente inferiore a tutti gli elementi nella coda (quando sono tutti superiori). La mia coda e il numero di elementi in essa contenuti vengono passati come parametri, con la più recente è al fronte in ogni momento, anche io passo un contatore di incremento a partire da 0, come richiesto dalla funzione. Non sono sicuro Ive interpretato il significato della ZLEMA1 correttamente come la sua non è chiaro nel suo pseudocodice, in modo da Ive presume che questa sia l'ultima chiamata zlema e anche Im assumendo il prezzo in realtà significa Price0. Forse Ive ha ottenuto questo torto dovrei essere la copia dei valori attuali zlema calcolato di nuovo alla mia coda originale prima della prossima chiamata io non modificare la coda originale a tutti gli altri che semplicemente spostando tutti i valori di uno fino alla fine e inserendo il più tardi all'inizio . Il codice che uso per fare questo è: sarebbe estremamente grato se qualcuno con una migliore comprensione della matematica potrebbe piacere sanity controllare questo per me per vedere se Ive ha ottenuto nulla Grazie leggermente sbagliato così tanto in anticipo se si può aiutare in primo luogo ringrazia tutti per il tuo contributo, molto apprezzato questo ha senso Credo, quindi suppongo quindi il meglio che posso sperare è semplicemente una media mobile esponenziale, accettando ci sarà un po 'di ritardo, ma questo sarà ridotto al minimo per la ponderazione anteriore più pesante dato in typcial ponderata media mobile ho questo algoritmo anche, ma un problema simile fatto che i valori non sembrano del tutto corretto (a meno che questa è la natura della formula). Per esempio, dire il mio array contiene 16 valori, tutti i 0,4775 - l'uscita è 0,4983, ma Id aspettiamo che sia 0,4775 Questo aspetto giusto per te. Media mobile esponenziale. float ema (float Vals, int numVals, int currentSample) fattore di flottante statica 0 statica galleggiante lastema 0 float ema se (currentSample lt 1) EMA vals0 fattore 2.0 (((float) numVals) 1.0) altro ema (fattore vals0) ((1.0 - fattore) lastema) lastema ema ema ritorno contrario, a volte l'uscita è inferiore a tutti e di ciascuno degli ingressi, anche se tutti sono più alti. Si chiama nello stesso modo come zlema (.) Di cui sopra, con un contatore di incremento. La formula e pseudocodice per questo sono qui: - autotradingstrategy. wordpress20091130exponential-movimento-media Grazie ancora, scuse per la mia incomprensione di alcuni dei principi fondamentali :( Cordiali saluti, Chris J Per quanto riguarda il codice che ho postato, hai ragione circa la dimensione della matrice situazione che dovrebbe essere facilmente determinato sia per le vostre domande:.. 1) La costante di filtro rappresenta un taglio della frequenza. Ho usato un Digital Signal Processing (DSP) per questa tecnica. en. wikipedia. orgwi Kilow-pas sFilter è una spiegazione semplice. Si desidera la sezione Realizzazione a tempo discreto. Nel mio caso la A è il RC-Constant si parla. Quindi la frequenza che disinserisce è superiore a 1 (2piA). Se non avete una comprensione della teoria nel dominio della frequenza, questo può complicarsi. Nel tuo caso, più alto si effettua una, più bassa è la frequenza che questo filtro permette, il che significa che si liscia la curva sempre di più. Più basso si fanno, più rumore che è consentito nel sistema. Ricordare Un must maggiore di o uguale a 1 per essere efficace. Ho riattaccato il XLS di nuovo, questa volta senza il cambio rand) numeri (. Regolare la Una costante e vedere come si quotsmoothsquot (o filtri) le variazioni ad alta frequenza. 2) L'ultimo punto della matrice di input ha il valore più recente. 3) Lo stesso vale per la matrice di uscita. L'ultimo è il valore più recente. 5) La NUMVALS è arbitrario. Puoi continuamente aggiungere ai ingresso e di uscita di matrice volte che youd come e wouldnt effettuare il filtro. In particolare, ho usato 49 punti. Ma posso facilmente cancellare l'ultimo 20 e le prime 29 uscite rimarrebbe la stessa. La funzione non è basata su quanti punti vengono utilizzati. Vorrei ricordare che ho sviluppato questa funzione per una conversione di una volta. Se si voleva fare una conversione per il valore successivo al volo si potrebbe provare qualcosa di più semplice (come allegato). Anche in questo caso arrugginito Im su c. Spero che questo sia giusto. L'unica cosa che si avrebbe bisogno di fornire è la costante di ingresso e il filtro. Fatemi sapere se questo helps. Is è possibile implementare una media mobile in C senza la necessità di una finestra di campioni Ive ha trovato che posso ottimizzare un po ', scegliendo una dimensione della finestra questo è una potenza di due per consentire bit-shifting invece di dividere, ma che non hanno bisogno di un buffer sarebbe bello. C'è un modo per esprimere un nuovo risultato media mobile solo in funzione del vecchio risultato e il nuovo campione Definire un esempio media mobile, attraverso una finestra di 4 campioni essere: Aggiungere nuovo campione e: Una media mobile può essere implementato ricorsivamente , ma per un calcolo esatto della media mobile si deve ricordare il campione di ingresso più antico nella somma (cioè l'una nel tuo esempio). Per una media mobile lunghezza N si calcola: dove yn è il segnale di uscita e xn è il segnale di ingresso. Eq. (1) può essere scritta in modo ricorsivo come Quindi è sempre necessario ricordare il campione xn-N per calcolare (2). Come sottolineato da Corrado Turner, è possibile utilizzare un (infinitamente lungo) Finestra esponenziale, invece, che permette di calcolare l'uscita solo dall'uscita passato e l'ingresso corrente: ma questo non è uno standard (non ponderata) media mobile, ma un modo esponenziale ponderata media mobile, in cui i campioni ulteriormente in passato ottenere un peso minore, ma (almeno in teoria) non si scorda mai nulla (i pesi appena diventano più piccoli e più piccolo per i campioni di gran lunga in passato). Ho implementato una media mobile senza memoria singolo elemento di un programma di monitoraggio GPS che ho scritto. Comincio con 1 campione e dividere per 1 per ottenere la media corrente. Ho quindi aggiungere anothe campione e dividere per 2 il AVG corrente. Questo continua fino a ottenere la lunghezza della media. Ogni volta poi, aggiungo nel nuovo campione, ottenere la media e tolga la media del totale. Io non sono un matematico, ma questo sembrava un buon modo per farlo. Ho pensato che sarebbe girare lo stomaco di un vero e proprio ragazzo matematica, ma, si scopre che è uno dei modi accettati di farlo. E funziona bene. Basta ricordare che maggiore è la lunghezza più lento che sta seguendo ciò che si desidera seguire. Che non può importa la maggior parte del tempo, ma quando dopo i satelliti, se lento, il percorso potrebbe essere lontano dalla posizione attuale e sarà in cattiva luce. Si potrebbe avere un divario tra la SAT e i punti finali. Ho scelto una lunghezza di 15 aggiornato 6 volte al minuto per ottenere un'adeguata lisciatura e non troppo lontano dalla reale posizione con i puntini sentiero levigate sat. risposto 16 novembre 16 a 23:03 inizializzare totale 0, count0 (ogni volta che vede un nuovo valore Poi un ingresso (scanf), si aggiunge totalnewValue, un incremento (conteggio), una media divide (totalCount) Questa sarebbe una media mobile su tutti gli ingressi per calcolare la media nel corso solo gli ultimi 4 ingressi, richiederebbe 4 inputvariables, forse la copia di ogni ingresso a un vecchio inputvariable, quindi il calcolo della nuova media mobile. come somma dei 4 inputvariables, diviso per 4 (spostamento a destra 2 sarebbe bene se tutti gli ingressi sono stati positivi per fare il calcolo della media risposto 3 febbraio 15 a 4:06 che effettivamente calcolare la media totale e non la media mobile. Come conteggio diventa più grande l'impatto di ogni campione di ingresso nuovo diventa irrisorio ndash Hilmar Febbraio 3 15 alle 13:53 La vostra risposta 2017 Stack Exchange, Inc

Comments