3

我正在为我的 DMM 开发一个可视数据记录器,它将每个测量值写入 RS232 接口。在那里我连接了一个 Teensy 3.6 并收集数据点。对于每个点,我都有时间戳和测量值。我将收集 10.000 个读数。我想以两种方式在显示器(800x480)上显示测量数据。首先作为滚动图,从右到左滚动并显示最后一分钟左右。这工作正常。

其次,我想总共显示所有收集的测量值(最多 10k 点)。所以我必须缩小或压缩数据,但我想保留曲线的形状。为了让您了解它的外观,请观看 Dave 在 YT 上关于 EEV 的视频 ( https://youtu.be/SObqPuUozNo ) 并跳至 41:20。在那里,您可以看到另一个 DMM 如何缩小传入数据并显示它。大约在 1:01:05 10k 测量值显示在仅 400 像素宽的显示区域上。

问题是,这是怎么做到的?我听说过 Douglas-Pucker 算法,但不知道这是否是正确的方法以及如何在 Arduino/Teensy 平台上使用它。

非常欢迎任何帮助,谢谢......

4

2 回答 2

1

我不能只显示所有数据点,因为我使用 FT81x 作为显示控制器,每帧最多只能使用 2000 个绘图命令。而且需要更多时间。

无论如何,我用简单的方法解决了这个问题。

我创建了 bin 并计算了这个 bin 中的最小值和最大值。然后简单地在这些点之间画一条线。工作正常!

顺便说一句,我是 TO :-)

于 2018-03-28T04:18:49.617 回答
0

对于您获得的样本比x轴上的像素多得多的情况,而不是LineTo类似图形,请改用垂直线图...

因此,根据每个渲染时间帧的样本数量和x分辨率,您应该计算yminymax为 eaxchx和渲染垂直线...

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是图形 x 分辨率。为了加快速度,您可以预先计算y0,y1for eachx并渲染它(仅在范围或样本更改时重新计算)......所以如您所见,您将只使用xs应该足够快的行命令。如果将线性插值重写为整数DDA样式,x则无需乘法或除法即可完成...

这些 QA 可能会让您感兴趣:

[笔记]

再看一遍删除的答案与此方法相同(可能在编辑之前通过审查删除,将其从非答案(评论)转换为正确答案)所以我投票支持取消删除,即使它的质量相当低比我的,但发布得更快。

于 2018-03-28T08:54:12.640 回答