压缩具有可变采样率的绘图数据?

信息处理 压缩
2022-02-05 15:23:07

我目前正在通过一个因子下采样和平均来绘制高采样率数据。大多数时候这工作正常,但我知道在非常低的缩放级别(缩小)下,平均隐藏了大量数据。

我对每个数据点都有一个时间戳,那么是否有任何算法可以删除无意义和“不太有用”的点?我做了一些谷歌搜索,发现与时间序列数据压缩相关的论文,但这并不是我真正想要的。我正在寻找可以利用绘图的特定属性的东西。IE。如果您有 10 个具有相同值的连续点,则可以有效地删除中间点,而不会丢失视觉表示中的任何细节。

2个回答

这就是我所做的。基本思想是模仿绘制每个样本时会看到的内容,只是做得更快

  1. 粗略计算一个水平像素中有多少数据点。绘制比屏幕上的像素更多的点是没有意义的。
  2. 以块为单位划分数据,以便每个像素大致得到一个块
  3. 计算每个块的最小值和最大值
  4. 对于每个块,只需以正确的顺序将最大值和最小值添加到绘图数据中

这样,您将获得一个绘图数组,其数据点数大约是有意义的最高像素数的两倍。每当您缩放、更改数据范围或重新调整窗口大小时,您都必须重新计算,但这往往相当快。如果您不想处理窗口大小调整,您可以简单地计算最坏的情况(全屏)。

这是一个在 Matlab 中显示的代码片段(为简洁起见,它省略了排序)。高分辨率和低分辨率图看起来几乎相同。

%% reduced sample plot example
n = 200000; % lots of samples
fs = 44100;
% noise with exponential decay
x = randn(n,1).*exp(-(0:n-1)'/fs/3);
% block approach
npix = 2000; % emulate an HD display
x1 = reshape(x,n/npix,npix); % chop into blocks
x2 = [min(x1); max(x1)];  % cal min and max
x2 = x2(:); % interleave
figure(1); plot(x); % plot with 200000 data points
figure(2); plot(x2); % plot with 2000 data points

多尺度表示是您真正需要的!

最好的例子之一可能是谷歌地球(和类似类别的)数据。如果您只有一个比例来表示所有数据,那么挑战在于,当您在大范围内对极其详细的数据进行显着缩小时,处理起来非常麻烦,好像放大足够深的广泛子采样数据看起来都很平坦。这是信号处理中的一个经典问题:“数据的多尺度表示”。

作为一种非常简单直观的方式,您可以将它们以/2、/4、/8、/16 的采样率进行二次采样。停在适当的水平。当你呈现数据时,当你缩小时,从较粗的分辨率中挑选数据;当您放大后,您可以从更高分辨率的内容中拉出相应的片段。

您还可以查看小波,它提供了理论上最优雅的方法。