Как "сгладить" данные и рассчитать линейный градиент?
Я читаю данные с устройства, которое измеряет расстояние. Моя частота дискретизации высока, так что я могу измерять большие изменения расстояния (то есть скорости), но это означает, что когда скорость низкая, устройство выполняет ряд измерений, которые идентичны (из-за гранулярности устройства). Это приводит к "ступенчатой" кривой.
Что мне нужно сделать, это сгладить кривую, чтобы рассчитать скорость. После этого мне нужно рассчитать ускорение.
Как лучше всего пойти об этом?
(Частота дискретизации до 1000 Гц, частота вычислений 10 Гц будет в порядке. Использование C# в VS2005)
6 ответов
Запись в Википедии от moogs является хорошей отправной точкой для сглаживания данных. Но это не поможет вам в принятии решения.
Все зависит от ваших данных и необходимой скорости обработки.
Скользящее среднее Сгладит верхние значения. Если вас интересует минимальное и максимальное значение, не используйте это. Также я думаю, что использование скользящей средней повлияет на ваше измерение ускорения, так как оно сгладит ваши данные (немного), поэтому ускорение будет меньше. Все сводится к необходимой точности.
Быстрый алгоритмСавицкого – Голея. Так быстро, как скользящая средняя. Это сохранит высоты вершин. Несколько сложнее реализовать. И вам нужны правильные коэффициенты. Я бы выбрал этот.
Фильтры Калмана Если вы знаете распределение, это может дать вам хорошие результаты (оно используется в системах навигации GPS). Может быть, несколько сложнее реализовать. Я упоминаю об этом, потому что я использовал их в прошлом. Но они, вероятно, не лучший выбор для начинающих в такого рода вещах.
Вышеуказанное снизит уровень шума на вашем сигнале.
Далее вам нужно определить начальную и конечную точку "ускорения". Вы можете сделать это, создав производную от исходного сигнала. Точка (точки), где производная пересекает ось Y (ноль), вероятно, являются пиками в вашем сигнале и могут указывать начало и конец ускорения.
Затем вы можете создать производную второй степени, чтобы получить минимальное и максимальное ускорение.
Вам нужен сглаживающий фильтр, самым простым будет "скользящее среднее": просто вычислите среднее значение за последние n точек.
Вопрос здесь в том, как определить n, можете ли вы рассказать нам больше о вашем приложении?
(Существуют и другие, более сложные фильтры. Они различаются по тому, как они сохраняют входные данные. Хороший список есть в Википедии)
Редактировать!: Для 10 Гц, усредните последние 100 значений.
Скользящие средние обычно ужасны - но хорошо работают для белого шума. Обе скользящие средние и Савицкий-Голей сводятся к корреляции - и поэтому очень быстры и могут быть реализованы в режиме реального времени. Если вам нужна информация более высокого порядка, такая как первая и вторая производные - SG - хороший правильный выбор. Волшебство SG заключается в постоянных коэффициентах корреляции, необходимых для фильтра - после того, как вы определили длину и степень многочлена для локального соответствия, коэффициенты нужно найти только один раз. Вы можете вычислить их, используя R (sgolay) или Matlab.
Вы также можете оценить первую производную зашумленного сигнала с помощью полиномов с наилучшим соответствием Савицкого-Голея - их иногда называют производными Савицкого-Голея - и обычно дают хорошую оценку первой производной.
Фильтрация Калмана может быть очень эффективной, но она тяжелее в вычислительном отношении - трудно справиться с короткой сверткой по скорости!
Павел
Программное обеспечение CenterSpace
В дополнение к вышеупомянутым статьям, взгляните на Сплайны Кэтмулла-Рома.
Вы можете использовать скользящее среднее для сглаживания данных.
В дополнение к превосходному ответу GvS, приведенному выше, вы можете также рассмотреть вопрос о сглаживании / уменьшении эффекта степпинга ваших усредненных результатов с использованием некоторой общей подгонки кривой, такой как кубические или квадратичные сплайны.