确定缓慢下降信号的最大斜率

时间:2015-07-28 15:15:41

标签: algorithm

我有一个来自电机的模拟电源信号。信号快速上升,但在几秒钟内缓慢关闭。信号看起来几乎像下降时的一系列高原。问题是信号没有恢复到零。它恢复到一个未知的中间水平,并且从电动机到电动机不同。见下图。 我试图找到一种方法来确定电机何时关闭并处于中间水平。 我的想法是找到并存储最大点,然后计算斜率,直到最大斜率大于某个大的负斜率值,如-160(〜-60度),并声明电机必须断电。下面的示例点删除了所有重复项。 (通常约有5000个样本)。 我的问题是确定X值。在公式(y2-y1)/(x2-x1)中,x值可以在时间上足够远,使得斜率永远不会出现大于-30度。选择像10这样的绝对数字可以解决这个问题,但是有更多数学上正确的方法吗?

数据显示我用上述方法计算斜率,最大值为921.即(y2-y1)/((10 + 1)-10)。在这个方案中,在数据点9,我会说电机是"关"。我正在寻找一种更精确的方法来确定X值,而不是随机选择10。 +---+-----+----------+ | X | Y | Slope | +---+-----+----------+ | 1 | 65 | 856.000 | | 2 | 58 | 863.000 | | 3 | 57 | 864.000 | | 4 | 638 | 283.000 | | 5 | 921 | 0.000 | | 6 | 839 | -82.000 | | 7 | 838 | -83.000 | | 8 | 811 | -110.000 | | 9 | 724 | -197.000 | +---+-----+----------+

enter image description here

1 个答案:

答案 0 :(得分:0)

编辑:一个更简单的答案:

由于您的电机是ON或OFF,并且ON瓦数严格高于OFF瓦数,您应该能够通过维持平均瓦数来区分ON和OFF瓦数,如果当前测量值高于平均值则报告ON如果它更低,则为OFF。

Count = 0
Average = 500

无论何时进行测量,

Count = Count + 1
Average = Average + (Measurement - Average) / Count
Return Measurement > Average ? ON : OFF

这代表瓦数所有值的平均值。如果我们想最终“忘记”最早的值(在电机开启之前),我们可以保留最近值的缓冲区并将其用于移动平均线,或者使用IIR近似移动平均值

Average = (1-X) * Average + X * Measurement

对于0和1之间的某些X(更接近0以更慢地变化)。

原始回答:

您可以将此视为在线群集问题,您需要三个群集(在电机开启之前,电机开启时以及电机关闭时),或者可能是四个(在电机开启之前,峰值功率,当电动机正常运行时,以及电动机关闭时)。实际上,您正试图了解电机开启(或关闭)时的样子。

如果您没有关于电机是打开还是关闭的任何其他信息(可用于训练模型),这里有一个简单的方法:

Define an "Estimate" to contain:
    float Value
    int Count

Define an "Estimator" to contain:
    float TotalError  = 0.0
    Estimate COLD_OFF = {Value = 0,    Count = 1}
    Estimate ON       = {Value = 1000, Count = 1}
    Estimate WARM_OFF = {Value = 500,  Count = 1}

    a function Update_Estimate(float Measurement)
        Find the Estimate E such that E.Value is closest to Measurement
        Update TotalError = TotalError + (E.Value - Measurement)*(E.Value - Measurement)
        Update E.Value = (E.Value * E.Count + P) / (E.Count + 1)
        Update E.Count = E.Count + 1
        return E

这需要对这些阶段的瓦数应该是什么进行初步猜测,并使用测量结果更新它们。但是,这有一些问题。如果我们最初的猜测结束了怎么办?

您可以使用COLD_OFF,ON和WARM_OFF的不同可能(例如随机)猜测初始化一些估算器;收到测量结果后,让每个Estimator自行更新并以某种方式聚合它们的值。这种聚合应该奖励更好的估计。由于您为每个估计存储了TotalError,因此您可以选择目前为止具有最低TotalError的Estimator的输出,或者您可以让Estimators投票(给每个Estimator投票的权重与1 /(TotalError + 1)成比例)或类似的东西)。