Что было бы идеальным способом найти среднее и стандартное отклонение сигнала для приложения в реальном времени. Я хотел бы иметь возможность запускать контроллер, когда сигнал превышал среднее значение на 3 стандартного значения в течение определенного периода времени.
Я предполагаю, что выделенный DSP сделает это довольно легко, но есть ли какой-нибудь «ярлык», который не требует чего-то столь сложного?
statistics
real-time
measurement
jonsca
источник
источник
Ответы:
В ответе Джейсона Р. есть недостаток, который обсуждается в книге Кнута «Искусство компьютерного программирования», том. 2. Проблема возникает, если у вас есть стандартное отклонение, которое составляет небольшую долю от среднего значения: вычисление E (x ^ 2) - (E (x) ^ 2) страдает от серьезной чувствительности к ошибкам округления с плавающей запятой.
Вы даже можете попробовать это самостоятельно в скрипте Python:
В качестве ответа я получаю -128,0, что явно не в вычислительном отношении, поскольку математика предсказывает, что результат должен быть неотрицательным.
Кнут цитирует подход (я не помню имя изобретателя) для расчета среднего значения и стандартного отклонения, который выглядит примерно так:
и затем после каждого шага значение
m
является средним, и стандартное отклонение может быть рассчитано какsqrt(S/n)
или вsqrt(S/n-1)
зависимости от того, какое ваше любимое определение стандартного отклонения.Уравнение, которое я пишу выше, немного отличается от уравнения Кнута, но оно эквивалентно в вычислительном отношении.
Когда у меня будет еще несколько минут, я напишу приведенную выше формулу в Python и покажу, что вы получите неотрицательный ответ (который, мы надеемся, близок к правильному значению).
Обновление: вот оно.
test1.py:
результат:
Вы заметите, что все еще есть некоторая ошибка округления, но это не плохо, тогда как
naive_stats
просто рвёт.редактировать: только что заметил комментарий Велисария со ссылкой на Википедию, в которой упоминается алгоритм Кнута.
источник
В частотной области «экспоненциально взвешенное скользящее среднее» является просто реальным полюсом. Это просто реализовать во временной области.
Реализация во временной области
Позвольте
mean
иmeansq
быть текущие оценки среднего и среднего квадрата сигнала. На каждом цикле обновляйте эти оценки новым образцомx
:То, что выражено выше как императивная программа, также может быть изображено в виде диаграммы потока сигналов:
Анализ
Сжимая БИХ-фильтры в их собственные блоки, диаграмма теперь выглядит так:
Ссылки
источник
0 > a > 1
0 < a < 1
. Если в вашей системе есть выборка tmie,T
и вы хотите усреднить постоянную времениtau
, выберитеa = 1 - exp (2*pi*T/tau)
.z=1
(DC) наH(z) = a/(1-(1-a)/z)
и вы получите 1.Метод, который я использовал ранее во встроенном приложении обработки, заключается в поддержании накопителей суммы и суммы квадратов сигнала, представляющего интерес:
или вы можете использовать:
в зависимости от того, какой метод оценки стандартного отклонения вы предпочитаете . Эти уравнения основаны на определении дисперсии :
Я успешно использовал их в прошлом (хотя меня интересовала только оценка дисперсии, а не стандартное отклонение), хотя вы должны быть осторожны с числовыми типами, которые вы используете для хранения аккумуляторов, если вы собираетесь суммировать по длительный период времени; Вы не хотите переполнения.
Изменить: В дополнение к вышеупомянутому комментарию о переполнении, следует отметить, что это не численно устойчивый алгоритм, реализованный в арифметике с плавающей запятой, потенциально вызывающий большие ошибки в оценочной статистике. Посмотрите на ответ Джейсона С. для лучшего подхода в этом случае.
источник
Подобно предпочтительному ответу выше (Jason S.), а также полученному из формулы, взятой из Кнута (Vol.2, p 232), можно также получить формулу для замены значения, то есть удалить и добавить значение за один шаг. , Согласно моим тестам, замена обеспечивает лучшую точность, чем двухэтапная версия удаления / добавления.
Код ниже написан на Java
mean
иs
обновляется («глобальные» переменные-члены) так же, какm
иs
выше в посте Джейсона. Значениеcount
относится к размеру окнаn
.источник
Ответ Джейсона и Нибота отличается в одном важном аспекте: метод Джейсона вычисляет стандартное отклонение и среднее значение для всего сигнала (так как y = 0), в то время как ответ Нибота является «бегущим» вычислением, то есть он взвешивает более свежие выборки сильнее, чем выборки из далекое прошлое.
Поскольку приложению, по-видимому, требуется стандартное отклонение и среднее значение как функция времени, метод Нибота, вероятно, является более подходящим (для этого конкретного приложения). Тем не менее, реальная сложная часть будет заключаться в том, чтобы правильно определить весовую часть времени. В примере Nibot используется простой однополюсный фильтр.
Выбор фильтра нижних частот может зависеть от того, что вы знаете о своем сигнале и временном разрешении, которое вам нужно для вашей оценки. Более низкие частоты среза и более высокий порядок приведут к лучшей точности, но меньшему времени отклика.
Чтобы еще больше усложнить ситуацию, один фильтр применяется в линейной области, а другой - в квадрате. Квадрат значительно меняет спектральное содержание сигнала, поэтому вы можете использовать другой фильтр в квадрате.
Вот пример того, как оценить среднее значение, среднеквадратичное значение и стандартное отклонение как функцию времени.
источник
y1 = filter(a,[1 (1-a)],x);
.