Filtrare picchi in misurazioni di temperatura

di il
5 risposte

Filtrare picchi in misurazioni di temperatura

Salve a tutti!

Sto facendo un esercizio nel quale devo generare un grafico dato dalla media di 3 misurazioni di temperatura effettuate da tre sensori. Ogni sensore può restituire una temperatura compresa tra 1 e 80 gradi, con una probabilità di errore (picco) dell'1%. Se si presenta un picco devo filtrarlo.

Mettendo caso che io scopra se si è verificato un picco basandomi sulla temperatura ottenuta dalla misura precedente di un sensore (Per esempio se l'ultima misurazione è di 100 gradi più elevata della precedente c'è stato un picco), se nella prima misurazione che eseguo si presenta un picco tutte le misurazioni successive risulteranno sbagliate. La mia idea è stata quindi quella di eseguire due misurazioni e prendere il risultato più basso come primo valore del grafico, ma se si presentano due picchi (o più) in successione? Quel è secondo voi il miglior approccio ad un problema del genere?

Grazie mille!

5 Risposte

  • Re: Filtrare picchi in misurazioni di temperatura

    Stai svolgendo un esercizio di fisica ?
  • Re: Filtrare picchi in misurazioni di temperatura

    Misurano tutti e tre la stessa temperatura?
    sai quanto cambia la temperatura in base al tempo?
  • Re: Filtrare picchi in misurazioni di temperatura

    No, informatica.
    La temperatura è la stessa e la frequenza di aggiornamento la decido io, mi chiedevo sole se ci fosse un modo migliore di farlo di quello che ho implementato io, perché non è error free.
  • Re: Filtrare picchi in misurazioni di temperatura

    Guarda il problema della misurazione di temperatura precisa su un oggetto risulta frequente in termodinamica. Ho affrontato diverse volte questi casi cercando di risolverli poi nella maniera piu' semplice possibile.

    In teoria per ottenere dati precisi sulla misurazione di temperatura in un tempo che va da t0 a t1, dovresti acquisire quante piu' misurazioni possibili.

    Maggiore e' il numero di misurazioni che acquisisci, migliore sara' il risultato finale.
    Naturalmente non puoi utilizzare tutte le misurazioni acquisite durante i rilevamenti, anche perche' potresti avere dei picchi che porterebbero ad errori e che risulterebbero inutilizzabili.

    Quindi l'unica soluzione e' proprio quella di calcolarti una Gaussiana su tutti i valori acquisiti. Da questo calcolo potrai poi ricavare il valore intermedio che se ricavato da un numero elevato valori di temperatura, grazie alla Gaussiana, elimini anche quei picchi che non servono... almeno li smussi notevolmente.

    Per essere piu' chiaro:
    - se acquisisci soltanto due valori e tra questi prendi quello con la temperatura piu' bassa, commetti un errore assoluto.
    - se acquisci 1000 valori e poi per tutti ne fai una Gaussiana, troverai sicuramente il valore di temperatura piu' vicino a quello reale per un dato tempo.
  • Re: Filtrare picchi in misurazioni di temperatura

    Puoi usare una super media, leggi 85 volte i tre sensori + 1 volta uno a caso e ottinei 256 letture che vanno sommate tra di loro, shifti a destra di 8 volte e sommi uno al volore ottenuto, cosi hai una bassisima media di errore.

    questo è un codice che simula un adc che cresce di valori casuali e ritorna un valore letto tramite la funzione di gaus.
    Leggendo 256 volte l'adc e ricavata la media + 1 allora si ottengono basse percentuali di errori, 0.0001% con errore a 1 e 25% con errore a 5:
    
    #define DELTA 12
    #define ERR 1
    #define COUNT 10000
    int val;
    
    int adcRead(int teoricvalue, int err)
    {
    	return mth_randomgauss(teoricvalue,err);
    }
    
    int adcPrec(int nl, int po)
    {
    	int i,r;
    	for ( i = 0, r = 0; i < nl; ++i ) 
    		r += adcRead(val,ERR);
    	return (r >> po) + 1;
    }
    		
    
    int main()
    {
    	mth_initrandom();
    	
    	printf("Test\n");
    	
    	int i,adc=0;
    	int ok = 0;
    	int ap = 0;
    	val = 0;
    	for ( i = 0; i < COUNT; ++i )
    	{
    		con_cls();
    		adc = adcPrec(256,8);
    		
    		if ( adc == val ) 
    			++ok;
    		else if ( adc + 1 == val || adc -1 == val ) 
    			++ap; 
    		
    		printf("read:%5d err:(%5d)   ok:%5d/%5d/%5d err:%.5f%%   l:%5d/%5d\n",adc,val - adc,ok,ap,(i+1),(100.0 * (double)((i+1) - ok)) / COUNT,i+1,COUNT );
    		
    		if ( mth_random(1) || val <= 0 )
    			val += mth_random(DELTA);
    		else
    			val -= mth_random(DELTA);
    			
    			
    		con_flush();
    		thr_sleep(0.001);
    	}
    	
    	
    	
    	return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
5 risposte