如何找到数字信号的拐点?

信息处理 采样 过滤 最小二乘 衍生物
2022-02-07 23:29:01

假设我想找到一个数字信号的拐点,该数字信号是通过对采样周期为 $100\,\mu s$的连续时域信号的采样而收集的。数字信号图是这样的

在此处输入图像描述

我的第一个想法是使用移动平均滤波器对原始数字信号进行预处理,计算滤波信号的导数,并在此基础上找到拐点。

在此处输入图像描述

这种方法被证明是不合适的,因为尽管经过移动平均滤波,导数仍然包含噪声。

在此处输入图像描述

我已经对移动平均滤波器的各种窗口长度(16、32、64、128、256)进行了实验,但对导数中存在的噪声水平没有任何积极影响。有人可以推荐我更好的方法来找到数字信号的拐点吗?

编辑

我决定根据曲线拟合选择不同的方法。这个想法利用了这样一个事实,即原始数字信号是具有传输延迟的连续时域一阶系统的阶跃响应,即传递函数为

$$\frac{A}{\tau\cdot s + 1}\cdot e^{-s\cdot T_d}$$

所以阶跃响应的拉普拉斯变换应该是

$$A\cdot\frac{\frac{1}{\tau}}{s\cdot(s + \frac{1}{\tau})}\cdot e^{-s\cdot T_d}$$

我认为基于此我可以说拟合曲线应采用以下形式

$$A\cdot\left[1 - e^{(-\frac{t-T_d}{\tau})}\right]$$

所以最小二乘算法的未知参数是$A, T_d, \tau$我已经使用了 Scilab 软件包的函数minimumsq 来完成该任务,并且我收到了以下输出

在此处输入图像描述

这让我感到惊讶,因为它揭示了系统可能具有更复杂的动态。

1个回答

我不太确定这是否有效,但这是一个尝试:只需对你的导数(梯度)进行中值过滤并使用它的峰值。

我合成了类似你的信号的东西:

合成信号

然后取导数:

合成信号的导数

然后对其进行中值过滤(峰值用红点表示):

导数的中值滤波,红点表示峰值


下面的 Python 代码

import matplotlib.pyplot as plt
import numpy as np
from scipy import signal

T = 1024
Ton = 100

x = np.random.normal(0,0.1, T)

for t in np.arange(Ton,T):
    x[t] = x[t] + 10*(1-np.exp(-(t-Ton)/50))

dxdt = np.gradient(x)
median_dxdt = signal.medfilt(dxdt,31)

mx = median_dxdt.max()
ix = np.argmax(median_dxdt)

plt.figure(1)
plt.plot(x)

plt.figure(2)
plt.plot(dxdt)

plt.figure(3)
plt.plot(median_dxdt)
plt.plot(ix,mx,'r.')