2009-12-24 3 views
8

Недавно я запустил ракету с барометрическим высотомером, точность которой составляет примерно 10 футов (рассчитывается по данным, полученным во время полета). Записанные данные поступают во времени с шагом 0,05 сек на образец, а график высоты и времени выглядит примерно так, как если бы он был увеличен на весь полёт.Анализ шумных данных

Проблема заключается в том, что при попытке вычислить другие значения, такие как скорость или ускорение данных, точность измерений делает расчетные значения практически бесполезными. Какие методы я могу использовать для сглаживания данных, чтобы я мог рассчитать (или приблизительные) разумные значения скорости и ускорения? Важно, чтобы важные события сохранялись во времени, в первую очередь 0 для первой записи и самой высокой точки во время полета (2707).

Данные о высоте следует и измеряется в футах над уровнем земли. Первый раз будет 0.00 и каждый образец будет 0,05 секунды после предыдущего образца. Шип в начале полета обусловлен технической проблемой, возникшей во время подъема и удалением всплеска, является оптимальным.

Я изначально попытался использовать линейную интерполяцию, усредняв близлежащие точки данных, но потребовалось много итераций, чтобы сгладить данные, достаточные для интеграции, и сглаживание кривой удалило важные события апогея и уровня земли.

Вся помощь с благодарностью. Обратите внимание, что это не полный набор данных, и я ищу предложения по лучшим способам анализа данных, а не для кого-то, кто отвечает преобразованным набором данных. Было бы неплохо использовать алгоритм на будущих ракетах, который может предсказать текущую высоту/скорость/ускорение, не зная полных данных полета, хотя это не требуется.

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 для удивительности! –

+1

используйте метрическую систему. Мы не хотим, чтобы вы случайно попали на Луну, когда ваша цель была соседним кукурузным полем;) –

ответ

8

Это мое решение, используя Kalman filter. Вам нужно будет настроить параметры (даже + - порядки величины), если вы хотите сгладить больше или меньше.

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

Я начал читать об этом, и это выглядит очень многообещающим. Мне нравится, как это можно адаптировать для использования нескольких источников ввода. –

+0

Код прошел отлично и заговорил. Хорошая работа. Но я не уверен, что график ускорения прав - он слишком точно имитирует скорость, а не ее производную. Ошибка в коде, или это причуда фильтрации Калмана? – DarenW

3

Вы можете попробовать запустить данные через фильтр нижних частот. Это сгладит высокочастотный шум. Может быть, простой РПИ.

Кроме того, вы можете вытащить основные события из необработанных данных, но используйте полиномиальное соответствие для данных скорости и ускорения.

+0

Мне нравятся ваши комментарии о пригодности полинома. Возможно, полет можно разделить на два: до того, как тяга закончится и после. После тяги парабола была бы естественным подходом для полинома, а до этого был бы некоторый многочлен со слегка более высоким порядком (3 или 4?). Крайние ценности, такие как ранние «229», должны стать выбросами и исчезнуть. – user32848

+1

Этот ответ на правильном пути. Ему просто нужно определенное имя для поиска ... поскольку ускорение и скорость являются производными, относящимися ко времени, вы должны заглянуть в Савицки-Голай. Это описано в Numerical Recipes и онлайн во многих местах. Определенный как многочлен низкого порядка в каждой точке, он сглаживает данные и принимает производный порядок в качестве параметра. Это лучше, чем сглаживание, а затем дифференцирование в отдельных шагах. S.G. особенно хорош в сохранении пиков, точек перегиба и т. Д., Тогда как наивные попытки сглаживания обычно вытесняют пики и другие мелкие детали. – DarenW

1

Один из способов, которым вы можете подходить к анализу данных, - попытаться сопоставить его с некоторой моделью, сгенерировать функцию, а затем test its fitness to your data set .... Это может быть довольно сложным и, вероятно, не нужно ... но дело в том, что вместо того, чтобы генерировать данные ускорения/скорости непосредственно из ваших данных, вы можете сопоставить их с вашей моделью (довольно просто для ракеты, некоторое ускорение вверх, за которым следует медленное спуск с низкой скоростью). По крайней мере, так, как я буду делать это в физическом эксперименте.

Что касается генерирования некоторого чувства скорости и ускорения во время полета, это должно быть простым усреднением скорости от нескольких разных результатов. Что-то по строкам: EsitimatedV = Vmeasured * (1/n) + (1 - 1/n) * Оценено V. Установите n в зависимости от того, как быстро вы хотите настроить скорость.

1

Я ничего не знаю о ракетах. Я построил ваши очки, и они выглядели прекрасными.

Основываясь на том, что я вижу в этом сюжете, позвольте мне предположить, что обычно есть один апогей и что функция, которая породила ваши точки, не имеет производного времени в этом апогее.

Предложение:

  1. Monitor максимальная высота в течение всего полета.
  2. Непрерывно наблюдайте за апогеем (скажем, просто), сравнивая последние несколько точек с текущим максимумом.
  3. Пока вы не достигнете максимума, с фиксированным (0,0) и некоторым произвольным набором узлов вычислите набор естественных сплайнов до текущей высоты. Используйте остатки по сплайнам, чтобы решить, какие данные отказаться. Пересчитать сплайны.
  4. Максимально сохраняйте самые последние сплайны. Начните вычислять новый набор сплайнов для кривой за пределами апогея.
+0

Из моего понимания сплайнов является то, что они более полезны для создания точных копий непрерывных данных, чем интерполирование отсутствующих или шумных точек данных. Я что-то упускаю? Чтобы определить апогей, мы берем каждую точку данных за последние 20 выборок и сравниваем ее с последними 20 образцами перед каждым. Как только все образцы показывают снижение высоты, мы говорим, что апогей является наивысшим зарегистрированным значением в течение этого интервала. –

+0

Вы правы. Небрежное мышление. Извиняюсь. Я пытался выразить: мне кажется, что это не зубчатый набор данных, который часто видят во временном ряду, и вы можете опустить задачу определения сложной структуры ошибок. С самого начала полета продолжайте укладывать легкие гладкие кривые, пока не нажмете апогей, отбросив выбросы, которые очевидны из сюжета, который я сделал. (Являются ли они очевидными для вас?) Затем, после того, как вы нажмете апогей, начните подгонять отличный набор легких плавных кривых для остальной части полета, снова отбросив выбросы. В этом случае spline = "brain f__t" –

2

Вы пытались выполнить прокручивание окна в среднем по вашим значениям? В основном вы выполняете окно, например, 10 значений (от 0 до 9) и вычисляете его среднее значение. затем вы прокручиваете окно на одну точку (от 1 до 10) и пересчитываете. Это сгладит значения, сохранив при этом количество точек без изменений. Большие окна дают более плавные данные по цене потери более высокочастотной информации.

Вы можете использовать медианную, а не среднюю, если ваши данные имеют избыточные всплески.

Вы также можете попробовать с Autocorrelation.

+0

Я действительно пробовал это, однако, я только пробовал его по размеру окна 3. Возможно, некоторые более крупные тесты окон сделают для улучшения данных, +1 –

+0

Форма окно имеет значение. Если вы делаете простой простой средний n точек слева и n вправо, вместе с точкой в ​​центре, вы получаете некоторый шум на выходе, потому что точки на концах входят/выходят из диапазона при переходе на вычислить следующую точку вывода. Лучше рассчитать средневзвешенный - меньший вес, данный точкам, дальше от центральной точки. См. Другие ответы для хороших способов сделать это. – DarenW

+0

@DarenW: Это очень хорошая идея. как вы сказали, таким образом вы уменьшаете «все или ничего» наличие точки ... –

0

Модель ARIMA и поиск автокорреляции в остаточном состоянии является стандартной процедурой. Модель волатильности другая.

Смежные вопросы