Я пытаюсь написать программу для сглаживания дискретных оцифрованных данных для использования в симуляторе движения. Данные будут предоставлены в виде набора точек t, x (t) и предназначены для использования для создания циклического движения; таким образом, сглаженные данные должны быть не только непрерывными в диапазоне значений t, но также между двумя конечными точками. Кроме того, предоставленные данные, скорее всего, будут иметь значительно более низкое разрешение, чем требуется, и, таким образом, будет происходить значительная интерполяция.
Я рассмотрел различные методы, такие как кривые Гаусса-Ньютона и Левенберга-Марквардта, но они предполагают, что целевая функция известна заранее (и не будет). К сожалению, пользователи указанного имитатора движения могут быть не в состоянии выбрать подходящую функцию (из-за их разного происхождения). Наконец, код должен использоваться на непатентованном, кроссплатформенном (и предпочтительно скомпилированном) языке, который может работать на встроенных платформах (наиболее вероятно, Linux на ARM) — это исключает использование Maple (который обеспечивает общее «соответствие») подпрограмма, которая выбирает соответствующую целевую функцию), Matlab (аналог IIRC) или другие математические языки. Я должен сказать, что я предрасположен к C ++ из-за опыта.
Некоторые типичные данные можно найти на страницах Вот.
Какая техника будет полезна для этого?
Вероятно, было бы проще и более адаптивно к различным наборам данных применять методы цифровой обработки сигналов (DSP) для преобразования скорости посредством повышение частоты дискретизации и интерполяция. C ++ SPUC библиотека может помочь вам здесь — она поддерживает несколько интерполяционные фильтры.
Я реализовал универсальную функцию подгонки кубического сплайна, которая может применяться к любым размерным евклидовым и кватернионным данным, которые могут соответствовать (без каламбура) вашей цели. Я не знаю, насколько хорошо это сравнение по сравнению с другими алгоритмами, так как только ключи входных данных рассматриваются как потенциальное размещение сплайн-ключей, но вы можете взглянуть на это здесь: http://sourceforge.net/p/spinxengine/code/HEAD/tree/sxp_src/core/math/parametric.inl (функция fit_spline).
Для создания циклического движения вы должны быть в состоянии повторить ключи до и после установленной последовательности данных и изменить функцию так, чтобы она вызвала создание ключа в конце цикла. Это относительно простая функция, поэтому не нужно прилагать больших усилий для ее изменения. Вам также необходимо настроить ограничение подгонки сплайнов, чтобы определить, в каких условиях создаются новые сплайны (например, каково отклонение расстояния от подгоночных данных до входных данных и т. Д.)
Ура, Яркко