在 C# 中测量一个脉冲的开启和关闭时间

Measuring the on and off time of a of a pulse in C#

我正在尝试确定低频数字信号何时开启和关闭。一旦我可以准确地确定转换,就可以测量打开时间和关闭时间。

信号在 0.5Hz 到 5Hz 的任意位置运行。我大约每 30 毫秒得到一个样本。这是一个浮点值,一旦转换发生,它通常非常一致,但在转换发生时会发生变化。而且,不幸的是,这种转变不是瞬间的。有时会有 2 或 3 个样本的值在变化,并且样本之间的样本值永远不会相同,总会有一点抖动。

我试过取大量样本,对它们进行排序,取平均值并对低于平均值的值进行平均以表示 OFF,将平均值附近的值的平均值表示为 ON。这有点奏效,因为 99 个样本的平均值应该是第 50 个样本。不幸的是,在现实世界中,您不能总是在均值两侧获得在 ON 或 OFF 状态下完美的 49 个值。

那么,这是我应该使用移动平均线还是指数平均线的东西?离散傅里叶变换?快速傅里叶变换?我还尝试将上一个样本与下一个样本进行比较,结果几乎一样好。但是我仍然无法获得准确的值来说明发生了转换。

例如:

设备处于 "unknown" 状态,样本如下所示:

很容易看出S0和S1处于OFF状态,S2和S3处于ON状态,而S4和S5趋向于OFF状态,那么S4和S5属于哪个状态呢? (仅供参考,数据从来没有这么干净,我使用的是转换非常非常快的模拟设备)

谢谢, 道格

您可以尝试使用时间常数约为 0.5 秒的低通滤波器来消除一些抖动。然后在低通滤波器结果的一阶导数中寻找每个开始最陡峭部分的峰值。如有必要,在第一个差异样本之间插入(二次或三次)该峰。

如果您先验知道噪声的大致大小"jitter",您可能仍然需要使用高于此抖动的阈值来防止误报。

逐次逼近:也可以设置任意阈值;然后检查生成的转换决策,看它们是否符合您的信号定义标准(所有或大部分脉冲宽度在 0.5 和 5 Hz 之间)。如果不上下调整阈值,直到满足(或最大化)您的标准。如果您找到一个有效的转换阈值范围,请选择中值以获得最大的抗噪性。