Повторная пробная прокрутка графических данных в реальном времени для отображения только реально видимых точек для повышения производительности (PyQtGraph) - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть устройство, с которого я читаю. В настоящее время это просто тестовое устройство для реализации GUI (PyQT / PySide2). Я использую PyQtGraph для отображения графиков.

Это функция обновления (упрощена для лучшей читаемости):

def update(self, line):
    self.data_segment[self.ptr] = line[1] # gets new line from a Plot-Manager which updates all plots
    self.ptr += 1 # counts the amount of samples
    self.line_plot.setData(self.data_segment[:self.ptr]) # displays all read samples
    self.line_plot.setPos(-self.ptr, 0) # shifts the plot to the left so it scrolls

У меня есть алгоритм, который удаляет первые значения x массива и сохраняет их во временном файле. В настоящее время максимум доступных данных составляет 100 тыс. Если пользователь увеличил масштаб и видит только часть графика, проблем нет, отстает график

Но чем больше точек отображается (больший x-диапазон), тем больше оно отстает, отстающий график

Особенно, когда я устанавливаю ширину графика прокрутки <1, он начинает отставать намного быстрее. Обратите внимание, что это всего лишь тестовый график, фактический график будет более сложным, но пики также будут важны, поэтому потеря данных имеет решающее значение. </p>

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

Это кажется мне основной проблемой, но я не могу как-то найти решение для этого ... Мои знания по обработке сигналов очень ограничены, поэтому я не могу найти что-либо в Интернете , Я мог бы даже принять ложный подход, чтобы решить эту проблему.

EDIT Это то, что я имею в виду под "невидимыми точками"

невидимые точки

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

В Pyqtgraph реализована понижающая дискретизация:

self.line_plot.setDownsampling(auto=True, method='peak')

В зависимости от того, как вы создали линию, вам, возможно, вместо этого придется использовать

self.line_plot.setDownsampling(auto=True, mode='peak')

Существуют другие доступные методы / режимы.

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

Я использую pyqtgraph для отображения данных в реальном времени, поступающих от трех датчиков вибрации с частотой дискретизации 12800 kSamples / second.Для графика я просмотрел временное окно 10 секунд на датчик (итого 384000 выборок).Показанное время включает в себя чтение данных, их построение и регулярный расчет и построение FFT, запись в базу данных и т. Д. Для части «без понижающей дискретизации» я отключил понижающую выборку для одного из трех графиков.Draw time comparison Более чем достаточно, чтобы я не беспокоился о многопоточности или о чем-то подобном.

0 голосов
/ 13 сентября 2018

В качестве простой модификации того, что вы делаете, вы можете попробовать что-то вроде этого:

def update(self, line):

    # Get new data and update the counter
    self.data_segment[self.ptr] = line[1]
    self.ptr += 1

    # Update the graph to show the last 256 samples
    n = min( 256, len(self.data_segment) )
    self.line_plot.setData(self.data_segment[-n:])

Для явного сокращения выборки данных вы можете попробовать это

resampled_data = scipy.signal.resample( data, NumberOfPixels )

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

n = min( N, len(self.data_segment) )
newdata = scipy.signal.resample( self.data_segment[-n:], NumberOfPixels )
self.line_plot.setData(newdata)

Тем не менее, хороший графический движок должен делать это автоматически.

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

Некоторые общие замечания по сбору, обработке и отображению сигнала кодирования

Возможно, на данный момент полезно предложить некоторые общие комментарии по работе с сигналами и их отображению.

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

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

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

P / S. Для тех, кто работает с цифровыми фильтрами, если вы не изучали предмет формально, было бы полезно прочитать книгу Хемминга «Цифровые фильтры». Это доступно как книга Dover и доступно.

...