向下采样传入的数据流以绘制动态图

信息处理 下采样 心电图
2022-02-01 20:07:06

我正在开发一个模块,我需要在图表上绘制 ECG 流数据。该图具有可配置的速度,即在 50mm、25mm 等范围内绘制 1 个心跳数据样本。为此,我需要根据屏幕分辨率降低样本并绘制相同的图。

我正在使用 Qt QML 进行绘图。实现这一目标的确切算法是什么?我不知道我到底要谷歌什么

1个回答

下采样

让我们定义我们的下采样因子:

r=FsFs

在哪里Fs是原始采样频率和Fs减少的一个。

如果Fs是的倍数Fs(IE1/r是一个整数),那么下采样很简单:您只需从中取出一个样本1/r. 例如,如果您想将采样频率减半,只需丢弃每个2nd示例,仅此而已(不是真的,请参阅下一段)。

但是,如果不是这种情况,您将不得不在样本之间进行插值。为了简单起见,插值意味着通过知道周围样本的值来尝试猜测样本的值。你的大脑一直在做插值:当你看到几个点形成一条线时,你会本能地在脑海中画出这条线。存在几种类型的插值,越简单,精度越低。这通常取决于您的应用程序。

但还有更多...

您可能听说过香农-奈奎斯特采样定理,它指出要对信号进行采样,采样频率必须至少是信号最高谐波的两倍。如果你不这样做,它会导致一种叫做aliasing的东西。我不会在这里解释这个定理,因为到处都有大量可用的信息。

但是记住这个定理,您可能会理解,如果您不小心,对信号进行下采样可能会导致混叠。简单的解决方案是在下采样之前过滤信号,截止频率为Fs2. 滤波器的过渡带越陡,混叠越少

返回您的应用程序

据我了解,您有一个想要映射到屏幕的信号。为此,您需要将信号下采样到屏幕的水平分辨率。让我们称这个决议Hx和你的信号的采样频率Fs. 为了示例,让我们修复Hx=240pxFs=5kHz.

您还有一个时间参数(我们称之为tr) 设置示波器的“缩放”,即信号的长度对应于屏幕的长度。让我们将其设置为tr=100ms免责声明:我完全不知道心电图的频率,所以这完全是任意的)。

这给了你:

Fs=Hxtr=2400.100=2400Hz
请注意,这不是Fs.

应用我之前所说的,你有:

r=FsFs=24005000=0.48

所以首先,你用砖墙过滤你的信号fc=Fs2=1.2kHz,然后您将其下采样一个因子0.48使用插值。


要考虑的另一件事是垂直分辨率。为此,它有点不同,因为您不是对信号进行下采样而是对其进行量化然而,这个过程是相似的,我认为你可以在没有我们帮助的情况下进行推断。