Как я усреднил себе аварию
Здесь виноват не прибор, не оператор и не вендор. Здесь виноват я, причём дважды: сначала выбросил нужную полосу частот, а потом сам же придумал объяснение тому, что от неё осталось.
Задача
Дашборд по приводам вспомогательного оборудования открывался 40 секунд. За эти 40 секунд он тянул сутки секундных данных по сорока каналам - три с половиной миллиона точек, чтобы нарисовать график шириной в тысячу пикселей. Мастера им не пользовались ровно по этой причине.
Я сделал предрасчёт: среднее за 10 секунд, одна таблица на сутки. Дашборд стал открываться за 1,2 секунды, им начали пользоваться, и месяц всё было хорошо.
Что случилось
В середине апреля на дымососе выросла вибрация подшипникового узла. Обнаружил её слесарь по звуку при обходе, а не тренд. После остановки и вскрытия стало понятно, что процесс шёл трое суток.
Самое неприятное: я этот тренд видел. На дашборде была медленная волна с периодом около пятидесяти секунд, которой раньше не было, и я объяснил её работой регулятора - у него цикл как раз порядка сорока пяти секунд. Объяснение было правдоподобным, непроверенным и ложным.
Как мерил
Взял сырой секундный ряд за сутки до остановки - он, к счастью, никуда не делся, предрасчёт лежал рядом с архивом, а не вместо него. Посчитал спектр по сырому ряду и по прореженному.
В сыром ряду нашлась пульсация 0,12 Гц, растущая по амплитуде трое суток. В прореженном её не было, зато была та самая волна 0,02 Гц. Это не совпадение, это арифметика: при шаге 10 секунд частота Найквиста равна 0,05 Гц, всё, что выше, отражается вниз, и 0,12 Гц попадает ровно в 0,02 Гц.
Отражённая составляющая не выглядит мусором. Она выглядит медленным процессом, который легко приписать регулятору, погоде, смене режима - чему угодно из того, что в цехе действительно происходит с такими периодами.
Чем разделил
Сравнил четыре способа сжать те же сутки и посмотрел, что каждый делает с пульсацией 0,12 Гц. Разделяющий признак выбрал заранее: способ годится, если по нему виден рост амплитуды за трое суток.
| Способ | Рост виден? | Что стало с 0,12 Гц | Объём |
|---|---|---|---|
| Каждая десятая точка | нет | отразилась в 0,02 Гц без потери амплитуды | 346 тыс. |
| Среднее за 10 с | нет | ослаблена втрое и отражена в 0,02 Гц | 346 тыс. |
| Фильтр 0,04 Гц, затем прореживание | нет | удалена честно, ложной волны нет | 346 тыс. |
| Минимум, максимум, первое, последнее | да | видна как рост размаха внутри окна | 1,38 млн |
Третья строка - самая важная и самая неприятная. Правильное прореживание не возвращает потерянную полосу, оно всего лишь перестаёт врать: ложной волны больше нет, но и вибрации не видно. Чтобы увидеть рост, нужна четвёртая строка, где вместо одного числа за окно хранятся четыре и размах сохраняется.
Вывод
Прореживать ряд можно только после фильтра - иначе вы не удаляете шум, а переносите его на другую частоту, где он притворяется процессом. Это правило знает любой учебник, и ровно поэтому я его не вспомнил: оно было в разделе про обработку сигналов, а я решал задачу про скорость загрузки страницы.
Хранить за окно надо минимум, максимум, первое и последнее значение. Это вчетверо больше места и в тридцать раз меньше, чем сырой ряд, - цена, которую я теперь плачу не задумываясь. По сути это та же мысль, что в разборе про брак, только там среднее скрывало провал за десять минут, а здесь - пульсацию за десять секунд.
И третье, про себя. Моё «это регулятор» было подгонкой объяснения под уже сделанную правку: я придумал причину, которая не требовала признать, что предрасчёт испортил данные. Такое объяснение всегда находится, и единственная защита от него - проверить его отдельным замером до того, как успокоился.