Перейти к содержанию
    

Определение всплесков сигнала

Имеется stm32f405, который 5000 раз в секунду получает из внешнего мира 2 штуки unsigned short, это значения на первом и втором канале соответственно, отражающие аналоговый сигнал. Наверное, самая близкая аналогия может быть такая - во внешнем физическом мире рядом с датчиками пролетает предмет, наличие которого и фиксируется этими самыми датчиками + АЦП. Предмет может "пролететь" ближе или дальше, то есть одинаковость сигналов обоих каналов не гарантируется, хотя длительность импульсов будет зависеть только от скорости, так что в первом приближении может быть признана более-менее одинаковой (ну, то есть в два раза, например, она отличаться уже не может, а в 1.5 - может). Сигнал зашумлен, но полезный сигнал - выше шума. Значение покоя не гарантировано и медленно дрейфует (как минимум на пару порядков медленнее, чем сам сигнал).

 

На осциллографе это выглядит как "горб" на осциллограмме, ширина которого может быть от 10мс до 1 секунды, время "разницы" между горбами двух каналов - от 2мс.

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

 

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

 

Сделать "по-тупому", то есть вычислить уровень покоя скользящим средним и смотреть отклонение, сравнивая его с каким-то значением threshold я не могу, потому что один "горб" может быть меньше другого, например, или немного несимметричным, а у меня разница между каналами может быть 10 отсчетов и легко спутать направление. То есть надо как-то по другому находить центр горба, а не просто разница между переходами через границу делить на два. Ну, и шумы там могут быть, которые обеспечат мне пару десятков переходов туда-сюда при том, что медиана функции идет в одну сторону.

 

Ткните носом, плиз, с чего начать, какие алгоритмы поискать, ну и вообще, буду благодарен любым советам.

 

p.s. "Предметов" может быть много, например, 5 штук в секунду, и 100 всего, то есть одновременно в буфере может присутствовать много "горбов", и при этом там может и не быть начального горба, то есть корреляция вроде бы не подходит.

p.p.s. Датчики, АЦП и архитектура системы дана свыше, и меняться не может :(

 

Спасибо заранее!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Берите первую производная от горба - как-только переход из положительной в отрицательную,то это центр горба.

 

p.s. "Предметов" может быть много, например, 5 штук в секунду, и 100 всего, то есть одновременно в буфере может присутствовать много "горбов", и при этом там может и не быть начального горба, то есть корреляция вроде бы не подходит.

Лучше формализуйте задачу.

Не очень понятно - проблема в том что горбы будут накладываться друг на друга?

Или в том что надо однозначно привязать горбы от одного предмета друг к другу?

И что такое "там может и не быть начального горба"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решали в свое время такую задачу - счет зернышек фотосенсором. Там был "уровень компаратора", который брался относительно постоянного сигнала засветки. Т.к АЦП через ПДП гнало данные в озу с частотой 1кГц в течении секунды, было два массива. В один льем, другой обрабатываем. При определении импульса в момент переключения массивов устанавливался специальный флаг. Длительность импульсов усреднялась, получали среднюю длительность. Если зернышки слипались, то на основании длительности такого импульса вычисляли их количество. Импульсы малой длительности - пыль, просто отрезали. Массив можно еще предварительно фильтрануть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Берите первую производная от горба - как-только переход из положительной в отрицательную,то это центр горба.

 

Лучше формализуйте задачу.

Не очень понятно - проблема в том что горбы будут накладываться друг на друга?

Или в том что надо однозначно привязать горбы от одного предмета друг к другу?

И что такое "там может и не быть начального горба"?

Первая производная от горба будет в моем примере дельта Y (дельта X всегда 1). В случае зашумленного сигнала эта производная будет тоже шуметь, то есть быть то больше, то меньше нуля, однозначный переход уловить невозможно. Только если усреднить или как-то еще отфильтровать шум, чтобы функция стала монотонной на возрастающем и спадаюшем участках горба, но вот как это сделать - я не знаю. Размерность производной будет "болтаться" около нуля, что тоже не радует.

 

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

 

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

 

Как определить центр горба?

Как понять, что это горб не от помехи?

 

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

 

Полагаться на 100% надежность детекта горбов я тоже не могу, то есть считать их тоже не получится.

 

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

 

Сейчас вижу что-то типа такого:

1. фильтруем сигнал скользящим средним

2. все всплески меньше threshold - отбрасываем.

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

4. интеграл - интенсивность, точка половины - центр горба

 

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

 

Как-то так..

 

Решали в свое время такую задачу - счет зернышек фотосенсором. Там был "уровень компаратора", который брался относительно постоянного сигнала засветки. Т.к АЦП через ПДП гнало данные в озу с частотой 1кГц в течении секунды, было два массива. В один льем, другой обрабатываем. При определении импульса в момент переключения массивов устанавливался специальный флаг. Длительность импульсов усреднялась, получали среднюю длительность. Если зернышки слипались, то на основании длительности такого импульса вычисляли их количество. Импульсы малой длительности - пыль, просто отрезали. Массив можно еще предварительно фильтрануть.

А как определялся уровень компаратора? Эмпирически?

Что делали, если зернышки летели то дальше, то ближе (допустим, сигнал при этом мог не достичь "уровня компаратора")?

У меян проблема в том, что предметы могут по-разному детектироваться двумя сенсорами, если "перевести на зернышки" :) - то зернышко могло лететь не параллельно линии датчиков, и тогда оно может пролететь близко к одному датчику и далеко от другого (на первом дельта сигнала - 100, на втором - 10, и ширина чуть больше, так как летит под другим углом).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предлагаю сменить терминологию :) отклик = горб

 

С шумом понятно, тут только повышать отношение сигнал/шум, фильтрацией или в источнике сигнала.

Всё-таки, что такое межканальные накладывающиеся отклики, это отклики в разных каналах совпадающие по времени?

1. Понять есть оклик или нет.

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

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

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

2. потеря отклика от предмета в одном из каналов.

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

 

Кстати, если у вас последовательно несколько откликов от одного предмета, то можно попытаться предсказать появление откликов, например с помощью Калмана.

 

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

Как один может находится внутри другого? Причем здесь разница амплитуд? Вы что, складываете каналы, а потом анализируете?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как определялся уровень компаратора? Эмпирически?

Что делали, если зернышки летели то дальше, то ближе (допустим, сигнал при этом мог не достичь "уровня компаратора")?

У меян проблема в том, что предметы могут по-разному детектироваться двумя сенсорами, если "перевести на зернышки" :) - то зернышко могло лететь не параллельно линии датчиков, и тогда оно может пролететь близко к одному датчику и далеко от другого (на первом дельта сигнала - 100, на втором - 10, и ширина чуть больше, так как летит под другим углом).

 

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

 

лететь не параллельно линии датчиков

 

А вот на этом все и сдохло, конструкторы не смогли создать простой и надежный счетный узел, чтобы мак попадал в зону фотосенсора. :laughing:

Но если попадал, то считал очень неплохо. Мы его и запыливали, засвечивали, алгоритм работал стабильно. Выводили сигнал в режиме самописца для контроля.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сорри, что пропал, набирал фактические данные. Сенсоры стоят так, что частица одновременно может быть только на одном из них (вернее, пересечение там порядка 10%). Вычел один канал из другого, получился график, на котором видны три пары частиц плюс термодрейф (грел феном плату одного сенсора).

 

post-19646-1497353882_thumb.png

 

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

 

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

 

Далее надо убрать постоянную составляющую и вот тут непонятно как действовать.

Сначала я думал сделать усреднение по типу Baseline = Baseline + Y[n]*k, где k=0.01, например.

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

 

Следующая мысль была посчитать производную (dY=Y[n-1] - Y[n]), построить график производный и тогда у нас будет она сначала вверх, потом вниз, потом снова вверх.

 

В итоге сделал:

- усреднение скользящим средним с окном 32 обоих исходных графиков

- вычитание одного из другого

- усреднение скользящим средним с окном 32

- вычисление производной результата вычитания

- усреднение скользящим средним с окном 32

 

post-19646-1497354086_thumb.png

 

Получилось довольно симпатично, но не уверен, что это самый простой и лучший вариант.

Может как-то можно сделать лучше и проще?

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...