LINUX.ORG.RU

Нужен алгоритм поиска регулярных пиков в сигнале

 , , ,


2

6

Имеется в хозяйстве детектор тока на acs712, хочу использовать его чтобы смотреть подключена ли к сети нагрузка. Проблема в том что датчик весьма шумный и периодически показывает погоду на Марсе. Тем не менее если снимать показания за 2 периода волны (это 40мс для 50Гц) визуально нагрузку хорошо видно:

графики (3 замера в разное время для каждого случая) :

  1. без нагрузки
  2. лампочка 5,5Вт
  3. лампочка 12Вт

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

Но есть проблема. На картинке более-менее идеальный случай, как я упомянул датчик вполне может выдавать пики в рандомном месте. Хочется прикрутить какой-то простой фильтр чтобы удалить шумы и оставить только эти 4 экстремума. Беглый гуглеж ничего подходящего не дал.

★★★★★

Последнее исправление: ya-betmen (всего исправлений: 1)

Если под нагрузкой понимается мощность (и мощность прямо вот и меряется датчиком), то нужно просто эти кривули усреднить в скользящем окне.

Дальше детали, зависит от того с какой частотой нужно получать ответ.

AntonI ★★★★
()

Направление посмотреть: автокорреляция.

Zubok ★★★★★
()

Но мне кажется, что всякие выкрутасы с выяснением периодичности - сложный алгоритм для определения включена ли нагрузка. Попробовать обычный ФНЧ и дальше принимать решение по уровню сигнала, по превышению некоторого фонового порога.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

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

ya-betmen ★★★★★
() автор топика
Ответ на: комментарий от Harald

периодичность 50Гц известна заранее :P

Ну это сути сильно не поменяет. Раз известна, то тогда лучше не автокорреляцию, а согласованный фильтр (matched filter), в котором рассматривается корреляция неизвестного сигнала (зашумленного) не самим с собой, а с образцом: https://en.wikipedia.org/wiki/Matched_filter

Zubok ★★★★★
()
Ответ на: комментарий от ya-betmen

Спасибо за наводку, провожу кой-какие эксперименты с разными способами. Пока самым надежным оказалось сначала сгладить график а потом растянуть под исходную амплитуду.

Имеется в хозяйстве детектор тока на acs712, хочу использовать его чтобы смотреть подключена ли к сети нагрузка.

Ну как бы если вопрос уже не в том, что надо искать регулярные пики, а вообще просто наличие какого-то сигнала, отличного от шума, то почему бы просто не усреднять выпрямленный сигнал с датчика за определенное время, а потом пороговый решатель сделать, который будет говорить, есть ли сигнал или нет? Это неоптимально, но просто. Тут возможны две плохие ситуации, когда уровень шума превышает порог срабатывания (это ложная тревога) и когда порог сильно выше среднего сигнала с шумом (это пропуск сигнала). Поэтому нужно оптимально его выбрать. Вполне может оказаться, что результаты будут неприемлемы.

Поиск именно определенного сигнала по форме, частоте, даст, конечно, лучше результаты, особенно когда SNR низкий, но математики тут больше.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

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

Morin ★★★★
()
Ответ на: комментарий от Morin

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

О чем ты вообще говоришь? Какие велики? Патеррнматчинг (корреляционный фильтр) является оптимальным методом определения в присутствии аддитивных шумов.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

светодиодка имеет драйвер, иногда очень убогий драйвер, иногда там поймать хоть что-то похожее на период по току просто не реально. искать схождение с чем мы собрались?

ладно, лирика все. пусть ваяет

Morin ★★★★
()
Последнее исправление: Morin (всего исправлений: 1)
Ответ на: комментарий от Morin

светодиодка имеет драйвер, иногда очень убогий драйвер, иногда там поймать хоть что-то похожее на период по току просто не реально. искать схождение с чем мы собрались?

А форма в данном случае и не так важна. Не форму ищем, а сигнал с определенным периодом корреляцией с опорным сигналом, имеющим тот же период - 20 мс. Опорный сигнал можно взять гармонический. Меня же поправили, что автор, на самом деле, считает, что у него 50 Гц всегда. И я следом написал тогда про matched filter.

На самом же деле, как я сейчас понимаю, автор просто хочет узнать, есть ли у него нагрузка, но спросил про поиск регулярных пиков, на что я и поспешил ответить. Тогда, в принципе, можно не очищать сигнал фильтрацией, а использовать кумулятивные значения за временной диапазон, чтобы решить, есть ли (был ли) сигнал или его не было по превышению над фоном шумов, когда нагрузки нет. Это вообще просто как валенок. Забить на его форму и период вообще, так как будем считать их произвольными.

ладно, лирика все. пусть ваяет

Ну как бы да. Эксперимент покажет. Совсем не ясно, какие у него там шумы.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

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

Morin ★★★★
()
Ответ на: комментарий от Morin

правда это не отменяет фильтра шумов,

Ну, я не вижу в этом смысла в упрощенной модели, если считать шум аддитивным (что, конечно же, не так в реальности) и с мат.ожиданием, равным 0. Мат.ожидание суммы сигнала и такого шума есть сумма мат.ожиданий. Шум как бы сам собой уходит (или почти уходит) из расчета, когда мы посчитаем среднее зашумленного сигнала за временной отрезок. UPD. Разумно было бы заранее выкинуть аномальные отсчеты.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

дык да, но что-то медианный сырых данных не вызвал возбуждения у тс.

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

Morin ★★★★
()

Сейчас время нашел и поискал тебе. Задачка-то может и у других возникнуть. Вот про то, что я имею в виду. Есть книжка «Г. Ван Трис. Теория обнаружения, оценок и модуляции. Том 1» 1972 года. В самом начале книжки обсуждается простейший случай с бинарным решателем, то есть когда принимается либо гипотеза H_0 либо H_1. Вот тебе конкретный кусочек с примером. Твой случай — это пример 1.

Вот я тут вырезал, чтобы ты не искал. https://imgur.com/AeRMnD0

Как видно из преобразований в первом примере, статистика сводится к простому суммированию отсчетов (см. выражение и слова в самом конце «Примера 1») за период. Так как у тебя сигнал двухполярный, то по модулю или просто в положительной области. Дальше — сравнение с порогом. Важно, что все исходит из предположения, что шум у тебя гауссовский и аддитивный. Пример 2 в общем-то рассматривает случайный полезный сигнал с мат. ожиданием ноль и какой-то дисперсией. Это не совсем твой случай, но вот собирать статистику суммированием квадратов отсчетов вполне разумно. Оптимальный для тебя выбор порога - разговор отдельный и можно выработать кое-какие критерии. Из-за шума всегда есть вероятность ошибки детектирования (ошибки перового и второго рода): пропуск сигнала или ложное срабатывание.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Спасибо. Очень похоже на то что мне нужно. Хотя в первом приближении задачу я решил, но как будет время покопаю книжку. Сейчас сделал «в лоб» - нахожу коэффициент корреляции для входного сигнала и эталонной синусоиды, чтобы правильно совместить сначала сглаживаю входной сигнал через скользящее среднее, потом нахожу переходы через ноль.

Сейчас это работает для всего что попалось под руку от зарядки мобильника до электродрели.

Что характерно шумел только один датчик, 2 других показывают более человечные данные.

ya-betmen ★★★★★
() автор топика
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

коэффициент корреляции для входного сигнала и эталонной синусоиды

Это называется «преобразование Фурье на заданной частоте», и входной сигнал скорее всего сглаживать не обязательно, да и искать переходы через ноль тоже не нужно - просто нужно посчитать модуль фурье-отклика (корень из суммы квадратов интегралов с синусом и косинусом). Ну и умножить на два и поделить на число отсчетов.

Но постановка задачи по прежнему нифига непонятна, что именно меряет датчик? Если мощность то почему ее интеграл не зависит от нагрузки (судя по графикам)?

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Я сглаживаю его только чтобы правильно выбрать смещение эталонной синусоиды, корреляцию считаю с оригиналом.

модуль фурье-отклика

А можно формулой или книжкой? Фурье-отклик не гуглится.

что именно меряет датчик?

Унутре у него неонкадатчик холла, получается что меряет он опосредованно (через эм поле) силу тока.

почему ее интеграл не зависит от нагрузки

Вообще зависит, просто для 6Вт и 12Вт лампочек разница довольно маленькая, для количественных замеров я как раз использую среднее по модулю, т.е. тот же интеграл. При подключении чайника или утюга разница намного заметнее.

ya-betmen ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

Пусть u[i] — сигнал, 0<=i<N, dt — шаг по времени (в секундах), omega — циклическая частота, omega = 2 pi 50 (для 50 Гц). Тогда

double Re = 0, Im = 0; // вещественная и мнимая части 
for(int i=0; i<N; i++){
   Re += cos(i*dt*omega)*u[i];
   Im += sin(i*dt*omega)*u[i];
}
Re *= 2./N;
Im *= 2./N;
double A = sqrt(Re*Re+Im*Im); // модуль 
double phi = atan2(Im, Re); // фаза

Фурье-преобразование на заданной частоте даст некоторое комплексное число Re+j Im, где j - мнимая единица. Модуль этого числа будет амплитудой колебаний (то что Вы ищете), фаза будет показывать синус там, косинус или что то среднее. Гарм. колебания в общем случае задаются как A cos(omega t+phi) ну или как (Re+j Im) exp(j omega t) — это не одно и то же но близкие фиговины;-)

Это будет работать на достаточно большом интервале времени (много больше чем период колебаний).

для 6Вт и 12Вт лампочек разница довольно маленькая

А, тогда понятно.

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 2)
Ответ на: комментарий от AntonI

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

ya-betmen ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

значения амплитуды на выходе у меня не матчатся ни с максимальными ни со средними значениями

Да, это уже отдельная история. Таким образом можно достаточно точно получить амплитуду синусоиды (как то сдвинутой по фазе), но для произвольного периодического сигнала результат будет ХЗ какой - можно только утверждать что он линейно связан с амплитудой сигнала (увеличили амплитуду сигнала вдвое - результат возрос вдвое).

Точность ответа зависит от интервала интегрирования, он должен быть много больше чем период колебаний и чем больше тем выше точность.

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

AntonI ★★★★
()
Ответ на: комментарий от AntonI

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

Если для лампы накаливания не удается получить бол-мен точный ответ нужно искать ошибку

С ней всё норм, совпадает амплитуда.

ya-betmen ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

Вообще интуитивно я ожидал, что потребляемая мощность должна быть пропорциональна площади графика.

С точностью до ошибки датчика и всяких консинусов фи наверное? То исть если это не сетифицированный ваттметр а датчик тока, то наверное еще надо напругу мерять?

датчики на 30А слишком грубые для таких замеров

Там надо читать с какой точностью датчик меряет. Но да, если погрешность 10мА и токи в цепи порядка 10мА то странно ждать разумного результата;-)

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

там и без погрешности датчика странно ждать 10мА

кагбе 30000мА и всего 4095 если ацп 12 бит. да еще ошибка усиления ацп обычно 4-12 первых отсчетов. да можно считать что это мультик в отличии от адика калибровкой не излечишь, надо тупо учесть

Morin ★★★★
()
Ответ на: комментарий от Harald

Мне что, нужно будет замерять ещё и напряжения в моменте и премножать чтобы посчитать потребление лампочки? Блин я не хочу этой фигни, я хочу пыщ-пыщ и работает.

ya-betmen ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

Мне что, нужно будет замерять ещё и напряжения в моменте и премножать чтобы посчитать потребление лампочки?

А как иначе

Harald ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.