Анализ зашумленных данных

Недавно я запустил ракету с барометрическим высотомером, точность которого составляет примерно 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
01238
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

person Nick Larsen    schedule 24.12.2009    source источник
comment
Пожалуйста, используйте метрическую систему. Мы не хотим, чтобы вы случайно разбились на Луне, когда вашей целью было соседнее кукурузное поле ;)   -  person Stefano Borini    schedule 25.12.2009


Ответы (6)


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

#!/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
person Federico A. Ramponi    schedule 24.12.2009
comment
Я начал читать об этом, и это выглядит очень многообещающе. Мне нравится, как это можно адаптировать для работы с несколькими источниками ввода. - person Nick Larsen; 28.12.2009
comment
Код работал нормально и сюжеты. Хорошая работа. Но я не уверен, что график ускорения верен - он слишком точно имитирует скорость, а не ее производную. Ошибка в коде или это особенность фильтрации Калмана? - person DarenW; 12.02.2010

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

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

person Rob Curtis    schedule 24.12.2009
comment
Мне нравится ваш комментарий о полиномиальной подгонке. Возможно, полет можно разделить на два: до окончания тяги и после. После толчка парабола была бы естественной подгонкой для полинома, а до этого - какой-нибудь полином чуть более высокого порядка (3 или 4?). Экстремальные значения, такие как ранние 229, должны стать выбросами и исчезнуть. - person user32848; 25.12.2009
comment
Этот ответ находится прямо на пути. Для поиска просто нужно конкретное имя ... поскольку ускорение и скорость являются производными по времени, вам следует изучить Савицки-Голея. Это описано в числовых рецептах и ​​во многих местах в Интернете. Определяемый как подгонка полинома низкого порядка в каждой точке, он сглаживает данные и принимает производный порядок в качестве параметра. Это лучше численно, чем сглаживание, а затем дифференцирование по отдельным шагам. SG особенно хорош в сохранении пиков, точек перегиба и т. д., тогда как наивные попытки сглаживания обычно стирают пики и другие мелкие детали. - person DarenW; 12.02.2010

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

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

Вы также можете попробовать использовать автокорреляцию.

person Stefano Borini    schedule 25.12.2009
comment
Я на самом деле пробовал это, однако я пробовал это только с размером окна 3. Возможно, некоторые тесты с большим окном помогут получить более качественные данные, +1 - person Nick Larsen; 28.12.2009
comment
Форма окна имеет значение. Если вы возьмете простое среднее n точек слева и n справа вместе с точкой в ​​центре, вы получите некоторый шум на выходе, потому что точки на концах входят/выходят из диапазона, когда вы перемещаетесь к рассчитать следующую выходную точку. Лучше всего рассчитывать средневзвешенное значение - тем меньше веса придается точкам, чем дальше они от центральной точки. См. другие ответы для хороших способов сделать это. - person DarenW; 12.02.2010
comment
@DarenW: это очень хорошая идея. как вы сказали, таким образом вы уменьшаете присутствие точки по принципу "все или ничего"... - person Stefano Borini; 12.02.2010

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

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

person Thomas Sidoti    schedule 24.12.2009

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

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

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

  1. Контролируйте максимальную высоту на протяжении всего полета.
  2. Непрерывно следите за апогеем, (скажем, просто) сравнивая самые последние несколько точек с текущим максимумом.
  3. Пока вы не достигнете максимума, с фиксированным (0,0) и некоторым произвольным набором узлов вычислите набор естественных сплайнов до текущей высоты. Используйте остатки относительно сплайнов, чтобы решить, какие данные отбросить. Пересчитайте сплайны.
  4. По максимуму сохраняйте самые последние рассчитанные сплайны. Начните вычислять новый набор сплайнов для кривой за апогеем.
person Bill Bell    schedule 25.12.2009
comment
Насколько я понимаю, сплайны более полезны для создания точных копий непрерывных данных, чем для интерполяции отсутствующих или зашумленных точек данных. Я что-то упускаю? Чтобы определить апогей, мы берем каждую точку данных для последних 20 выборок и сравниваем ее с последними 20 выборками перед каждой. Как только все образцы показывают снижение высоты, мы говорим, что апогей является самым высоким зарегистрированным значением в течение этого интервала. - person Nick Larsen; 28.12.2009
comment
Ты прав. Небрежное мышление. Извинения. Пытался выразить: мне кажется, что это не неровный набор данных, который часто можно увидеть во временном ряду, и вы можете пропустить задачу идентификации сложной структуры ошибок. С самого начала полета продолжайте подгонять легкие плавные кривые, пока не достигнете апогея, отбрасывая выбросы, которые кажутся очевидными из сделанного мной графика. (Очевидны ли они для вас?) Затем, после того, как вы достигли апогея, начните подгонять четкий набор простых плавных кривых для остальной части полета, снова отбрасывая выбросы. В данном случае сплайн = мозг f__t - person Bill Bell; 28.12.2009

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

person Niklas R.    schedule 25.12.2009