Я читаю данные с устройства, которое измеряет расстояние. Моя частота дискретизации высока, поэтому я могу измерить большие изменения расстояния (то есть скорости), но это означает, что при низкой скорости устройство выполняет ряд идентичных измерений (из-за детализации устройства). В результате получается ступенчатая кривая.
Что мне нужно сделать, так это сгладить кривую, чтобы вычислить скорость. После этого мне нужно рассчитать ускорение.
Как лучше всего это сделать?
(Частота дискретизации до 1000 Гц, частота вычислений 10 Гц подойдет. Использование C# в VS2005)





Вам нужен сглаживающий фильтр, самым простым будет «скользящее среднее»: просто вычислите среднее значение последних n точек.
Вопрос здесь в том, как определить n, можете ли вы подробнее рассказать о своем приложении?
(Есть и другие, более сложные фильтры. Они различаются в зависимости от того, как они сохраняют входные данные. Хороший список находится в Википедия)
Редактировать!: Для 10 Гц усреднить последние 100 значений.
@Guido - согласно моей интерпретации того, что он сказал, у него 1000 значений в секунду, но на самом деле ему нужно получать данные только 10 раз в секунду. Итак, простой способ - просто рассматривать 100 значений как одно (получить среднее значение).
Я думаю, что формулировку здесь можно улучшить ... из вашего последнего комментария я думаю, что идея, к которой вы пришли, заключается в том, что вы получаете 100 значений, усредняете их, получаете еще 100 значений, усредняете их, до бесконечности, чтобы получить усредненные выборки 10 Гц с 1000 Гц Вход.
Вы можете использовать скользящая средняя для сглаживания данных.
Запись в Википедии от moogs - хорошая отправная точка для сглаживания данных. Но это не поможет вам в принятии решения.
Все зависит от ваших данных и необходимой скорости обработки.
Скользящая средняя Сгладит верхние значения. Если вас интересуют минимальное и максимальное значение, не используйте это. Также я думаю, что использование скользящего среднего повлияет на ваше измерение ускорения, поскольку оно сгладит ваши данные (немного), поэтому ускорение будет казаться меньшим. Все сводится к необходимой точности.
Савицкий – Голай Быстрый алгоритм. Так же быстро, как скользящая средняя. Это сохранит высоты пиков. Несколько сложнее реализовать. И вам нужны правильные коэффициенты. Я бы выбрал этот.
Фильтры Калмана Если вы знаете распределение, это может дать вам хорошие результаты (используется в системах навигации GPS). Может быть, несколько сложнее реализовать. Я упоминаю об этом, потому что использовал их в прошлом. Но они, вероятно, не лучший выбор для начинающих в такого рода вещах.
Вышеупомянутое снизит шум вашего сигнала.
Далее вам нужно определить начальную и конечную точки «ускорения». Вы можете сделать это, создав Производная исходного сигнала. Точки, где производная пересекает ось Y (ноль), вероятно, являются пиками в вашем сигнале и могут указывать на начало и конец ускорения.
Затем вы можете создать производную второй степени, чтобы получить минимальное и максимальное ускорение.
Если вы моделируете вещи правильно, фильтр Калмана напрямую даст вам скорость и ускорение.
хороший пример кода для Savitzky-Golay можно найти на procoders.net/?p=11
SG легко реализовать, если у вас есть коэффициенты. Просто используйте сголай Р., чтобы найти их.
Эта ссылка предоставляет JavaApplet, чтобы на самом деле увидеть, как работает Moving, Savitzky-Golay и Ensemble Average chem.uoa.gr/applets/appletsmooth/appl_smooth2.html
#Wouter Ссылка устарела
В дополнение к вышеупомянутым статьям, посмотрите Сплайны Catmull-Rom.
Catmull-Roms - отличные кривые для данных с регулярным интервалом, но они имеют тенденцию выделять, а не сглаживать шум. Я был бы более склонен использовать кубические или квадратичные сплайны, даже если они не проходят через все точки данных.
В дополнение к отличному ответу GvS, приведенному выше, вы также можете рассмотреть возможность сглаживания / уменьшения ступенчатого эффекта ваших усредненных результатов с помощью некоторой общей подгонки кривой, такой как кубические или квадратичные сплайны.
Скользящие средние обычно ужасны, но хорошо работают для белого шума. И скользящие средние, и Савицкий-Голей сводятся к корреляции - и поэтому они очень быстрые и могут быть реализованы в реальном времени. Если вам нужна информация более высокого порядка, такая как первая и вторая производные, SG - хороший правильный выбор. Магия SG заключается в постоянных коэффициентах корреляции, необходимых для фильтра - как только вы определили длину и степень полинома для локального соответствия, коэффициенты нужно будет найти только один раз. Вы можете вычислить их с помощью R (sgolay) или Matlab.
Вы также можете оценить первую производную зашумленного сигнала с помощью наиболее подходящих полиномов Савицкого-Голея - их иногда называют производными Савицкого-Голея - и обычно дают хорошую оценку первой производной.
Фильтрация Калмана может быть очень эффективной, но она сложнее в вычислительном отношении - по скорости трудно превзойти короткую свертку!
Пол
Программное обеспечение CenterSpace
Не могли бы вы объяснить, почему использовать 100 значений для 10 Гц? Спасибо.