Как «сгладить» данные и рассчитать градиент линии?

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
10 999
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

Не могли бы вы объяснить, почему использовать 100 значений для 10 Гц? Спасибо.

Guido 15.10.2008 14:16

@Guido - согласно моей интерпретации того, что он сказал, у него 1000 значений в секунду, но на самом деле ему нужно получать данные только 10 раз в секунду. Итак, простой способ - просто рассматривать 100 значений как одно (получить среднее значение).

moogs 15.10.2008 14:28

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

workmad3 15.10.2008 14:56

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

Ответ принят как подходящий

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

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

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

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

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

Вышеупомянутое снизит шум вашего сигнала.

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

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

Если вы моделируете вещи правильно, фильтр Калмана напрямую даст вам скорость и ускорение.

Peter K. 15.10.2008 14:54

хороший пример кода для Savitzky-Golay можно найти на procoders.net/?p=11

Wouter 07.09.2009 18:26

SG легко реализовать, если у вас есть коэффициенты. Просто используйте сголай Р., чтобы найти их.

Paul 05.11.2009 10:02

Эта ссылка предоставляет JavaApplet, чтобы на самом деле увидеть, как работает Moving, Savitzky-Golay и Ensemble Average chem.uoa.gr/applets/appletsmooth/appl_smooth2.html

user295190 05.11.2010 19:59

#Wouter Ссылка устарела

Chris 25.07.2014 01:11

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

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

SmacL 15.10.2008 14:50

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

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

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

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

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

Другие вопросы по теме