2009-12-24 14 views
8

Recentemente ho lanciato un razzo con un altimetro barometrico con una precisione di circa 10 piedi (calcolato tramite i dati acquisiti durante il volo). I dati registrati sono in incrementi di tempo di 0,05 secondi per campione e un grafico dell'altitudine rispetto al tempo sembra più o meno come dovrebbe quando si esegue lo zoom sull'intero volo.Analisi dei dati rumorosi

Il problema è quando cerco di calcolare altri valori come velocità o accelerazione dai dati, l'accuratezza delle misurazioni rende i valori calcolati praticamente inutili. Quali tecniche posso utilizzare per appianare i dati in modo da poter calcolare (o approssimare) i valori ragionevoli per la velocità e l'accelerazione? È importante che gli eventi principali rimangano nel tempo, in particolare lo 0 per il primo ingresso e il punto più alto durante il volo (2707).

I dati di altitudine seguono e sono misurati in ft sopra il livello del suolo. La prima volta sarebbe 0.00 e ogni campione è 0.05 secondi dopo il campione precedente. Il picco all'inizio del volo è dovuto a un problema tecnico che si è verificato durante il decollo e la rimozione del picco è ottimale.

ho inizialmente provato mediante interpolazione lineare, con una media punti di dati vicine, ma ci sono voluti molti iterazioni per lisciare i dati sufficienti per l'integrazione e l'appiattimento della curva rimosso gli importanti eventi apogeo e livello del suolo.

Tutto l'aiuto è molto apprezzato. Si prega di notare che questo non è il set di dati completo e sto cercando suggerimenti su modi migliori per analizzare i dati, non che qualcuno possa rispondere con un set di dati trasformato. Sarebbe bello usare un algoritmo a bordo di razzi futuri in grado di prevedere l'attuale altitudine/velocità/accelerazione senza conoscere i dati di volo completi, sebbene ciò non sia richiesto.

00000 
00000 
00000 
00076 
00229 
00095 
00057 
00038 
00048 
00057 
00057 
00076 
00086 
00095 
00105 
00114 
00124 
00133 
00152 
00152 
00171 
00190 
00200 
00219 
00229 
00248 
00267 
00277 
00286 
00305 
00334 
00343 
00363 
00363 
00382 
00382 
00401 
00420 
00440 
00459 
00469 
00488 
00517 
00527 
00546 
00565 
00585 
00613 
00633 
00652 
00671 
00691 
00710 
00729 
00759 
00778 
00798 
00817 
00837 
00856 
00885 
00904 
00924 
00944 
00963 
00983 
01002 
01022 
01041 
01061 
01080 
01100 
01120 
01139 
01149 
01169 
01179 
01198 
01218 

01257 
01277 
01297 
01317 
01327 
01346 
01356 
01376 
01396 
01415 
01425 
01445 
01465 
01475 
01495 
01515 
01525 
01545 
01554 
01574 
01594 
01614 
01614 
01634 
01654 
01664 
01674 
01694 
01714 
01724 
01734 
01754 
01764 
01774 
01794 
01804 
01814 
01834 
01844 
01854 
01874 
01884 
01894 
01914 
01924 
01934 
01954 
01954 
01975 
01995 
01995 
02015 
02015 
02035 
02045 
02055 
02075 
02075 
02096 
02096 
02116 
02126 
02136 
02146 
02156 
02167 
02177 
02187 
02197 
02207 
02217 
02227 
02237 
02237 
02258 
02268 
02278 
02278 
02298 
02298 
02319 
02319 
02319 
02339 
02349 
02359 
02359 
02370 
02380 
02380 
02400 
02400 
01914 
02319 
02420 
02482 
02523 
02461 
02502 
02543 
02564 
02595 
02625 
02666 
02707 
02646 
02605 
02605 
02584 
02574 
02543 
02543 
02543 
02543 
02543 
02543 
02554 
02543 
02554 
02554 
02554 
02554 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02533 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02543 
02533 
02523 
02523 
02523 
02523 
02523 
02523 
02523 
02523 
02543 
02523 
02523 
02523 
02523 
02523 
02523 
02523 
02523 
02513 
02513 
02502 
02502 
02492 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02482 
02472 
02472 
02472 
02461 
02461 
02461 
02461 
02451 
02451 
02451 
02461 
02461 
02451 
02451 
02451 
02451 
02451 
02451 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02441 
02431 
02441 
02431 
02441 
02431 
02420 
02431 
02420 
02420 
02420 
02420 
02420 
02420 
02420 
02420 
02420 
02420 
02420 
02420 
02410 
02420 
02410 
02410 
02410 
02410 
02400 
02400 
02410 
02400 
02400 
02400 
02400 
02400 
02400 
02400 
02400 
02400 
02400 
02400 
02400 
02390 
02390 
02390 
02380 
02380 
02380 
02380 
02380 
02380 
02380 
02380 
02380 
02380 
02380 
02380 
02380 
02370 
02370 
02380 
02370 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02359 
02349 
02349 
02349 
02349 
02349 
02339 
02339 
02339 
02339 
02339 
02339 
02339 
02339 
02339 
02339 
02339 
02339 
02339 
+1

+1 per awesomeness! –

+1

si prega di utilizzare il sistema metrico. Non vogliamo che tu ti accidentalmente schiantato sulla luna quando il tuo obiettivo era il campo di grano vicino;) –

risposta

8

Ecco la mia soluzione, utilizzando un Kalman filter. Sarà necessario sintonizzare i parametri (anche + - ordini di grandezza) se si desidera uniformare più o meno.

#!/usr/bin/env octave 

% Kalman filter to smooth measures of altitude and estimate 
% speed and acceleration. The continuous time model is more or less as follows: 
% derivative of altitude := speed 
% derivative of speed := acceleration 
% acceleration is a Wiener process 

%------------------------------------------------------------ 
% Discretization of the continuous-time linear system 
% 
% d |x| | 0 1 0 | |x| 
% --- |v| = | 0 0 1 | |v| + "noise" 
% dt |a| | 0 0 0 | |a| 
% 
% y = [1 0 0] |x|  + "measurement noise" 
%    |v| 
%    |a| 
% 
st = 0.05; % Sampling time 
A = [1 st st^2/2; 
    0 1 st ; 
    0 0 1]; 
C = [1 0 0]; 

%------------------------------------------------------------ 
% Fine-tune these parameters! (in particular qa and R) 
% The acceleration follows a "random walk". The greater is the variance qa, 
% the more "reactive" the system is expected to be, i.e. 
% the more the acceleration is expected to vary 
% The greater is R, the more noisy is your measurement instrument 
% (less "accuracy" of the barometric altimeter); 
% if you increase R, you will smooth the estimate more 
qx = 1.0;      % Variance of model noise for position 
qv = 1.0;      % Variance of model noise for speed 
qa = 50.0;      % Variance of model noise for acceleration 
Q = diag([qx, qv, qa]); 
R = 100.0;     % Variance of measurement noise 
           % (10^2, if 10ft is the standard deviation) 

load data.txt % Put your measures in this file 

est_position  = zeros(length(data), 1); 
est_speed  = zeros(length(data), 1); 
est_acceleration = zeros(length(data), 1); 

%------------------------------------------------------------ 
% Kalman filter 
xhat = [0;0;0];  % Initial estimate 
P = zeros(3,3); % Initial error variance 
for i=1:length(data), 
    y = data(i); 
    xpred = A*xhat;         % Prediction 
    Ppred = A*P*A' + Q;        % Prediction error variance 
    Lambdainv = 1/(C*Ppred*C' + R); 
    xhat = xpred + Ppred*C'*Lambdainv*(y - C*xpred); % Update estimation 
    P = Ppred - Ppred*C'*Lambdainv*C*Ppred;   % Update estimation error variance 
    est_position(i)  = xhat(1); 
    est_speed(i)  = xhat(2); 
    est_acceleration(i) = xhat(3); 
end 

%------------------------------------------------------------ 
% Plot 
figure(1); 
hold on; 
plot(data, 'k');    % Black: real data 
plot(est_position, 'b');  % Blue: estimated position 
plot(est_speed, 'g');   % Green: estimated speed 
plot(est_acceleration, 'r'); % Red: estimated acceleration 
pause 
+0

Ho iniziato a leggere su questo e sembra molto promettente. Mi piace come questo può essere adattato per prendere più fonti di input. –

+0

Il codice è andato bene e stampa. Bel lavoro. Ma non sono sicuro che la trama dell'accelerazione sia giusta - imita la velocità troppo da vicino, non la sua derivata. Un difetto nel codice, o si tratta di un capriccio del filtraggio di Kalman? – DarenW

3

Si potrebbe provare a eseguire i dati tramite un filtro passa-basso. Questo attenuerà il rumore ad alta frequenza. Forse un semplice FIR.

Inoltre, è possibile estrarre i principali eventi dai dati grezzi, ma utilizzare un adattamento polinomiale per i dati di velocità e accelerazione.

+0

Mi piace il tuo commento sulla forma polinomiale. Forse il volo potrebbe essere diviso in due: prima che la spinta sia finita e dopo. Dopo la spinta, una parabola sarebbe un adattamento naturale per un polinomio e prima ancora un polinomio con un ordine leggermente più alto (3 o 4?). Valori estremi come i primi "229" dovrebbero diventare valori anomali e scomparire. – user32848

+1

Questa risposta è sulla buona strada. Ha solo bisogno di un nome specifico per cercare ... poiché l'accelerazione e la velocità sono derivate rispetto al tempo, dovresti esaminare Savitzky-Golay. È descritto in Numerical Recipes e online in molti posti. Definito come un adattamento polinomiale di ordine basso in ogni punto, attenua i dati e prende un ordine derivativo come parametro. Questo è migliore numericamente di smoothing e quindi di differenziazione in passaggi separati. S.G. è particolarmente adatto a preservare picchi, punti di inflessione, ecc., Mentre i tentativi ingenui di levigare tipicamente aumentano i picchi e altri dettagli fini. – DarenW

1

Un modo in cui è possibile analizzare i dati è cercare di associarli anche ad alcuni modelli, generare una funzione e quindi test its fitness to your data set .... Questo può essere piuttosto complicato e probabilmente non è necessario ... ma il punto è che invece di generare dati di accelerazione/velocità direttamente dai tuoi dati, puoi abbinarli al tuo modello (piuttosto semplice per un razzo, qualche accelerazione verso l'alto seguita da una discesa a velocità costante lenta). Almeno così come lo farei in un esperimento di fisica.

Come per generare un certo senso di velocità e accelerazione durante il volo, questo dovrebbe essere il calcolo della media della velocità da diversi risultati diversi. Qualcosa sulla falsariga di: EsitimatedV = Vmeasured * (1/n) + (1 - 1/n) * StimatoV. Imposta n in base alla velocità con cui vuoi che la tua velocità si adegui.

1

Non so niente di razzi. Ho tracciato i tuoi punti e sono belli.

Basandomi su quello che vedo in quella trama, supponiamo che di solito ci sia un solo apogeo e che la funzione che ha dato origine ai tuoi punti non abbia tempo derivato da zero in quell'apogeo.

Suggerimento:

  1. Monitor quota massima per tutto il volo.
  2. Osservare continuamente l'apogeo tramite (diciamo semplicemente) confrontando i punti più recenti con il massimo corrente.
  3. Fino a raggiungere il valore massimo, con (0,0) corretto e una serie arbitraria di nodi calcolare una raccolta di spline naturali fino all'altitudine corrente. Usa i residui delle spline per decidere quali dati scartare. Ricalcola le spline.
  4. Al massimo mantiene le spline di calcolo più recenti. Iniziare a calcolare un nuovo set di spline per la curva oltre l'apogeo.
+0

Dalla mia comprensione delle spline è che sono più utili per generare repliche esatte di dati continui di quanto non stiano interpolando punti dati mancanti o rumorosi. Mi sto perdendo qualcosa? Per determinare l'apogeo, prendiamo ogni punto dati per gli ultimi 20 campioni e confrontalo con gli ultimi 20 campioni prima di ciascuno. Quando tutti i campioni mostrano un calo di altitudine, diciamo che l'apogeo è il valore registrato più alto durante quell'intervallo. –

+0

Hai ragione. Pensiero sciatto. Scuse. Stavo cercando di esprimere: mi sembra che questo non sia il set di dati frastagliato che si vede spesso in una serie temporale e si potrebbe omettere il compito di identificare una struttura di errore complicata. Dall'inizio di un volo mantieni curve facili e lisce fino a raggiungere l'apogeo, scartando i valori anomali - che appaiono evidenti dalla trama che ho realizzato. (Ti sono ovvi però?) Quindi, dopo che hai colpito l'apogeo, inizia a montare un insieme distinto di curve morbide per il resto del volo, di nuovo scartando i valori anomali. In questo caso, spline = "brain f__t" –

2

hai provato a eseguire una media della finestra a scorrimento dei valori? Fondamentalmente si esegue una finestra di, diciamo 10 valori (da 0 a 9) e si calcola la sua media. quindi scorri la finestra di un punto (da 1 a 10) e ricalcoli. Questo livella i valori mantenendo il numero di punti relativamente invariato. Le finestre più grandi offrono dati più fluidi al prezzo di perdere più informazioni ad alta frequenza.

È possibile utilizzare la mediana anziché la media se i dati presentano picchi anomali.

Puoi anche provare con Autocorrelation.

+0

In realtà ho provato questo, tuttavia, l'ho provato solo su una finestra di dimensioni pari a 3. Forse alcuni test su finestre più grandi avrebbero migliorato i dati, +1 –

+0

La forma del la finestra conta. Se si prende una semplice media pianura di n punti a sinistra e n a destra, insieme con il punto al centro, si ottiene un po 'di rumore in uscita, perché i punti alle estremità stanno entrando/lasciando il campo come ci si sposta a calcolare il prossimo punto di uscita. È meglio calcolare una media ponderata - meno peso dato ai punti più lontano dal punto centrale. Vedi altre risposte per buoni modi per farlo. – DarenW

+0

@DarenW: questa è un'ottima idea. come hai detto, in questo modo riduci la presenza "tutto o niente" di un punto ... –

0

Il modello ARIMA e cercare l'autocorrelazione nei residui è una procedura standard. La volatilità ne modella un'altra.