以正确的方式去噪示波器数据[python3]

信息处理 噪音 振荡器
2022-02-08 18:57:38

我需要绘制大型示波器数据集。它们太大(1 亿个值),无法将它们全部绘制在 for 循环中。如果我尝试这样做,它会导致MemoryError. 所以在 Stackoverflow 的帮助下,我想出了一个不漂亮但有效的解决方案。

原始数据集: 在此处输入图像描述

为了减少要绘制的数据量,我可以删除数据集的所有行,它们的 y 值介于1和之间-1这可以用 pandas 轻松完成:

df是 pandas.DataFrame() 形式的数据集。

df[1]是要检查的列。

df.drop(df[(df[1] < 1) & (df[1] > -1)].index, inplace = True)

这导致:

在此处输入图像描述

这将数据集的长度从1 亿减少到大约20 万我的问题是:有没有办法减少数据长度并保持其原始外观(防止丑陋的截断)?

这个堆栈的工作方式似乎与 Stackoverflow 不同。原谅我所有的不法行为。

1个回答

如果您只是对绘制数据感兴趣,那么任何数据缩减技术都可以,即使它看起来很粗糙。

实际上,绘图函数本身不会绘制所有数据,因为分配给绘图的空间具有有限数量的Nx×Ny分配给它的像素。例如,如果您的绘图区域是1024×768,那么任何超过 1024 个样本的波形都需要以某种方式重新缩放或重新采样。绘图函数无论如何都会在内部执行此操作,但始终保留到原始数据的链接以再次执行整个过程,通常是onUpdate.

您可以尝试做的是重新采样您的波形并专门对其进行下采样

下采样由两个步骤组成:抗混叠滤波步骤和抽取步骤。

如果您纯粹对绘制波形感兴趣,您可以尝试简单地以低因子抽取它(例如,每 5 个样本中保留 1 个样本),然后将其发送以进行绘图。它仍然会比绘图所需的数据多,但它的大小会更易于管理。

在这里选择纯抽取的原因是因为过滤步骤(尽管必要)可能很昂贵(在计算方面)并且需要更长的时间。但是,如果您负担得起过滤时间,我建议您进行适当的下采样。

如果您使用的是 Python,您可以尝试使用此功能(或功能)来处理下采样步骤。

这里不用说,如果你想进一步处理信号,你必须正确地对其进行下采样。

最后,您内存不足的另一个原因可能是您将所有数据保留在内存中,即使您已完成使用它。因此,一旦您发送了用于绘图的波形,请尝试del()对其进行设置,然后gc.collect()确保该部分内存将立即可用。

希望这可以帮助。