Tuesday 26 September 2017

Moving Media Filtro Realizzazione C


È 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 alle 13:53 la vostra risposta 2017 Stack Exchange, inci che questo è realizzabile con boost secondo:. Ma mi piacerebbe davvero evitare l'uso di spinta googled e non trovato alcun esempio adatto o leggibili Fondamentalmente voglio seguire il. media mobile di un flusso continuo di un flusso di numeri in virgola utilizzando le più recenti 1000 numeri come un campione di dati mobile. Qual è il modo più semplice per raggiungere questo obiettivo ho sperimentato con l'utilizzo di un array circolare, media mobile esponenziale e una più semplice media mobile e ha scoperto che i risultati dalla matrice circolare adatta alle mie esigenze. chiesto 12 giugno 12 a 4:38 Se le vostre esigenze sono semplici, si potrebbe anche provare a utilizzare una media mobile esponenziale. In parole povere, si effettua una variabile di accumulatori, e come il codice sia in ogni campione, il codice aggiorna l'accumulatore con il nuovo valore. Si sceglie un alpha costante che è compreso tra 0 e 1, e calcolare questo: Hai solo bisogno di trovare un valore di alfa in cui l'effetto di un determinato campione dura solo per circa 1000 campioni. Hmm, Im non realmente sicuro che questo è adatto per voi, ora che Ive ha messo qui. Il problema è che 1000 è un piuttosto lunga finestra per una media mobile esponenziale Im non sicuro che ci sia un alfa che diffondere la media degli ultimi 1000 numeri, senza underflow nel calcolo in virgola mobile. Ma se si voleva una media più piccolo, come 30 numeri o giù di lì, questo è un modo molto semplice e veloce per farlo. risposto 12 giugno 12 alle 04:44 1 sul tuo post. La media mobile esponenziale può permettere l'alfa di essere variabile. Quindi, questo permette di essere utilizzato per calcolare le medie base dei tempi (ad esempio byte al secondo). Se il tempo dall'ultimo aggiornamento accumulatore è più di 1 secondo, si lascia alfa essere 1.0. In caso contrario, si può lasciare alfa essere (usecs dall'ultima update1000000). ndash JXH 12 giugno 12 alle 06:21 Fondamentalmente voglio monitorare la media mobile di un flusso continuo di un flusso di numeri in virgola che utilizzano le più recenti 1000 numeri come un campione di dati galleggiante. Si noti che il sotto aggiorna totale come elementi come addedreplaced, evitando i costi di O (N) attraversamento per calcolare la somma - necessario per la media - su richiesta. Total è fatto un parametro diverso da T a sostenere ad esempio con un lungo lungo quando per un totale di 1000 s lunga, un int per char s, o un doppio al totale galleggiante s. Questo è un po 'viziata in quel numsamples potrebbe andare oltre INTMAX - se vi interessa si potrebbe usare un unsigned long long. o utilizzare un membro di dati in più bool a registrare quando il contenitore viene prima riempita mentre numsamples ciclabili intorno l'array (migliore poi rinominato qualcosa di innocuo come pos). risposto 12 giugno 12 a 5:19 si parte dal presupposto che l'operatore quotvoid (campione T) quot è in realtà operatorltlt quotvoid (campione T) quot. ndash oPless 8 Giugno 14 a 11:52 oPless ahhh. ben individuato. in realtà volevo dire per essere operatore void) (campione T) (ma naturalmente si potrebbe usare qualsiasi notazione ti è piaciuto. Sarà risolvere, grazie. ndash Tony D 8 giugno 14 alle 14: 27La Media mobile come un filtro La media mobile è spesso usato per lisciare i dati in presenza di rumore. La media mobile non è sempre riconosciuta come filtro Finite Impulse Response (FIR) che è, mentre è in realtà uno dei filtri più comuni nel trattamento del segnale. Trattandolo come un filtro consente il confronto con, per esempio,-sinc finestrate filtri (vedi gli articoli sul passa-basso.. Banda passa-passa-alto e e-banda rifiutano filtri per gli esempi di quelli). La differenza principale con questi filtri è che la media mobile è adatto per segnali per cui le informazioni utili è contenuto nel dominio del tempo. dei quali lisciatura misurazioni facendo la media è un ottimo esempio. filtri finestrato-sinc, d'altro canto, sono forti esecutori nel dominio della frequenza. con equalizzazione in elaborazione audio come esempio tipico. C'è un confronto più dettagliato di entrambi i tipi di filtri nel dominio del tempo vs prestazioni dominio della frequenza dei filtri. Se si dispone di dati per i quali sia il tempo e dominio della frequenza sono importanti, allora si potrebbe desiderare di avere uno sguardo al Variazioni sul media mobile. che presenta un certo numero di versioni ponderata della media mobile che sono meglio a questo. La media mobile di lunghezza (N) può essere definito come scritto come è tipicamente implementato, con il campione di uscita corrente come media dei campioni precedenti (N). Visto come un filtro, la media mobile esegue una convoluzione della sequenza di input (xn) con un impulso rettangolare di lunghezza (N) e l'altezza (1N) (per rendere l'area del polso, e, di conseguenza, il guadagno del filtro , uno ). In pratica, è meglio prendere (N) dispari. Sebbene una media mobile può anche essere calcolata utilizzando un numero di campioni, utilizzando un valore dispari per (N) ha il vantaggio che il ritardo del filtro sarà un numero intero di campioni, poiché il ritardo di un filtro con (N) campioni è esattamente ((N-1) 2). La media mobile può quindi essere allineato esattamente ai dati originali spostandolo da un numero intero di campioni. Time Domain Poiché la media mobile è una convoluzione con un impulso rettangolare, la sua risposta in frequenza è una funzione sinc. Questo rende qualcosa come il duale del filtro finestrato-sinc, dal momento che è una convoluzione con un impulso sinc che si traduce in una risposta in frequenza rettangolare. È questa risposta in frequenza sinc che rende la media mobile un esecutore povero nel dominio della frequenza. Tuttavia, esso funziona molto bene nel dominio del tempo. Pertanto, è ideale per lisciare i dati per rimuovere il rumore, mentre allo stesso tempo mantenendo una risposta a gradino veloce (Figura 1). Per il tipico rumore additivo gaussiano bianco (AWGN) che è spesso assunto, media campioni (N) ha l'effetto di aumentare il SNR di un fattore (sqrt N). Dal momento che il rumore per i singoli campioni non è correlata, non vi è alcun motivo di trattare ogni campione in modo diverso. Quindi, la media mobile, che dà ogni campione lo stesso peso, sarà sbarazzarsi della quantità massima di rumore per una data nitidezza risposta al gradino. Attuazione Poiché è un filtro FIR, la media mobile può essere attuato mediante convoluzione. Si avrà quindi la stessa efficacia (o la mancanza di esso) come qualsiasi altro filtro FIR. Tuttavia, può anche essere implementato in modo ricorsivo, in maniera molto efficiente. Segue direttamente dalla definizione che questa formula è il risultato delle espressioni per (yn) e (YN1), vale a dire, in cui si nota che il cambio tra (YN1) e (yn) è che un termine supplementare (xn1N) appare in alla fine, mentre il termine (xn-n1n) viene rimosso dall'inizio. Nelle applicazioni pratiche, è spesso possibile omettere la divisione per (N) per ogni termine compensando il guadagno risultante di (N) in un altro luogo. Questo ricorsiva attuazione sarà molto più veloce di convoluzione. Ogni nuovo valore (y) può essere calcolato con solo due aggiunte, invece dei (N) aggiunte che sarebbe necessaria per un'attuazione semplice della definizione. Una cosa da guardare fuori per una implementazione ricorsiva è che errori di arrotondamento si accumulano. Questo può o non può essere un problema per la vostra applicazione, ma implica anche che questo ricorsiva implementazione potrà mai funzionare meglio con un'implementazione intero che con numeri in virgola mobile. Questo è piuttosto insolito, poiché una implementazione in virgola mobile solito è più semplice. La conclusione di tutto questo deve essere che non bisogna mai sottovalutare l'utilità del semplice filtro media mobile nelle applicazioni di elaborazione dei segnali. Filter Design Tool Questo articolo è completato con uno strumento Filter Design. Esperimento con diversi valori di (N) e visualizzare i filtri risultanti. Provalo ora

No comments:

Post a Comment