Каков наиболее эффективный способ фильтрации (гладких) непрерывных потоковых данных

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

Коллекция значений данных состоит из n элементов. Каждый раз, когда этот фрагмент кода запускается, он добавляет новое значение процессора и удаляет самое старое, сохраняя коллекцию длиной n, по сути, deque([float('nan')] * n, maxlen=n), где n — длина графика, который я строю.

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

Это работает просто отлично... Однако должен быть более эффективный способ фильтрации входящих данных вместо запуска фильтра для всего набора данных каждый раз, когда добавляется новое значение данных (в моем случае график обновляется каждые 0,2 секунды). )

Я могу придумать способы сделать это без фильтрации всего списка, но я не уверен, что они очень эффективны. Есть ли что-нибудь в мире обработки сигналов, что мне подойдет? Извините, если мое объяснение немного сбивает с толку, я очень новичок в этом.

from scipy.ndimage.filters import gaussian_filter1d

# Not my actual code but hopefully describes what im doing
def animate():  # function that is called every couple of milliseconds to animate the graph
    # ... other stuff
    values.append(get_new_val) # values = collection of data vals from cpu
    line.set_ydata(gaussian_filter1d(values, sigma=4)) # line = the line object used for graphing 
    # ... other stuff
    graph_line(line)  # function that graphs the line

Вкратце: ищите оптимизированный способ сглаживания необработанных потоковых данных вместо фильтрации всего набора данных при каждом проходе.


person HexxNine    schedule 15.04.2017    source источник


Ответы (1)


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

Хорошая новость заключается в том, что scipy поддерживает это фильтр начиная с версии 0.14. Соответствующая часть документации:

scipy.signal.savgol_filter(x, window_length, polyorder, deriv=0, delta=1.0, axis=-1, mode='interp', cval=0.0)

  Apply a Savitzky-Golay filter to an array.
  This is a 1-d filter. If x has dimension greater than 1, axis determines the axis along which the filter is applied.
  Parameters:   

  x : array_like
      The data to be filtered. If x is not a single or double precision floating point array, it will be converted to type numpy.float64 before ftering.
  window_length : int
      The length of the filter window (i.e. the number of coefficients). window_length must be a positive odd integer.
  polyorder : int
      The order of the polynomial used to fit the samples. polyorder must be less than window_length.
  [...]

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

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

person Andras Deak    schedule 16.04.2017