Newsgroup: it.hobby.elettronica.digitale
Titolo: Media misurazioni

Salve a tutti.
Non so se è il newsgroup giusto ma chiedo qui perchè so che c'è gente 
molto preparata.
Ho uno strumento di misura che rileva (tramite un AD ovviamente) un bel 
po' di misure al secondo.
Al momento queste misure sono mediate con una stupidissima media delle 
ultime N misure effettuate.
La cosa è efficace per eliminare spykes e comunque per "smussare" la 
risposta dello strumento; inoltre il microcontrollore la esegue molto 
velocemente in quanto non è altro che una serie di somme più una 
divisione ;-)
Il problema nasce dal fatto che è molto LENTA al crescere di N nel 
fornire una variazione della misura.
Esistono algoritmi a cui posso far riferimeno per mediare un minimo la 
mia misura ma che però garantisca una certa "reattività" nel caso la 
misura cambi (non uno spyke ma proprio una variazione nella misura 
stessa) ?
Grazie
-- 
Ciao da Stefano

 stessa) ?
Mah, il punto è la media ti serve proprio per filtrare gli spike, e 
quanto più accetti le variazioni della misura tanto meno puoi filtrare 
gli spike. 
Non credo che sia possibile scavalcare il tradeoff ma solo sistemarti 
nel punto migliore per l'applicazione che ti serve.


Invece di usare un filtro a media classica (perchè non media mobile, mi 
chiedo??) puoi usare un filtro MEDIANO.
Per farlo metti i tuoi campioni in un vettore di indice dispari (per esempio 
7) e una volta riempito lo ordini e tiri fuori il valore nel mezzo.
Se lo fai mobile funziona ancora meglio (devi inserire in lista ordinata) ed 
è molto più reattivo di un filtro a media classica
Ciao
CG 

 è molto più reattivo di un filtro a media classica
Innanzitutto grazie mille!
Allora io per media probabilmente intendo già una media mobile..
Per capirsi: riempio un buffer con N valori, poi piano piano ogni 
valore letto dall'AD lo metto come ultimo ed elimino il primo inserito.
In questo caso si mediano sempre 5 valori di cui cambia sempre e solo 
uno..
Cioè non medio sempre 5 valori nuovi ma uno nuovo per volta..
Intendi questo per media mobile?
Per media classica volevo dire che non uso medie ponderate o altri tipi 
di media strani ;-)
-- 
Ciao da Stefano

 stessa) ?
Io in questi casi uso un grezzissimo filtro IIR che è velocissimo e fa 
il suo dovere. In pratica è come se fosse una rete RC. Vedi se ti può 
servire:
y1 = y0 - (y0 - x) / 4;
y0 = y1;
Dove y1 è l'uscita del filtro, y0 il valore precedente, x il nuovo 
valore di ingresso dall'ADC. Variando il coefficiente '4' (con potenze 
di due per ridurre i tempi di calcolo) puoi modificare la "frequenza di 
taglio".
Fai qualche simulazione per verificare che il comportamento ti 
piaccia... ovviamente è una versione molto elementare, lo potrai sempre 
migliorare a seconda delle tue esigenze.
Ciao!
Marco / iw2nzm
 

 La cosa è efficace per eliminare spykes e comunque per "smussare" la 
se e' davvero uno spike (che rovina 1 sola acquis) lo puoi eliminare 
facilmente _prima_ di applicare filtri che rallentano:
es: fai 3 acquis in rapida successione, scarti quella che "devia" di 
piu', fai la media delle altre 2 e metti via; in questo modo puoi 
ridurre il tuo numero N e aumentare la velocita'.
se cerchi complicazione esistono anche algoritmi "preventivi" : 
ovviamente dopo una serie di tipo 1_3_5_7 ci sara' 9 !
saluti

 media strani ;-)
Ecco. Se hai ogni tanto qualche spike ti conviene usare un filtro MEDIANO 
(median filter). Non è la stessa cosa della media (averaging filter)!!!
Invece che calcolare la media (somma degli elementi diviso numero elementi), 
ordinali (se non puoi usare ricorsione potrebbe essere macchinoso, ma 
comunque sono vettori piccoli e quindi puoi anche accettare la complessità 
computazionale di un BubbleSort) ed estrai l'elemento intermedio (nel caso 
di un vettore di 5 è il terzo, per un vettore di 7 è il quarto e così via).
Uno spike, sia in alto sia in basso, finirà sempre su un estremo del buffer 
e verrà scartato.
La frequenza di taglio di questo filtro è determinata dal numero di elementi 
che compongono il buffer. Finchè il tempo di campionamento è paragonabile o 
superiore al fronte di salita/discesa del tuo spike riesci a scartare 
quest'ultimo. Se non puoi agire sulla frequenza di campionamento puoi 
aumentare le dimensioni del tuo buffer....
Il mio discorso rimane vago perchè non conosco il segnale che devi acquisire 
ed il tipo di disturbi che ti stanno entrando nel sistema, ma mi auguro che 
almeno in analogica tu abbia limitato la banda del canale.
Ciao
CG 

 almeno in analogica tu abbia limitato la banda del canale.
Hai ragione..
Il mio problema è IMHO molto più semplice di quello che pensi. :-D
Io ho un trasduttore che mi restituisce un segnale analogico..
L'AD che usiamo ha un'altissima risoluzione (24 bit) e quindi ciò che 
leggo è un qualcosa di veramente piccolo che varia velocissimamente; da 
qui la necessità di trovare una media abbastanza buona per 
"stabilizzare" un po' la misura.
Non ho dei veri e propri spyke però ho comunque la necessità di 
filtrare i campioni letti e garantire comunque un'ottima velocità nel 
caso in cui la mia misura cambi.
-- 
Ciao da Stefano

 mia misura cambi.
Secondo me non ti resta che modularizzare il tuo programma e trovare il 
filtro che fa più per te, e dopodichè vedere un po' come si comporta a 
seconda del filtro digitale che utilizzi. Puoi benissimo anche combinare i 
filtri....usi il mediano (FIR) per togliere gli spike e poi passi tutto in 
media mobile (IIR).
Se il trasduttore ha una banda ben precisa e piuttosto piccola (es. una 
temperatura, che di solito sta sotto l'hertz), se riesci ad andare parecchio 
più veloce come frequenza di campionamento potresti implementarti un vero e 
proprio passa-basso digitale come ti ha consigliato Marco Trapanese.
Continuo a ripeterti, comunque, che 24bit sono tanti tanti tanti tanti (meno 
di 1 ppm!!).....gli accorgimenti analogici per salire sopra i 16bit sono 
tanti, altrimenti anche il più tosto filtro digitale non riesce a ripulirti 
il segnale. Non è una cosa affatto semplice, e ricordiamoci anche che a 
seconda del trasduttore potrebbe essere tutto inutile....
Se poi questi accorgimenti servono per far vedere una misura "bella" e ce ne 
freghiamo dell'accuratezza effettiva....beh....nessuno ti impedisce di fare 
altre cattiverie, come un filtro APPROSSIMATIVO :)  (metti che ti balla la 
sesta cifra decimale....approssimi alla quarta e via.... :-) )
Ciao
CG 

 nel punto migliore per l'applicazione che ti serve.
Capito ;-)
-- 
Su msn: sbi82 chiocciola hotmail punto it
Non c'è cattivo più cattivo di quando un buono diventa cattivo! (Bud 
Spencer)
Ciao da Stefano

 seconda delle tue esigenze.
Grazie mille!!


 dopo una serie di tipo 1_3_5_7 ci sara' 9 !
Grazie per l'aiuto!
Ho un po' di cose da provare ragazzi.. Grazie!


 sesta cifra decimale....approssimi alla quarta e via.... :-) )
Beh effettivamente mi stava venendo voglia di fare così :-D
Ma spero di riuscirci senza ;-)


> Ho un po' di cose da provare ragazzi.. Grazie!
Credo di poter dire, anche a nome degli altri del NG che hanno risposto, che 
appena hai provato ci farai sapere com'č andata a finire!
Anche io sono molto curioso visto che non sono troppo pratico di 
elaborazione numerica di segnali (anzi, non lo sono per niente rispetto a 
chi ci lavora per davvero.... io penso alla parte hardware e butto idee al 
programmatore :) )
Per fare una stima della nuova accuratezza potresti mettere una sorgente 
molto stabile di segnale (es. l'uscita di un calibratore) e fare qualche 
migliaio di campionamenti. Dopodichč, mettendo tutto in istogramma, 
informarci della deviazione standard in parti per milione (o i bit 
effettivi, o i dB di SNR.... o quello che vuoi) !
Ciao
CG 

 o i dB di SNR.... o quello che vuoi) !
Da lunedi mi rimetto al lavoro ;-)
Nel frattempo grazie a tutti!!
