Знаю что будете ругать, но помогите мне

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

Убираем шумы (мелкие колебания), получаем нижний сигнал.
Найти мне собственно надо момент резкого падения сигнала. Если смотреть на общую картину, очень хорошо даже видно, но как сделать что бы машина это понимала — голова кругом идет. Какой использовать алгоритм? я совсем заплутал

GD Star Rating
loading...

20 Responses to Найти резкого падения сигнала.

  1. RerRU:

    мож дельту критическую забить на отрезок времени?

  2. AsxSm:

    а можно как то…эм… для совсем дурачков?
    если делать в лоб и сразу по всем данным выискивать пики — то вроде я понимаю как сделать
    а если брать промежутки около 1000 измерений, то там такая белеберда…

  3. RerRU:

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

  4. AsxSm:

    ну это в дальнейшем
    сейчас с помощью всемогущего лабвью, мне надо…

    вообщем, у меня есть 2 сигнала
    надо проверять, если есть падение резкое (как??), то проверяем, есть ли такое падение на другом сигнале, примерно в то же время (+-), если да, фиксируем место

    было бы здорово на пальцах показать как это сделать

    поиграться с фильтрами я всегда успею, хочется понять

  5. AsxSm:

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

  6. RerRU:

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

    результаты измерений же в таблицу занесены?

  7. PeeSpb:

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

    Известные мне подходы:

    * Посчитать производную (s(t) — s(t-1)). Дальше можно искать места, где она пересекает нуль (снизу вверх в твоем случае), можно интегрировать ее квадрат, а можно искать резкие спады и-или подъемы. В твоем случае, может оказаться достаточно найти места где (s(t) — s(t-w))/w > T, если правильно подобрать w и T.

    * Можно искать конкретные формы сигнала (например «резкий спад») или («именно яма данного вида и ширины») тупо считая конволюцию с необходимой формой. Можно искать несколько нужных форм, а затем вычленять последовательные конфигурации («резкий спад + яма + резкий подъем»).

    * Упрощенная версия предыдущего варианта — оставить только низкие частоты, совпадающие по характеристикам с искомыми ямами и тупо искать конфигурации «спад нужной длины, затем подъем нужной длины». Типа (if s(t) — s(t-a) > X and s(t-a) — s(t-b) < У).

    Короче гугли по ссылке выше.

  8. AsxSm:

    пики я нашел, на отфильтрованном сигнале

    потом смотрю (как выше было) на сколько сильный перепад между вершинами

  9. AdoDead:

    Ну не знаю. Почему просто производную не взять? По крайней мере из твоего объяснения напрашивается именно это.
    Вот смотри, ты сказал «найти момент резкого падения», то есть момент в котором функция убывает со скоростью большей чем заданное V (интересующая нас «резкость падения»). Иначе говоря момент времени, в котором производная меньше этого V.
    Получается, берешь производную и смотришь, когда ее значение окажется меньше либо равно V. Если это условие выполняется — значит сейчас у тебя наблюдается твое «резкое падение».

  10. AsxSm:

    заданное V — как выставим, из расчетов от чего?

  11. AsxSm:

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

    пока я просто беру кусок 1000, убираю шумы фильтрами (аккуратненько)
    нахожу пики, смотю разницу между пиками Х2 — Х1, если больше какой-то величины, то давай, заносись в таблицу «спад»

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

  12. PeeSpb:

    Параметры алгоритма, хочешь не хочешь, тебе придется выставлять исходя из данных (подразумевая, что у тебя нет какой-либо дополнительной информации о данной системе). Т.е. тупо cобираешь кусок с ручками размеченными пиками, пробуешь разные параметры или модели, считаешь для каждого precision-recall-F1, выбираешь наилучший.

  13. AsxSm:

    9 8 7 6 7 8 9 7 6 8 7 9 6 5 4 1 8 6 8 9 6 8 8 5 4 5 4 1 3 4 9 8 8 9 7 6

    ночь съела мой мозг, не могу понять как заставить железку сказать, что в этйо последовательности 2 провала

  14. RerRU:

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

  15. AsxSm:

    вот в том то и беда что только экспериментальным подбором…
    если б сигнал был на постоянном уровне, или большое количество данных… а так прыгать приходится

  16. PeeSpb:

    Конкретно в твоем примере нахождение пиков делается довольно простой фильтрацией:
    * Сглаживаешь (фильтром 1, 1, 1, 1, 1, например)
    * Считаешь производную (фильтром -1, 1)
    * Находишь места, где производная переходит с -1 на +1 за достаточное время (фильтром -1, -1, -1, -1, -1, 1, 1, 1, 1, 1 например)
    Все три шага можно объединить в одну конволюцию с искомой формой пика, конечно же.

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

  17. AsxSm:

    а что если мою последовательность брать кусками, скажем по 2-3 значения?

    сейчас стал использовать другой фильтр, сглаживание, результаты получше (беру 1000 значний, выбираю MIN и MAX, смотрю разницу)

    вообще про производную интересно, но производную какой функции я буду брать???

  18. PeeSpb:

    Производную твоего же сглаженного сигнала, кого же еще.

    Вот, положим, если проделать описанную мной процедуру на питоне для твоего примера:

    s = «9 8 7 6 7 8 9 7 6 8 7 9 6 5 4 1 8 6 8 9 6 8 8 5 4 5 4 1 3 4 9 8 8 9 7 6»
    s = array(map(float, s.split()))
    F = array([1.0]*5 + [-1.0]*2 + [-2.0]*3 + [-1.0]*2 + [1.0]*5)
    s_filtered = convolve(s, F, mode=’same’)
    s_peaks = s_filtered > 20
    s_peaks[0] = s_peaks[-1] = 0
    p_start = [i for i in range(1, len(s_peaks)) if s_peaks[i-1] == False and s_peaks[i] == True]
    p_end = [i for i in range(len(s_peaks)-1) if s_peaks[i] == True and s_peaks[i+1] == False]

    plot(s, label=’Signal’)
    for (ps, pe) in zip(p_start, p_end):
    ___minvalue = min(s[ps:(pe+1)])
    ___argmin = find(s[ps:(pe+1)] == minvalue)
    ___scatter(ps+argmin, s[ps+argmin], c=’r’)

    grid()
    legend();

    науко-научный сайт  500x339, 37.01 kb

  19. AsxSm:

    будет работать на отлично, если максимульный скачок это между 0.41025 и 0.4048 = 0.00545, и это максимальное падение на всем графике

    суть уловил

Добавить комментарий