Как «сгладить» данные и рассчитать линейный градиент? - PullRequest
9 голосов
/ 15 октября 2008

Я читаю данные с устройства, которое измеряет расстояние. Моя частота дискретизации высока, поэтому я могу измерять большие изменения расстояния (то есть скорости), но это означает, что при низкой скорости устройство выполняет ряд измерений, которые идентичны (из-за гранулярности устройства). Это приводит к «ступенчатой» кривой.

Что мне нужно сделать, это сгладить кривую, чтобы рассчитать скорость. После этого мне нужно рассчитать ускорение.

Как лучше всего это сделать?

(Частота дискретизации до 1000 Гц, частота вычислений 10 Гц будет в порядке. Использование C # в VS2005)

Ответы [ 6 ]

26 голосов
/ 15 октября 2008

Запись в Википедии от moogs является хорошей отправной точкой для сглаживания данных. Но это не поможет вам принять решение.

Все зависит от ваших данных и необходимой скорости обработки.

Скользящая средняя Сгладит верхние значения. Если вас интересует минимальное и максимальное значение, не используйте это. Также я думаю, что использование скользящей средней повлияет на ваше измерение ускорения, поскольку оно сгладит ваши данные (немного), поэтому ускорение будет меньше. Все сводится к необходимой точности.

Савицкий-Гол Быстрый алгоритм. Так быстро, как скользящая средняя. Это сохранит высоты вершин. Несколько сложнее реализовать. И вам нужны правильные коэффициенты. Я бы выбрал этот.

фильтры Калмана Если вы знаете распределение, это может дать вам хорошие результаты (оно используется в системах навигации GPS). Может быть, несколько сложнее реализовать. Я упоминаю об этом, потому что я использовал их в прошлом. Но они, вероятно, не лучший выбор для начинающих в такого рода вещах.

Вышеуказанное снизит уровень шума в вашем сигнале.

Далее вам нужно определить начальную и конечную точку «ускорения». Вы можете сделать это, создав Производное исходного сигнала. Точка (точки), где производная пересекает ось Y (ноль), вероятно, являются пиками в вашем сигнале и могут указывать начало и конец ускорения.

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

9 голосов
/ 15 октября 2008

Вам нужен сглаживающий фильтр, самым простым будет «скользящее среднее»: просто вычислите среднее значение за последние n точек.

Вопрос здесь в том, как определить n, можете ли вы рассказать нам больше о вашем приложении?

(Существуют и другие, более сложные фильтры. Они различаются по тому, как они сохраняют входные данные. Хороший список есть в Wikipedia )

Редактировать!: Для 10 Гц, усреднить последние 100 значений.

3 голосов
/ 05 ноября 2009

Скользящие средние, как правило, ужасны, но хорошо работают для белого шума. Обе скользящие средние и Савицкий-Голей сводятся к корреляции - и поэтому очень быстры и могут быть реализованы в режиме реального времени. Если вам нужна информация более высокого порядка, такая как первая и вторая производные - SG - хороший правильный выбор. Магия SG заключается в постоянных коэффициентах корреляции, необходимых для фильтра - после того, как вы определили длину и степень полинома для локального соответствия, коэффициенты нужно найти только один раз. Вы можете вычислить их, используя R (sgolay) или Matlab.

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

Фильтрация Калмана может быть очень эффективной, но она тяжелее в вычислительном отношении - трудно справиться с короткой сверткой по скорости!

Пол
Программное обеспечение CenterSpace

1 голос
/ 15 октября 2008

В дополнение к вышеупомянутым статьям, взгляните на Сплайны Catmull-Rom .

0 голосов
/ 15 октября 2008

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

0 голосов
/ 15 октября 2008

Вы можете использовать скользящее среднее для сглаживания данных.

...