Я нахожусь в процессе создания собственного инструмента мониторинга системы. Я хочу запустить фильтр (например, фильтр Гаусса или аналогичный) в непрерывном потоке необработанных данных, которые я получаю от устройства (в данном случае мой процессор %).
Коллекция значений данных состоит из 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
Вкратце: ищите оптимизированный способ сглаживания необработанных потоковых данных вместо фильтрации всего набора данных при каждом проходе.