PSD
Главный специалист
Offline
Пол:
|
|
« : 02-03-2005 08:30 » |
|
Есть архив измерений некоторой величины. Разумеется измеряется все с погрешностью (и надо сказать нехилой). В нормальном состоянии фактическое значение величины постоянно и если меняется то скачкооборазно (те просто добаляется какаято постоянная). Скачки происходят с произвольной верояностью. Нужен алгоритм который будет отлавливать эти скачки по изменряемым значениям.
Вот пример: Измереная величина 25,26,24,23,26,29,30,28,30,29,29,28,27,26,27,26,25,24,26,22,23,24,22,21,21,22,23 Фактическая величина 25,25,25,25,25,29,29,29,29,29,29,29,26,26,26,26,26,22,22,22,22,22,22,22,22,22,22
Вот эти переходы 25->29,29->26,26->22 мне нужно выделить ... продолжительность постоянного уровня тоже случайна от 0 до +бесконечности.
Может ктонибудь подсказать достойный алгоритм?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
xelos
Гость
|
|
« Ответ #1 : 02-03-2005 10:20 » |
|
фильтровать каким-нить фильтром (как самое простое на ум приходит скользящий фильтр с постоянным размером, значений на 5), потом отслеживать производную на фильтрованом сигнале, например... чтобы четче выделить скачки, может имеет смысл умножить каждый член ряда на какое-нить число, например на 10... и все операции - фильтрование и отслеживание производной производить на "укрупненном" сигнале... в данном случае, если шум равномерный - его в любом случае удастся сгладить, а производная будет ярче выражена.
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #2 : 02-03-2005 10:53 » |
|
можно ещ раз с формулами ....
Производную по соседним точкам посчитать можно было где то у меня в справчнике...
А ху из скользащий фильтр с постоянным размером?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #3 : 02-03-2005 10:57 » |
|
Попутно там нужно еше вылавливать и такие вещи
Фактическая величина 1,2,3,4,5,6,9,10,11,12,13,14,7,8,9,10,11
скачки 6-9 и 14-7 на растущей и снижающейся величине...
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
xelos
Гость
|
|
« Ответ #4 : 02-03-2005 11:00 » |
|
производную по 2 точкам считаешь как (x2-x1)/tx, можно и по трем точкам - формулы известные... фильтр после обеда напишу - точную формулу в справочнике гляну (ЦОС - цифровая обработка сигнала, если интересно). Смысл - расчет среднего значения по 5 предыдущим - их несколько видов.
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #5 : 02-03-2005 11:05 » |
|
Я делал так. 1. Усредняешь входные значения, чтобы отфильтровать шум. Например, если X - массив входных значений, то массив отфильтрованных данных Y[i] = (X[i-2] + X[i-1] + X[i] + X[i+1] + X[i+2]) / 5 Чем больше значений возьмешь, тем глаже получается кривая. Однако и переход тоже сгладится, поэтому придется искать компромисс путем проб и ошибок. 2. В каждой точке отфильтрованного массива находишь производную, т.е. скорость изменения сигнала. Например: D[i] = (Y[i+1] - Y[i-1]) / 2 3. Определись, какую скорость изменения сигнала ты считаешь "скачком", а какую нет. Например, для твоих данных неплохая величина 0.1 Найди в массиве производных точки, где модуль производной выше порога, и присвой им значение: -1, если D[i] < - Threshold; 1, если D[i] > Threshold; 0 в противном случае. 4. Пройдись по полученному массиву и найди точки, у которых вычисленная величина меняется. Это и есть переломные точки кривой. На рисунке красный график - исходные данные, синий - отфильтрованные. Большими круглыми маркерами показаны точки перелома.
|
|
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #6 : 02-03-2005 11:50 » |
|
Alf отлично все описал - для более "яркого" выделения скачков, как я уже писал, можно входную величину умножить на какой-нить коэффициент.
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #7 : 02-03-2005 12:07 » |
|
Alf отлично все описал - для более "яркого" выделения скачков, как я уже писал, можно входную величину умножить на какой-нить коэффициент.
А даст нам это что-нибудь? Одновременно и шумы возрастут во столько же раз, появятся паразитные скачки... Все равно что на моем графике изменить надписи на осях. Сама форма графика не изменится, и соотношение между производных на условно гладких и наклонных участках кривой останется тем же. По такому алгоритму у меня на одном из предприятий производится учет продукции - контролируется приход подсолнечного масла с прессов и расход при отпуске в цистерны. Данные поступают с самодельных электронных весов (не нашли приемлемый промышленный вариант до 1000 тонн за разумные деньги), которые каждые несколько секунд взвешивают огромный бак. На графике находятся наклонные участки, и в журнал заносятся данные о заливах и сливах. Пришлось несколько поколдовать над подбором ширины окна фильтрации и пороговых значений производных, чтобы отсекать случайные скачки и не терять при этом реальный расход. Но зато система уже несколько лет работает без нареканий.
|
|
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #8 : 02-03-2005 12:20 » |
|
если шум равномерный, он отфильтруется, а перепады межды уровнями будут больше. Это можно включить в алгоритм определения скачка - тогда не только производную смотреть, а еще и разность уровня двух участков.
Определять два соседних участка, где производная близка к нулю и смотреть разность уровней - она должна быть больше некоторго значения. В исходном примере это не проявится, т.к. перепады небольшие (производная близка к нулю), а после умножения - производная увеличиться.
Если фильтрация шума недостаточна, можно повторный фильтр применить - обычное правило - повторный фильтр должен быть быстрее первого (например среднее по двум точкам искать).
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #9 : 02-03-2005 12:33 » |
|
...если шум равномерный, он отфильтруется, а перепады межды уровнями будут больше. ...В исходном примере это не проявится, т.к. перепады небольшие (производная близка к нулю), а после умножения - производная увеличиться.
Не уловил идею... Можно пример, а лучше - график? Допустим, приписал я на своем графике к каждому числу лишний нуль... Раньше отсчеты болтались на 2 единицы, станут болтаться на 20. Соответственно порог производной придется поднять с 0.1 до 1.0, иначе в каждой точке получим по скачку. Все вернется на круги своя. Кабы только полезный сигнал умножить, без помех... Но об этом только мечтать можно. А без этого соотношение сигнал-шум ни на йоту не увеличится.
|
|
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #10 : 02-03-2005 14:53 » |
|
поторопился я с умножением - простое умножение дает ту же самую производную... дома попробую привести сигнал к минимальному значению (опустить кривую в 0 - т.е. вычесть "оффсет") и проделать тот же трюк.
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #11 : 03-03-2005 12:51 » |
|
спасибо буду пробовать ....
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Alf
Гость
|
|
« Ответ #12 : 03-03-2005 14:16 » |
|
поторопился я с умножением - простое умножение дает ту же самую производную... дома попробую привести сигнал к минимальному значению (опустить кривую в 0 - т.е. вычесть "оффсет") и проделать тот же трюк.
IMHO проку будет не больше,чем от умножения. В первую очередь нас здесь интересует поведение производной. Смещение всех точек кривой сведется к прибавлению некоей константы. Думаю, не открою тайны, что производная суммы функций равна сумме производных, а производная константы равна нулю. Так что исходная производная останется неизменной. Никакие простейшие манипуляции с числами ничего здесь не дадут. Нужно набирать статистику по входным данным и использовать адаптивные фильтры.
|
|
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #13 : 03-03-2005 14:59 » |
|
угу, простые операции ничего не дают - вчера вечером попробовал... Разве что попробовать другие фильтры? Если бы знать хотя бы размер минимального постоянного участка - возможно что-нибудь бы вылезло из этого... в выходные попробую поиграться с различными типами фильтров - может на что интересное наткнусь...
|
|
|
Записан
|
|
|
|
|