У меня есть датчик, который сообщает о своих показаниях с отметкой времени и значением. Тем не менее, он не генерирует показания с фиксированной скоростью.
Мне трудно работать с данными с переменной скоростью. Большинство фильтров ожидают фиксированную частоту дискретизации. Рисовать графики проще с фиксированной частотой дискретизации.
Существует ли алгоритм для повторной выборки с переменной частотой дискретизации до фиксированной частоты дискретизации?
resampling
FigBug
источник
источник
Ответы:
Самый простой подход - это выполнить некоторую сплайн-интерполяцию, как предлагает Джим Клэй (линейный или другой). Однако, если у вас есть возможность пакетной обработки, и особенно если у вас есть переопределенный набор неоднородных выборок, есть алгоритм «идеальной реконструкции», который чрезвычайно элегантен. По численным причинам это может быть не практичным во всех случаях, но, по крайней мере, стоит знать об этом концептуально. Я впервые прочитал об этом в этой статье .
Хитрость заключается в том, чтобы рассматривать ваш набор неоднородных выборок как уже восстановленный из однородных выборок путем синхрополяции . Следуя обозначениям в статье:
Обратите внимание, что это обеспечивает набор линейных уравнений, по одному для каждой неоднородной выборки , где неизвестными являются одинаково расположенные выборки y ( k T ) , например:y(t) y(kT)
В приведенном выше уравнении - это число неизвестных однородных выборок, T - это обратная величина равномерной частоты дискретизации, а m - количество неоднородных выборок (которое может быть больше, чем n ). Вычисляя решение наименьших квадратов этой системы, можно восстановить однородные выборки. Технически, необходимы только n неоднородных выборок, но в зависимости от того, насколько они «разбросаны» во времени, интерполяционная матрица может быть ужасно плохо обусловлена . В этом случае обычно помогает использование большего количества неоднородных образцов.N T м N N
В качестве игрушечного примера, вот сравнение (с использованием numpy ) вышеупомянутого метода и интерполяции кубического сплайна на сетке с мягким волнением:
(Код для воспроизведения приведенного выше сюжета приведен в конце этого ответа)
Все это, как говорится, для качественных и надежных методов, начиная с чего-то в одной из следующих статей, вероятно, будет более уместным
-
источник
Это звучит как проблема асинхронного преобразования частоты дискретизации. Чтобы преобразовать одну частоту дискретизации в другую, мы можем вычислить непрерывное временное представление сигнала, выполнив интерполяцию sinc, а затем выполнить повторную выборку с нашей новой частотой дискретизации. То, что вы делаете, не сильно отличается. Вам необходимо повторно сэмплировать ваш сигнал, чтобы иметь фиксированное время сэмплирования.
Непрерывный сигнал времени может быть рассчитан путем свертки каждого образца с функцией sinc. Поскольку функция sinc продолжается неопределенно долго, мы используем что-то более практичное, например, оконный sinc практической конечной длины. Сложность заключается в том, что, поскольку ваши сэмплы перемещаются во времени, при повторной дискретизации для каждого сэмпла может потребоваться сигнал с другим фазовым сдвигом.
Непрерывный сигнал времени из дискретизированного сигнала:
Из этого вы можете повторно сэмплировать сигнал:
Собрав все воедино, вы получите:
Так как это не является причинно-следственной или поддающейся объяснению, функцию sinc можно заменить функцией конечной поддержки и соответствующим образом скорректировать пределы суммирования.
Пусть kernel (t) будет оконным sinc или другой подобной функцией длины 2k, тогда:
Я надеюсь, что это помогает ..., но я мог ошибиться, и это может быть немного интенсивным математикой. Я бы порекомендовал изучить преобразование частоты дискретизации для получения дополнительной информации. Может быть, кто-то еще мог бы дать лучшее объяснение или решение.
источник
Я думаю, что ответ Джейкоба очень выполним.
Более простой метод, который, вероятно, не так хорош с точки зрения введения искажения, - это выполнить полиномиальную интерполяцию. Я бы использовал линейную интерполяцию (простая, но не с хорошей производительностью сигнала) или кубические сплайны (но не слишком жесткие, с лучшей производительностью сигнала) для получения выборок в любое время, которое вы хотите из выборок произвольного времени.
источник
2) класс используемых базовых функций: линейный, полиномиальный, синус-косинус (Фурье), кусочно-кубический (B-сплайн или интерполирующий сплайн), подобный sinc ...
(Вариант 0 - использовать ли чужой метод и код или делать самому).
2 соседа любой точки, в среднем равной 0, ужасно.
4 соседа: среднее значение [1 0 (отсутствует -1) 0 1] = 1/2, ужасно.
(Попробуйте использовать фильтр с 4 соседями [-1 3 3 -1] / 4.)
Линейная взаимосвязь с 4, 6 или 8 соседями может работать достаточно хорошо для ваших данных.
Я бы посоветовал начать с метода, который вы хорошо понимаете, прежде чем погрузиться в сплайны, похожие на синки ... хотя они тоже могут быть забавными
Другой, совершенно другой метод - это обратное взвешивание . Его легко реализовать (см. Idw-interpolation-with-python для SO), он работает в 2d 3d и выше, но теоретически его сложно анализировать.
(Не очевидно, NO один метод интерполяции может возможно соответствовать несметным комбинациям
[сигнал, шум, ошибки метрики, тест функция] , которые происходят в действительности.
Есть несколько методов в мире, с большим количеством кнопок, чем тест - функции.
Тем не менее в галерее методов и тестовых функций могут быть полезны.)
источник
Если вы работаете с Matlab, вы можете сделать это, работая с сериями времени.
источник
Прежде чем приступить к какой-то экзотической обработке, вы можете попробовать что-то простое, например: (псевдокод - без интерполяции, но это можно добавить)
источник
ИМХО Ответ Datageist правильный, ответ Джейкоба - нет. Простой способ проверить это состоит в том, что предложенный алгоритм datageist гарантированно интерполируется через исходные выборки (предполагая бесконечную числовую точность), тогда как ответ Джейкоба - нет.
источник