Friday 1 September 2017

Moving Media Recursive Implementazione


La Guida scienziato e ingegneri per Digital Signal Processing di Steven W. Smith, Ph. D. Un enorme vantaggio del filtro media mobile è che può essere implementato con un algoritmo che è molto veloce. Per capire questo algoritmo, immaginare passando un segnale di ingresso, x, attraverso un sette punti movimento filtro a media per formare un segnale di uscita, y. Ora guardiamo a come due punti di uscita adiacenti, y 50 y 51, sono calcolati: Questi sono quasi gli stessi punti di calcolo x 48 x 53 attraverso deve essere aggiunto per y 50, e di nuovo per y 51. Se y 50 è già stato calcolato , il modo più efficiente per calcolare y 51 è: Una volta y 51 è stato trovato utilizzando y 50, allora y 52 può essere calcolato dal campione y 51, e così via. Dopo il primo punto è calcolato in y, tutti gli altri punti possono essere trovati con un solo addizione e sottrazione per punto. Questo può essere espressa dalla formula: Si noti che questa equazione utilizzare due fonti di dati per calcolare ciascun punto nell'output: punti dall'ingresso e punti precedentemente calcolati dall'output. Questo è chiamato un equazione ricorsiva, il che significa che il risultato di un calcolo viene utilizzato nei calcoli futuri. (Il termine ricorsiva ha anche altri significati, soprattutto in informatica). Capitolo 19 illustra una varietà di filtri ricorsivi in ​​maggior dettaglio. Essere consapevoli del fatto che il filtro ricorsivo media mobile è molto diverso dai filtri tipici ricorsivi. In particolare, la maggior parte dei filtri ricorsivi hanno una risposta infinitamente lunga di impulso (IIR), composto da sinusoidi ed esponenziali. La risposta all'impulso della media mobile è un impulso rettangolare (risposta all'impulso finita, o FIR). Questo algoritmo è più veloce di altri filtri digitali per diversi motivi. Innanzitutto, ci sono solo due calcoli per punto, indipendentemente dalla durata del kernel filtro. In secondo luogo, l'aggiunta e la sottrazione sono le uniche operazioni matematiche necessarie, mentre la maggior parte dei filtri digitali richiedono tempo moltiplicazione. In terzo luogo, il sistema di indicizzazione è molto semplice. Ogni indice in Eq. 15-3 è trovato aggiungendo o sottraendo costanti intere che possono essere calcolati prima dell'inizio di filtraggio (cioè P e Q). Quarto, l'intero algoritmo può essere effettuata con rappresentazione intera. A seconda dell'hardware utilizzato, interi possono essere più di un ordine di grandezza più veloce di virgola mobile. Sorprendentemente, rappresentazione intera funziona meglio di virgola mobile con questo algoritmo, oltre ad essere più veloce. L'errore di arrotondamento da aritmetica in virgola mobile può produrre risultati imprevisti se non si sta attenti. Ad esempio, immaginare un segnale di 10.000 campione che viene filtrato con questo metodo. L'ultimo campione del segnale filtrato contiene l'errore accumulato di 10.000 addizioni e sottrazioni 10.000. Ciò appare nel segnale di uscita come un offset deriva. I numeri interi non hanno questo problema, perché non vi è alcun errore di arrotondamento in aritmetica. Se è necessario utilizzare in virgola mobile con questo algoritmo, il programma in Tabella 15-2 mostra come usare un doppio accumulatore di precisione per eliminare questo drift. I essenzialmente avere una matrice di valori come questo: La matrice di cui sopra è Semplificando al massimo, Im raccolta 1 Valore per millisecondo nel mio codice vero e ho bisogno di elaborare l'uscita su un algoritmo che ho scritto per trovare il picco più vicino prima di un punto nel tempo. La mia logica non è riuscito perché nel mio esempio precedente, 0,36 è il vero picco, ma il mio algoritmo sarebbe guardare indietro e vedere l'ultimo numero di 0,25 come il picco, come theres una diminuzione di 0,24 prima di esso. L'obiettivo è quello di prendere questi valori e applicare un algoritmo per loro che li appianare un po 'in modo da avere i valori più lineare. (Vale a dire: Id come i miei risultati siano sinuosa, non jaggedy) Ive stato detto di applicare un filtro a media mobile esponenziale a miei valori. Come posso fare questo la sua davvero difficile per me leggere equazioni matematiche, ho a che fare molto meglio con il codice. Come faccio a dei valori di processo nella mia matrice, l'applicazione di un calcolo della media mobile esponenziale a pareggiare fuori chiesto 8 febbraio 12 a 20:27 Per calcolare una media mobile esponenziale. è necessario mantenere uno stato in giro e avete bisogno di un parametro di sintonia. Ciò richiede una (sei ipotizzando l'utilizzo di Java 5 o successivo) po 'di classe: un'istanza con il parametro di decadimento che si desidera (potrebbe richiedere sintonizzazione dovrebbe essere compreso tra 0 e 1) e quindi utilizzare media () per filtrare. Durante la lettura di una pagina su qualche ricorrenza mathmatical, tutti si ha realmente bisogno di sapere quando trasformandolo in codice è che i matematici piace scrivere indici in array e sequenze con gli indici. (Theyve alcune altre notazioni così, che non aiuta.) Tuttavia, l'EMA è piuttosto semplice come avete solo bisogno di ricordare un valore vecchio non complicati elementi di superfici sensibile richiesti. rispose 8 febbraio 12 a 20:42 TKKocheran: Più o meno. Isn39t è bello quando le cose possono essere semplici (oppure con la nuova sequenza, ottenere un nuovo averager.) Si noti che i primi termini della sequenza media salteranno in giro un po 'a causa di effetti di bordo, ma si ottiene quelli con altre medie mobili pure. Tuttavia, un buon vantaggio è che si può avvolgere la logica di media mobile nel averager e sperimentare senza disturbare il resto del programma troppo. ndash Donal Fellows 9 febbraio 12 a 0:06 sto avendo difficoltà a capire le vostre domande, ma cercherò di rispondere in ogni caso. 1) Se il vostro algoritmo trovato 0,25 invece di 0,36, allora è sbagliato. E 'sbagliato perché presuppone un aumento o una diminuzione monotona (che sta andando sempre verso l'alto o verso il basso andando sempre). A meno che la media di tutti i dati, i punti dati --- come li presenti --- sono non lineari. Se davvero si vuole trovare il valore massimo tra due punti nel tempo, poi tagliare la matrice da Tmin a Tmax e trovare il massimo di tale sottoarray. 2) Ora, il concetto di medie mobili è molto semplice: immaginate che ho il seguente elenco: 1.4, 1.5, 1.4, 1.5, 1.5. Posso liscia fuori prendendo la media di due numeri: 1.45, 1.45, 1.45, 1.5. Si noti che il primo numero è la media di 1.5 e 1.4 (secondo e primi numeri) il secondo (nuova lista) è la media di 1.4 e 1.5 (terzo e secondo elenco di età), terzo (nuovo elenco) la media di 1,5 e 1,4 (quarto e terzo), e così via. Avrei potuto reso periodo di tre o quattro, o n. Si noti come i dati sono molto più agevole. Un buon modo per vedere le medie mobili sul posto di lavoro è quello di andare a Google Finance, selezionare un magazzino (provate Tesla Motors piuttosto volatile (TSLA)) e cliccare su fattori tecnici alla parte inferiore del grafico. Selezionare Media mobile con un determinato periodo, e media mobile esponenziale a confrontare le loro differenze. Media mobile esponenziale è solo un altro elaborazione di questo, ma i pesi i dati più vecchi in meno rispetto ai nuovi dati questo è un modo per polarizzare il livellamento verso il retro. Si prega di leggere la voce di Wikipedia. Quindi, questo è più di un commento di una risposta, ma la piccola casella di commento era solo per minuscola. In bocca al lupo. Se siete ad avere problemi con la matematica, si potrebbe andare con una media mobile semplice anziché esponenziale. Quindi, l'uscita si ottiene sarebbe stato l'ultimo termine x diviso per x. pseudocodice testato: Si noti che è necessario per gestire le parti iniziali e finali dei dati dato che chiaramente non puoi fare la media dei ultimi 5 termini quando si è sul 2 ° punto di dati. Inoltre, ci sono modi più efficaci di calcolo di questa media mobile (somma somma - più antica più recente), ma questo è quello di ottenere il concetto di che cosa sta accadendo in tutto. rispose 8 febbraio 12 a 20: le statistiche 41in una media mobile semplice è un algoritmo che calcola la media ponderata degli ultimi n campioni. Il parametro n è spesso chiamato dimensione della finestra, poiché l'algoritmo può essere pensato come una finestra che scorre sopra i punti di dati. Utilizzando una formulazione ricorsiva dell'algoritmo, il numero di operazioni necessarie per campione è ridotto ad uno più, uno sottrazione e una divisione. Poiché la formulazione è indipendente dalla dimensione della finestra n. la complessità runtime è O (1). cioè costante. La formula ricorsiva della media mobile non ponderata, dove avg è la media mobile e x rappresenta un punto di dati. Così, ogni volta che le diapositive finestra a destra, un punto di dati, la coda, cade e un punto di dati, la testa, si muove in. Attuazione Un'implementazione della media mobile semplice è di prendere in considerazione quanto segue inizializzazione algoritmo Finché la finestra non è completamente popolato con valori, la formula ricorsiva fallisce. una conservazione accesso all'elemento coda, che a seconda della implementazione richiede una memoria di n elementi. My attuazione utilizza la formula presentata quando la finestra è completamente popolato con valori, e altrimenti passa alla formula, che aggiorna la media ricalcolando la somma degli elementi precedenti. Si noti che questo può portare a instabilità numeriche causa di aritmetica in virgola mobile. Per quanto riguarda il consumo di memoria è interessato, l'applicazione utilizza iteratori per tenere traccia di elementi testa e di coda. Questo porta ad una implementazione con requisiti di memoria costanti indipendenti dalla dimensione della finestra. Ecco la procedura di aggiornamento che scorre la finestra a destra. Nella maggior parte delle collezioni invalidare loro enumeratori quando la raccolta sottostante viene modificato. L'implementazione, invece, si basa su enumeratori validi. Soprattutto in streaming di applicazioni basate le esigenze di raccolta sottostanti modificati quando un nuovo elemento arriva. Un modo per affrontare questo è quello di creare una semplice raccolta circolare dimensione fissa di dimensioni n1 che non invalida i suoi iteratori e alternativamente aggiungere un elemento e la chiamata Shift. Vorrei poter capire come implementare in realtà questo, come la funzione di test è molto confusa per me8230 Ho bisogno di convertire i dati in array, quindi eseguire SMA nuova SMA (20, array) per un periodo di 20 SMA Come faccio a gestire funzione di spostamento () E 'necessario attuare costruttori. (Mi dispiace per la confusione). Non si don8217t bisogno di convertire i dati in un array a patto che i dati implementa IEnumerable1 e il tipo enumerato è doppio. Per quanto riguarda la messaggistica privata è interessato è necessario convertire il DataRow a qualcosa che è enumerabile di valori doppi. Il tuo approccio funziona. Shift, scivola la finestra di una posizione a sinistra. Per un set di dati di dire 40 valori e un 20 periodo di SMA si dispone di 21 posizioni la finestra si adatta (40 8211 20 1). Ogni volta che si chiama Shift () la finestra viene spostato a sinistra di una posizione e media () restituisce il SMA per la posizione della finestra corrente. Cioè, la media ponderata di tutti i valori all'interno della finestra. Inoltre la mia applicazione permette di calcolare la SMA, anche se la finestra non è completamente riempita all'inizio. Quindi, in sostanza Spero che questo aiuti. Ulteriori domande COPYRIGHT Christoph Heindl e cheind. wordpress, 2009-2012. Autorizzato la duplicazione uso Andor di questo materiale senza espressa autorizzazione scritta e da questo blog proprietario autore Andor è severamente proibito. Estratti e link possono essere utilizzati a condizione che la piena e chiara credito viene data alla Christoph Heindl e cheind. wordpress con direzione appropriata e specifica per il contenuto originale. messaggi recenti

No comments:

Post a Comment