Как уменьшить 10 тыс. Точек данных и показать их на меньшем дисплее? Arduino

Я работаю над визуальным регистратором данных для моего цифрового мультиметра, он записывает каждое измерение в интерфейс RS232. Там я подключаю Teensy 3.6 и собираю данные точек. Для каждой точки у меня есть метка времени и измеренное значение. Я соберу 10.000 чтений. Я хочу отобразить измеренные данные на дисплее (800x480) двумя способами. Сначала в виде скользящего графика, который прокручивается справа налево и показывает последнюю минуту или около того. Это работает нормально.

Во-вторых, я хочу отобразить все собранные измерения в сумме (максимум 10 тыс. Баллов). Поэтому мне нужно сжать или сжать данные, но я хочу сохранить форму кривой. Чтобы дать вам представление о том, как это должно выглядеть, пожалуйста, посмотрите видео от Дейва на EEV в YT ( https://youtu.be/SObqPuUozNo) и перейдите к 41:20. Там вы видите, как другой цифровой мультиметр сокращает поступающие данные и отображает их. Примерно в 1:01:05 10k измерений отображаются в области отображения шириной всего 400 пикселей.

Вопрос в том, как это сделать? Я слышал об алгоритме Дугласа-Пукера, но понятия не имею, правильный ли это путь и как его использовать на платформе Arduino/ Teensy.

Любая помощь очень приветствуется, спасибо....

2 ответа

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

Во всяком случае, я решил проблему, используя простой способ.

Я создаю контейнеры и вычисляю минимальные и максимальные значения в этом контейнере. Затем просто нарисуйте линию между этими точками. Работает отлично!

Кстати, я TO:-)

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

Таким образом, в зависимости от количества выборок за предоставленный период времени и x разрешение вы должны вычислить ymin а также ymax для eaxch x и визуализировать вертикальную линию...

V линии

что-то вроде:

xs=800;
for (x0=x,i=sample_left,y0=y1=sample[i],i<sample_right;i++)
 {
 x = (i-sample_left)*xs/(sample_right-sample_left);
 y = sample[i]; // here add y scaling and offset
 if (x0!=x) { line(x0,y0,x0,y1); x0=x; y0=y; y1=y; }
 if (y0>y) y0=y;
 if (y1<y) y1=y;
 }

где sample[] ваши сохраненные значения, sample_left,sample_right это диапазон для рендеринга и xs является разрешением графика х. Для ускорения вы можете предварительно вычислить y0,y1 для каждого x и визуализировать это (пересчитать только при изменении диапазона или выборок) ... Так что, как вы можете видеть, вы будете использовать только xs командные строки, которые должны быть достаточно быстрыми. x Линейная интерполяция может быть выполнена без умножения или деления, если переписать его в целочисленный стиль DDA...

Эти вопросы могут вас заинтересовать:

[нота]

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

Другие вопросы по тегам