2009-12-24 20 views
8

Recientemente lancé un cohete con un altímetro barométrico que tiene una precisión de aproximadamente 10 pies (calculado a través de los datos adquiridos durante el vuelo). Los datos grabados están en incrementos de tiempo de 0.05 segundos por muestra y un gráfico de altitud vs. tiempo se ve bastante parecido a cuando debería alejarse durante todo el vuelo.Análisis de datos ruidosos

El problema es que cuando trato de calcular otros valores como la velocidad o la aceleración a partir de los datos, la precisión de las mediciones hace que los valores calculados sean prácticamente inútiles. ¿Qué técnicas puedo usar para suavizar los datos de manera que pueda calcular (o aproximar) valores razonables para la velocidad y la aceleración? Es importante que los eventos importantes permanezcan en su lugar a tiempo, especialmente el 0 para la primera entrada y el punto más alto durante el vuelo (2707).

Los datos de altitud siguen y se miden en pies sobre el nivel del suelo. La primera vez sería 0.00 y cada muestra es 0.05 segundos después de la muestra anterior. El pico al comienzo del vuelo se debe a un problema técnico que ocurrió durante el despegue y la eliminación del pico es óptima.

Intenté originalmente utilizar la interpolación lineal, promediando puntos de datos cercanos, pero se necesitaron muchas iteraciones para suavizar los datos lo suficiente para la integración y el aplanamiento de la curva eliminó los eventos importantes de apogeo y nivel del suelo.

Toda ayuda es muy apreciada. Tenga en cuenta que este no es el conjunto de datos completo y estoy buscando sugerencias sobre mejores formas de analizar los datos, no para que alguien responda con un conjunto de datos transformados. Sería bueno usar un algoritmo a bordo de futuros cohetes que pueda predecir la altitud/velocidad/aceleración actuales sin conocer los datos de vuelo completos, aunque eso no es necesario.

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 por genialidad! –

+1

por favor use el sistema métrico. No queremos que se estrelle accidentalmente en la luna cuando su objetivo era el campo de maíz vecino;) –

Respuesta

8

Aquí está mi solución, usando un Kalman filter. Tendrá que ajustar los parámetros (incluso + - órdenes de magnitud) si quiere suavizar más o menos.

#!/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

Comencé a leer sobre esto y parece muy prometedor. Me gusta cómo se puede adaptar esto para tomar múltiples fuentes de entrada. –

+0

El código se ejecutó bien y trazó. Buen trabajo. Pero no estoy seguro de que la trama de aceleración sea correcta: imita demasiado la velocidad, no su derivada. Una falla en el código, o es esto una peculiaridad del filtrado de Kalman? – DarenW

3

Se podría intentar ejecutar los datos a través de un filtro de paso bajo. Esto suavizará el ruido de alta frecuencia. Quizás una FIR simple.

Además, podría extraer sus eventos principales de los datos brutos, pero usar un ajuste polinomial para datos de velocidad y aceleración.

+0

Me gusta su comentario sobre el ajuste polinómico. Quizás el vuelo podría dividirse en dos: antes de que el empuje se termine y después. Después del empuje, una parábola sería un ajuste natural para un polinomio y, antes, un polinomio con un orden ligeramente superior (3 o 4?). Los valores extremos como los primeros "229" deberían convertirse en valores atípicos y desaparecer. – user32848

+1

Esta respuesta va por buen camino. Solo necesita un nombre específico para buscar ... ya que la aceleración y la velocidad son derivados con respecto al tiempo, debes mirar a Savitzky-Golay. Se describe en Recetas numéricas y en línea en muchos lugares. Definido como un ajuste de polinomio de orden bajo en cada punto, suaviza los datos y toma un orden derivado como parámetro. Esto es mejor numéricamente que suavizar y luego diferenciar en pasos separados. S.G. es especialmente bueno para conservar los picos, los puntos de inflexión, etc., mientras que los intentos ingenuos de suavizar suelen acumular picos y otros detalles finos. – DarenW

1

Una forma en que puede enfocar el análisis de sus datos es tratar de emparejarlo también con algún modelo, generar una función y luego test its fitness to your data set .... Esto puede ser bastante complicado y probablemente innecesario ... pero el punto es que en lugar de generar datos de aceleración/velocidad directamente de sus datos, puede compararlos con su modelo (algo simple para un cohete, una aceleración hacia arriba seguida de un lento descenso constante de velocidad). Al menos así lo haría en un experimento de física.

En cuanto a generar algún sentido de velocidad y aceleración durante el vuelo, esto debería ser tan simple como promediar la velocidad de varios resultados diferentes. Algo similar a: EsitimatedV = Vmeasured * (1/n) + (1 - 1/n) * EstimatedV. Establezca n en función de la velocidad con la que desee ajustar su velocidad.

1

No sé nada de cohetes. Tracé tus puntos y se ven preciosos.

En base a lo que veo en esa trama, déjenme suponer que generalmente hay un solo apogeo y que la función que dio lugar a sus puntos no tiene un tiempo derivativo en ese apogeo.

Sugerencia:

  1. Monitor de altitud máxima durante todo el vuelo.
  2. Mire atentamente por el apogeo (por ejemplo, simplemente) comparando los pocos puntos más recientes con el máximo actual.
  3. Hasta llegar al máximo, con (0,0) conjunto fijo y algunos arbitrarios de nudos calcular una colección de splines naturales hasta la altitud actual. Usa los residuos de las splines para decidir qué datos descartar. Recalcular las splines.
  4. Como máximo, conserve las splines de cálculo más recientes. Comience a calcular un nuevo conjunto de splines para la curva más allá del apogeo.
+0

Desde mi punto de vista de splines es que son más útiles para generar réplicas exactas de datos continuos que interpolar puntos de datos faltantes o ruidosos. ¿Me estoy perdiendo de algo? Para determinar el apogeo, tomamos cada punto de datos para las últimas 20 muestras y lo comparamos con las últimas 20 muestras antes de cada una. Una vez que todas las muestras muestran una disminución en la altitud, decimos que el apogeo es el valor más alto registrado durante ese intervalo. –

+0

Tienes razón. Sloppy pensando. Disculpas Estaba tratando de expresarlo: me parece que este no es el conjunto irregular de datos que uno ve a menudo en una serie temporal y es posible que omita la tarea de identificar una estructura de error complicada. Desde el comienzo de un vuelo, siga ajustando curvas suaves y fáciles hasta llegar al apogeo, descartando valores atípicos, que parecen obvios en la trama que hice. (¿Son obvios para usted?) Luego, después de golpear el apogeo, comience a ajustar un conjunto distinto de curvas suaves fáciles para el resto del vuelo, nuevamente descartando valores atípicos. En este caso, spline = "brain f__t" –

2

¿Ha intentado realizar una ventana de desplazamiento promedio de sus valores? Básicamente se realiza una ventana de, digamos 10 valores (de 0 a 9), y se calcula su promedio. luego desplaza la ventana un punto (de 1 a 10) y recalcula. Esto suavizará los valores mientras mantiene el número de puntos relativamente sin cambios. Las ventanas más grandes brindan datos más uniformes a costa de perder más información de alta frecuencia.

Puede utilizar la mediana en lugar de la media si sus datos presentan picos de valores atípicos.

También puedes probar con Autocorrelation.

+0

De hecho, intenté esto, sin embargo, solo lo probé en un tamaño de ventana de 3. Tal vez algunas pruebas de ventana más grandes mejorarían los datos, +1 –

+0

La forma del la ventana importa Si toma un promedio sencillo simple de n puntos a la izquierda y a la derecha, junto con el punto en el centro, se produce un poco de ruido en la salida porque los puntos en los extremos están entrando/saliendo del rango a medida que se mueve a calcule el siguiente punto de salida. Es mejor calcular un promedio ponderado, menos peso dado a los puntos cuanto más lejos están del punto central. Vea otras respuestas para buenas maneras de hacer esto. – DarenW

+0

@DarenW: es una muy buena idea. como dijiste, de esta manera reduces la presencia de "todo o nada" de un punto ... –

0

El modelo ARIMA y busca la autocorrelación en el residuo es un procedimiento estándar. Volatility model otro.

Cuestiones relacionadas