Moving Media Filtro Microcontrollore


Una delle principali applicazioni per la scheda Arduino è una lettura e la registrazione dei dati del sensore. Per esempio uno monitor della pressione ogni secondo della giornata. Poiché i tassi di campionamento elevate genera spesso picchi nei grafici si vuole anche di avere una media delle misurazioni. Poiché le misure non sono statici nel tempo ciò che spesso abbiamo bisogno è una media in esecuzione. Questa è la media di un certo periodo e molto utile quando si fa l'analisi di tendenza. Più semplice forma di una media mobile può essere fatto da codice che si basa sul medio esecuzione precedente: se uno non vuole usare calcoli in virgola mobile - come questo richiede memoria e diminuisce la velocità - si può fare completamente lo stesso nel dominio intero. La divisione per 256 nel codice di esempio è uno spostamento a destra 8, che è più veloce dire divisione per esempio 100. Questo è vero per ogni potenza di 2 come divisore e uno solo deve prendere cura la somma dei PESI è uguale alla potenza di 2. E, naturalmente, si dovrebbe prendere cura non è troppo pieno intermedia (considerare l'utilizzo di unsigned long) Se avete bisogno una media di funzionamento più accurato, in concreto degli ultimi 10 misurazioni, è necessario un array (o lista collegata) per tenerli. Questo array agisce come un buffer circolare e con ogni nuova misurazione il più vecchio viene rimosso. La media corrente viene calcolato come la somma di tutti gli elementi divisi per il numero di elementi nella matrice. Il codice per la media mobile sarà qualcosa di simile a questo: svantaggio di questo codice è che la matrice per contenere tutti i valori può diventare molto grande. Se si dispone di una misurazione al secondo e si desidera una media in esecuzione al minuto è necessario un array di 60 in media per ora avrebbe bisogno di una serie di 3600. Che non poteva essere fatto in questo modo su un Arduino come ha solo 2K di RAM. Tuttavia con la costruzione di una media di 2 stadi si può accedere abbastanza bene (disclaimer: non per tutte le misurazioni). Nel codice pseudo: Come è necessario un nuovo array statico interno per ogni funzione runningAverage, questo urla per essere implementato come una classe. biblioteca RunningAverage La biblioteca runningAverage fa una classe della funzione di cui sopra in modo che possa essere utilizzato più volte in uno schizzo. Esso disaccoppia l'add () e AVG () per essere un po 'più flessibile per esempio si può chiamare i molteplici tempi medi senza aggiungere nulla. Si prega di notare che ogni istanza della classe aggiunge una propria matrice per contenere le misure, e che questo aggiunge fino a l'utilizzo della memoria. L'interfaccia della classe viene mantenuto il più piccolo possibile. Nota: con la versione 0.2 i nomi dei metodi sono tutti fatti più descrittivo. Un piccolo schizzo mostra come può essere usato. Un generatore casuale viene utilizzato per simulare un sensore. Nel setup () il Myra viene cancellato in modo che possiamo iniziare ad aggiungere i nuovi dati. Nel loop () prima un numero casuale viene generato e convertito in un galleggiante da aggiungere a Mira. Poi il runningAverage viene stampato alla porta seriale. Si potrebbe anche visualizzare su qualche LCD o inviare tramite ethernet ecc Quando 300 elementi vengono aggiunti Myra viene cancellata per ricominciare da capo. Per utilizzare la libreria, creare una cartella nel vostro SKETCHBOOKPATHlibaries con il nome RunningAverage e mettere il. he cpp lì. Opzionalmente fare una sottodirectory esempi di inserire l'applicazione di esempio. 2011-01-30: iniziale versione 2011-02-28: distruttore mancante fisso in. h file di 2011-02-28: rimosso costruttore predefinito 2012--. trimValue () Yuval Naveh aggiunto trimValue (che si trova sul web) 2012/11/21: refactoring 2012-12-30: aggiunto fillValue () refactoring per la pubblicazione 2014/07/03: codice di protezione della memoria aggiunto - dimensioni, se array interno non può essere allocato diventa 0. Questo è quello di risolvere problema descritto qui - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - test ampiamente. Modello di classe RunningAverage. h RunningAverage. cppAs altri hanno detto, si dovrebbe considerare un IIR (risposta all'impulso infinita) filtrare piuttosto che la FIR (risposta all'impulso finita) filtro che si sta utilizzando ora. C'è di più ad esso, ma a prima vista filtri FIR sono implementate come circonvoluzioni espliciti e IIR filtri con le equazioni. La particolare filtro IIR io uso molto in microcontrollori è un filtro passa basso unipolare. Questo è l'equivalente digitale di un semplice filtro analogico R-C. Per la maggior parte delle applicazioni, questi avranno caratteristiche migliori rispetto al filtro di dialogo che si sta utilizzando. La maggior parte usi di un filtro scatola che ho incontrato sono il risultato di qualcuno non prestare attenzione in classe elaborazione del segnale digitale, non come risultato di dover loro caratteristiche particolari. Se si desidera solo per attenuare le alte frequenze che si sa essere il rumore, un filtro passa basso unipolare è meglio. Il modo migliore per attuare una digitalmente in un microcontrollore è di solito: FILT lt-- FILT FF (NUOVO - FILT) FILT è un pezzo di stato persistente. Questa è l'unica variabile persistente è necessario calcolare questo filtro. NEW è il nuovo valore che il filtro viene aggiornato con questa iterazione. FF è la frazione filtro. che regola la pesantezza del filtro. Guardate questo algoritmo e vedere che per FF 0 il filtro è infinitamente pesante dal momento che l'uscita non cambia mai. Per 1 FF, la sua realtà nessun filtro del tutto poiché l'uscita segue solo l'ingresso. I valori utili sono in mezzo. Su piccoli sistemi si sceglie FF per essere 12 N in modo che il moltiplicare per FF può essere realizzato come uno spostamento a destra di n bit. Ad esempio, potrebbe essere FF 116 e moltiplicare per FF pertanto uno shift verso destra di 4 bit. In caso contrario, questo filtro necessita di un solo sottrarre e uno aggiuntivo, anche se i numeri di solito bisogno di essere più ampio rispetto al valore di ingresso (più precisione numerica in una sezione separata di seguito). Di solito prendo letture AD significativamente più veloce di quanto non sono necessari e applicare due di questi filtri in cascata. Questo è l'equivalente digitale di due filtri R-C in serie, e attenua del 12 dBoctave sopra la frequenza rolloff. Tuttavia, per AD letture elencate relativo solitamente più pertinenti a guardare il filtro nel dominio del tempo, considerando la sua risposta al gradino. Questo ti dice quanto velocemente il sistema vedrà un cambiamento quando la cosa si sta misurando i cambiamenti. Per facilitare la progettazione di questi filtri (il che significa che solo la raccolta di FF e decidere come molti di loro a cascata), io uso il mio FILTBITS programma. Si specifica il numero di bit per ogni turno FF nella serie cascata di filtri, e si calcola la risposta al gradino e altri valori. A dire il vero io di solito eseguire questo tramite il mio script wrapper PLOTFILT. Questo viene eseguito FILTBITS, il che rende un file CSV, quindi traccia il file CSV. Ad esempio, qui è il risultato di PLOTFILT 4 4: I due parametri PLOTFILT significa che ci saranno due filtri in cascata del tipo sopra descritto. I valori di 4 indicano il numero di bit di spostamento per realizzare il moltiplicare per FF. I due valori FF sono quindi 116 in questo caso. La traccia rossa è la risposta al gradino unità, ed è la cosa più importante da guardare. Ad esempio, questo indica che se l'ingresso cambia istantaneamente, l'uscita del filtro combinato si depositerà a 90 del nuovo valore in 60 iterazioni. Se avete a cuore il 95 tempo di assestamento, allora si deve attendere circa 73 iterazioni, e per il 50 tempo di assestamento solo 26 iterazioni. La traccia verde mostra l'output da un unico picco di massima ampiezza. Questo vi dà un'idea della soppressione del rumore casuale. Sembra che nessun singolo campione causerà più di un cambiamento di 2,5 in uscita. La traccia blu è quello di dare una sensazione soggettiva di ciò che questo filtro fa con rumore bianco. Questo non è un test severo, in quanto non vi è alcuna garanzia che cosa esattamente il contenuto era dei numeri casuali raccolti come ingresso rumore bianco per questa esecuzione di PLOTFILT. Il suo solo per dare una sensazione di massima di quanto verrà schiacciata e come liscia che è. PLOTFILT, forse FILTBITS, e un sacco di altra roba utile, in particolare per lo sviluppo del firmware PIC è disponibile nella versione software Strumenti di sviluppo PIC alla mia pagina di download del software. Aggiunta di informazioni di precisione numerica Vedo dai commenti e ora una nuova risposta che non vi è interesse a discutere il numero di bit necessari per implementare questo filtro. Si noti che il moltiplicare per FF creerà Log 2 (FF) nuovi bit al di sotto del punto di binario. Su piccoli sistemi, FF è generalmente scelto per essere 12 N in modo che questo si moltiplicano sia effettivamente realizzato da uno shift verso destra di N bits. FILT è quindi di solito un intero punto fisso. Si noti che questo doesnt cambia i matematica dal punto di vista processori. Ad esempio, se si sta filtrando 10 letture AD bit e N 4 (116 FF), allora avete bisogno di 4 bit di frazione sotto le letture intero AD 10 bit. Un maggior parte dei processori, youd essere facendo 16 operazioni po interi a causa delle letture AD 10 bit. In questo caso, si può ancora fare esattamente le stesse 16 opertions bit integer, ma iniziare con le letture AD sinistra spostato da 4 bit. Il processore non sa la differenza e non ha bisogno di. Facendo due conti su interi numeri interi a 16 bit funziona se si considera che siano 12,4 punto fisso o veri e propri 16 numeri interi bit (16.0 punto fisso). In generale, è necessario aggiungere N bit ciascuno dei poli filtro se non volete aggiungere rumore dovuto alla rappresentazione numerica. Nell'esempio precedente, il secondo filtro di due dovrebbe avere 1044 18 bit per non perdere informazioni. In pratica su un computer a 8 bit che significa valori bit uso 24 youd. Tecnicamente solo il secondo polo di due avrebbe bisogno il valore più ampio, ma per semplicità firmware solito utilizzare la stessa rappresentazione, e quindi lo stesso codice, per tutti i poli di un filtro. Di solito scrivo una subroutine o una macro per eseguire una sola operazione pole filtro, quindi applicare che per ogni polo. Se una subroutine o una macro dipende dal fatto che i cicli o memoria di programma sono più importanti in quel particolare progetto. Ad ogni modo, io uso uno stato zero per passare di nuovo nel subroutinemacro, che aggiorna FILT, ma anche carica che nello stesso stato zero NUOVO era in. Ciò lo rende facile da applicare poli multipli in quanto la FILT aggiornata di un polo è il nuovo di quello successivo. Quando una subroutine, il suo utile avere un punto puntatore FILT sul modo in, che viene aggiornato solo dopo FILT sull'uscita. In questo modo la subroutine funziona automaticamente su filtri consecutivi in ​​memoria se chiamato più volte. Con una macro non avete bisogno di un puntatore da quando si passa l'indirizzo di operare su ogni iterazione. Esempi di codice Ecco un esempio di una macro come descritto sopra per un PIC 18: E qui è una macro simile per un PIC 24 o dsPIC 30 o 33: Entrambi questi esempi sono implementate come macro utilizzando il mio PIC assemblatore preprocessore. che è più capace di una delle strutture macro incorporati. clabacchio: Un altro problema Avrei detto è l'attuazione del firmware. È possibile scrivere un unico polo passa-basso filtro subroutine una volta, poi applicarlo più volte. Infatti solito scrivere un tale subroutine per prendere un puntatore nella memoria allo stato del filtro, quindi l'ho avanzare il puntatore in modo che possa essere chiamato in successione facilmente realizzare filtri multipolari. ndash Olin Lathrop 20 aprile 12 al 15:03 1. Grazie mille per le vostre risposte - tutti loro. Ho deciso di usare questo filtro IIR, ma questo filtro non viene utilizzato come un filtro standard LowPass, dal momento che ho bisogno di valori medi del contatore e confrontarli per rilevare i cambiamenti in un certo intervallo. Poiché questi valori van essere di dimensioni molto diverse a seconda dell'hardware ho voluto prendere una media in modo da essere in grado di reagire a questi cambiamenti specifici hardware automaticamente. ndash sensslen 21 12 maggio alle 12:06 Se si può vivere con la restrizione di una potenza di due serie di elementi di media (cioè 2,4,8,16,32, ecc), allora il divario può facilmente ed efficacemente essere fatto su una bassa micro prestazioni senza divide dedicato perché può essere fatto come un bit di scorrimento. Ogni spostamento è giusta potenza di due ad esempio: Il PO pensava di avere due problemi, che divide in un PIC16 e memoria per il suo buffer circolare. Questa risposta dimostra che la divisione non è difficile. Bisogna ammettere che non affronta il problema di memoria, ma il sistema SE permette risposte parziali, e gli utenti possono prendere qualcosa da ogni risposta per se stessi, o anche modificare e combinare le risposte other39s. Poiché alcune delle altre risposte richiedono un'operazione di divisione, sono analogamente incomplete poiché non mostrano come ottenere in modo efficiente questo su un PIC16. ndash Martin 20 aprile 12 alle 13:01 C'è una risposta per un vero e proprio filtro a media mobile (aka filtro Boxcar) con requisiti di memoria meno, se non vi dispiace downsampling. La sua chiamata un filtro in cascata integratore-pettine (CIC). L'idea è che si dispone di un integratore che si prende le differenze di un periodo di tempo, e il dispositivo di memoria di risparmio chiave è che da downsampling, non dovete memorizzare ogni valore dell'integratore. Può essere implementato utilizzando il seguente pseudocodice: La lunghezza effettiva media mobile è decimationFactorstatesize ma avete solo bisogno di mantenere intorno campioni statesize. Ovviamente è possibile ottenere prestazioni migliori se il statesize e decimationFactor sono potenze di 2, in modo che gli operatori di divisione e resto vengono sostituiti da spostamenti e la maschera-ands. Poscritto: Sono d'accordo con Olin che si dovrebbe sempre prendere in considerazione semplici filtri IIR prima di un filtro a media mobile. Se non avete bisogno le frequenze-null di un filtro vagone, un 1-palo o filtro passa-basso a 2 poli probabilmente funzionerà bene. D'altra parte, se si sta filtrando ai fini della decimazione (prendendo un ingresso ad alta frequenza di campionamento e una media per l'utilizzo da parte di un processo a bassa frequenza), poi un filtro CIC può essere solo quello che stai cercando. (Soprattutto se è possibile utilizzare statesize1 ed evitare il ringbuffer tutto con un singolo valore integratore precedente) Theres alcune analisi approfondita della matematica dietro utilizzando il filtro IIR del primo ordine che Olin Lathrop ha già descritto sopra sullo scambio pila Digital Signal Processing (comprende un sacco di belle immagini.) l'equazione per questo filtro IIR è: Ciò può essere implementato usando solo numeri interi e nessuna divisione utilizzando il seguente codice (potrebbe essere necessario un po 'di debugging come stavo scrivendo a memoria.) questo filtro si avvicina una media mobile di gli ultimi campioni K impostando il valore di alfa a 1K. Fate questo in codice precedente da definire BITS ing a LOG2 (K), vale a dire per K 16 bit impostati a 4, per K 4 bit impostati a 2, etc. (Ill verificare il codice elencato qui, non appena ho un cambiamento e modificare questa risposta, se necessario.) ha risposto 23 giugno 12 a 4:04 Heres un filtro passa-basso unipolare (media mobile, con cutoff CutoffFrequency frequenza). Molto semplice, molto veloce, grandi opere, e quasi nessun overhead di memoria. Nota: Tutte le variabili hanno portata al di là della funzione di filtro, ad eccezione del passato in newInput Nota: Si tratta di un unico filtro palco. stadi multipli possono essere collegati in cascata insieme per aumentare la nitidezza del filtro. Se si utilizza più di una fase, youll hanno per regolare DecayFactor (come si riferisce al taglio-Frequency) per compensare. E, ovviamente, tutto ciò che serve è quelle due righe posizionati ovunque, Non hanno bisogno la propria funzione. Questo filtro ha un tempo di accelerazione prima della media mobile rappresenta quella del segnale di ingresso. Se avete bisogno di ignorare che il tempo di ramp-up, si può solo inizializzare media mobile per il primo valore di newInput invece di 0, e la speranza il primo newInput è neanche un outlier. (CutoffFrequencySampleRate) ha una gamma compresa tra 0 e 0,5. DecayFactor è un valore compreso tra 0 e 1, di solito vicino a 1. carri singola precisione sono abbastanza buono per la maggior parte delle cose, ho appena preferisco doppie. Se avete bisogno di attaccare con numeri interi, è possibile convertire DecayFactor e ampiezza Factor in numeri interi frazionari, in cui il numeratore viene memorizzato come il numero intero, e il denominatore è una potenza intera di 2 (in modo da poter bit-shift a destra come la denominatore piuttosto che dover dividere durante il loop filtro). Per esempio, se DecayFactor 0.99, e si desidera utilizzare gli interi, è possibile impostare DecayFactor 0,99 65536 64881. E poi ogni volta che si moltiplica per DecayFactor nel loop filtro, semplicemente spostare il risultato 16. Per ulteriori informazioni su questo, questo è un ottimo libro on-line, il capitolo 19 sui filtri ricorsivi: dspguidech19.htm PS Per la movimentazione di paradigma media, un approccio diverso per impostazione DecayFactor e AmplitudeFactor che può essere più rilevante per le vostre esigenze, permette di dire si desidera che i precedenti, circa 6 articoli in media insieme, facendo in modo discreto, youd aggiungere 6 articoli e dividere per 6, in modo da è possibile impostare il AmplitudeFactor a 16, e DecayFactor di (1,0 - AmplitudeFactor). risposto 14 maggio 12 in 22:55 tutti gli altri hanno commentato a fondo l'utilità di IIR contro FIR, e sulla divisione di potere-di-due. Id proprio come a dare alcuni dettagli di implementazione. Il sotto funziona bene su piccoli microcontrollori senza FPU. Theres nessuna moltiplicazione, e se si mantiene N una potenza di due, tutta la divisione è a ciclo unico bit-shifting. tampone base anello FIR: tenere un tampone di corsa degli ultimi valori di N, e una somma parziale di tutti i valori nel buffer. Ogni volta che un nuovo campione entra, sottrarre il valore più vecchio nel buffer da SUM, sostituirlo con il nuovo campione, aggiungere il nuovo campione di SUM, e SUMN uscita. Modificato buffer circolare IIR: mantenere una somma parziale degli ultimi N valori. Ogni volta che un nuovo campione entra, SUM - SUMN, aggiungere il nuovo campione, e SUMN uscita. risposto 28 ago 13 ad 13:45 Se I39m voi leggendo a destra, you39re descrivendo un primo ordine IIR filtro del valore you39re sottraendo isn39t il valore più vecchio che sta cadendo fuori, ma è invece la media dei valori precedenti. Primo ordine filtri IIR può certamente essere utile, ma non è sicuro I39m cosa si intende quando si suggerisce che l'uscita è la stessa per tutti i segnali periodici. Ad una frequenza di campionamento 10KHz, alimentando un'onda quadra a 100Hz in una scatola filtro 20 stadi produrrà un segnale che aumenta uniformemente per 20 campioni, si trova in alto per 30 gocce uniformemente per 20 campioni, e si siede basso per 30. Un primo ordine filtro IIR. ndash Supercat 28 ago 13 ad 15:31 produrrà un'onda che inizia forte aumento e gradualmente i livelli in prossimità di (ma non a) la massima di ingresso, poi inizia a cadere bruscamente e gradualmente i livelli in prossimità di (ma non a) il minimo di ingresso. comportamento molto diverso. ndash Supercat 28 13 agosto a 15:32 Un problema è che una media mobile semplice può o non può essere utile. Con un filtro IIR, è possibile ottenere un bel filtro con relativamente pochi calcs. La FIR si descrive può solo dare un rettangolo nel tempo - un sinc in freq - e si can39t gestire i lobi laterali. Essa può essere valsa la pena di gettare in un paio di moltiplica interi per rendere un bel FIR sintonizzabile simmetrica se si può risparmiare l'orologio zecche. ndash Scott Seidman 29 agosto 13 alle 13:50 ScottSeidman: Non c'è bisogno di moltiplica se uno ha semplicemente ogni fase della FIR sia uscita la media dell'ingresso a quella fase e il suo valore memorizzato precedente, e quindi memorizzare l'ingresso (se uno ha l'intervallo numerico, si potrebbe utilizzare la somma invece di media). Sia that39s meglio di un filtro box dipende dalla applicazione (la risposta di un filtro scatola con un ritardo totale di 1 ms, per esempio, avrà un picco d2dt entrata quando il cambiamento di ingresso, e di nuovo 1ms tardi, ma avrà la minima possibile ddt per un filtro con un totale di ritardo 1 ms). ndash Supercat 29 ago 13 ad 15:25 Come ha detto mikeselectricstuff, se si ha realmente bisogno di ridurre le esigenze di memoria, e non vi dispiace la vostra risposta all'impulso essere un esponenziale (invece di un impulso rettangolare), vorrei andare per un filtro di media mobile esponenziale . Li uso estensivo. Con questo tipo di filtro, non avete bisogno di alcun tampone. Non dovete memorizzare i campioni N passato. Solo uno. Quindi, i tuoi requisiti di memoria vengono abbattuti di un fattore di N. Inoltre, non avete bisogno di alcuna divisione per questo. Solo moltiplicazioni. Se si ha accesso a virgola mobile, utilizzare moltiplicazioni in virgola mobile. In caso contrario, fare moltiplicazioni interi e turni a destra. Tuttavia, siamo nel 2012, e vi consigliamo di usare compilatori (e MCU) che permettono di lavorare con numeri in virgola mobile. Oltre ad essere più efficiente della memoria e più veloce (non dovete aggiornare gli elementi in ogni buffer circolare), direi che è anche più naturale. perché una risposta impulsiva esponenziale corrisponde meglio come natura comporta, nella maggior parte dei casi. risposto 20 Apr 12 in 09:59 Un problema con il filtro IIR come quasi toccato da Olin e Supercat ma apparentemente ignorato da altri è che l'arrotondamento per difetto presenta alcune imprecisioni (e potenzialmente biastruncation). supponendo che N è una potenza di due, e solo l'aritmetica intera è utilizzata, il passaggio diritto non elimina sistematicamente i bit LSB del nuovo campione. Ciò significa che per quanto tempo la serie potrebbe mai essere, la media non potrà mai prendere quelli in considerazione. Ad esempio, supponiamo che una serie lentamente diminuendo (8,8,8. 8,7,7,7. 7,6,6,) e assumere la media è infatti 8 all'inizio. Il campione pugno 7 porterà la media di 7, qualunque sia la forza del filtro. Solo per un campione. Stessa storia per 6, ecc Ora pensare il contrario. la serie va in su. La media rimarrà il 7 per sempre, fino a quando il campione è abbastanza grande per farlo cambiare. Naturalmente, è possibile correggere la distorsione con l'aggiunta di 12N2, ma che in realtà abituato a risolvere il problema di precisione. in tal caso la serie decrescente rimarrà sempre a 8 finché il campione è 8-12 (N2). Per N4 per esempio, qualsiasi campione sopra lo zero manterrà il invariata media. Credo che una soluzione per questo implicherebbe tenere un accumulatore di LSB persi. Ma non ho rendere quanto basta per avere il codice pronto, e io non sono sicuro che non sarebbe danneggiare la potenza IIR in alcuni altri casi di serie (ad esempio se 7,9,7,9 sarebbe in media di 8 poi). Olin, il vostro cascata a due stadi anche avrebbe bisogno di qualche spiegazione. Vuoi dire che regge due valori medi con il risultato del primo alimentato nella seconda in ogni iterazione. Che cosa è il vantaggio di questo Forum: Digitale Signalverarbeitung DSP MOVING filtro a media dell'indice FastAVR Dim come byte di valore dim (4) come byte media fioca come parola conteggio fioca come indice di byte 1 39arrays in BASCOM beginnen mit 1 :-( fanno valore (indice) getadc (x) 39messen incr indice se l'indice 5 quindi l'indice 1 per conteggio da 1 a 4 valore medio medio (conteggio) turno successivo media, a destra, 2 39geht als Schneller 4 anello Fastavr wird ja nicht sooo viel Anders sein. Anstatt fare a circuito kannst du das era dazwischen steht natrlich auch als sub aufrufen oder wie auch immer Dann mach es doch so wie mein Beispiel (nur ohne den Fehler media bis ins unendliche hochzuaddieren -)), Nur da der letzte Mittelwert den ltesten Wert des array ersetzt:. Do valore dell'indice incr (indice) getadc (x) 39messen valore (indice-1) media se index 5 quindi l'indice 1 media 0 per il conteggio da 1 a 4 valore medio medio (contare) turno successivo media, a destra, 2 39geht als Schneller 4 ciclo Noch NE Idee zum gltten, ev. etwas trge: - Wert Messen als Anfang Dann immer: - neuen Wert Messen Wert (3Wert Neuer Wert) 4 nur noch einen cade es interessiert. Soweit ich die bisherigen varianti hier berblickt habe, immer wird die Summe fr den Mittelwert ausgewertet. Das macht Diese Methoden aber mit langsamer steigernder Fensterlnge. Nachdem der ist Mittelwert lineare, kann ich die auch Summe einfach zerlegen und mir ricambio così jedesmal morire Summe auszuwerten. definire WindowSize 4 int samplesWindowSize int indice 0 int media 0 while (1) Alten Wert abziehen. media - samplesindex Neuen Wert zufgen. samplesindex ingresso WindowSize Neuen Mittelwert bilden. media samplesindex Im ringbuffer weiterstellen indice indice WindowSize Codice Der ist keinesfalls quotoptimalquot, sondern sollte nur die Funktionsweise demonstrieren. Desweiteren muss man bei diesem Verfahren morire Rundungsfehler beachten, D. H. bei Benutzung von Integer-Arithmetik ist der gewonnene Mittelwert etwas ungenauer. Autore: Martin (Gast) Datum: 02.05.2009 03:29 mal ein ganz anderer Ansatz: Warum nicht einfach erhhst Du morire di campionamento-Zeit am AD-Wandler. Somit hast Du ein Hardware-Moving-media-Filter Nimm einfach viermal ne so Hohe Samplingrate, ist das gleiche, Wie wenn Dein AD-Wandler vier Werte aufnimmt und Du Sie dann wieder mittelst (Va bene. Gesame Sampling - und Zeit convertitori betrachten) ) Die vier Einzelwerte interessieren Dich nicht ja eh und die Werte die der AD-Wandler liefert werden auch besser (Im Datenblatt des AD-Wandlers drfte auch ne Formel fr morire Mindest-Sample-Zeit angegeben sein). Nur ein Gedanke così. mal ein ganz anderer Ansatz: Warum nicht einfach erhhst Du morire di campionamento-Zeit am AD-Wandler. Somit hast Du ein Hardware-Moving-media-Filter N in modo cappello uomo im besten Falle eine Unterabtastung. Wenn man vor dem Eingang ADC noch einen RC-Tiefpass mit passender Grenzfrequenz setzt dann wird ein Schuh Draus. Ohne diesen schlgt morire SampleampHoldstufe des ADC zu, wir Reden ja vom AVR. und die bentigt nur 1,5 ADC Takte um das Eingangssignal zu sampeln. Antwort schreiben Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail ber Antworten auf Ihren Beitrag informiert werden mchten, melden Sie sich bitte una. Importanti Regeln - erst lesen, dann posten Gro - und Kleinschreibung verwenden Lngeren Sourcecode nicht im einfgen testo, sondern als Dateianhang Formatierung (mehr Informationen.) Cc-Codec avrasmAVR-Assembler-Codeavrasm codeCode a Anderen Sprachen, ASCII-Zeichnungencode mathFormel in LaTeX-Syntaxmath Titel - link zu Artikel Verweis auf anderen Beitrag einfgen: Rechtsklick auf Beitragstitel, Indirizzo kopieren, und in den einfgen Testo

Comments

Popular Posts