【问题标题】:Find smoothed first derivative from signal with noisy slope从具有噪声斜率的信号中找到平滑的一阶导数
【发布时间】:2017-07-12 11:22:09
【问题描述】:

如何从具有缓慢变化斜率的噪声信号中过滤一阶导数,形式为y=kx+bk可以随着时间慢慢变化,我想估计一下它的价值。

我尝试了 3 种不同的方法:

  1. 取导数为dx(i) = (x(i)-x(i-99))/100
  2. 平滑滑动平均window = 100,然后取导数为dx(i) = (x(i)-x(i-99))/100
  3. 简单的 IIF 过滤器(例如 y(i) = 0.99*y(i-1) + 0.01*x(i),然后将导数作为 dx(i) = y(i)-y(i-1) 并再次使用类似的 IIR 过滤器,例如 dy(i) = 0.95*dx(i-1) + 0.05*dx(i)

问题:

  1. 最小二乘、回归和 FIR 滤波器(矩形窗口除外)具有很高的计算成本,因为我必须将其转换为没有 DSP 的微控制器。这就是为什么我只能使用矩形窗口和 IIR 滤波器(它们的阶数较低)。
  2. 如果我先找到一阶导数,然后再平滑,它将非常嘈杂。所以,我应该先对原始信号进行平滑处理,然后从平滑后的信号中找到导数(也许再对导数进行平滑处理!)。
  3. 我应该手动调整滤波器参数,很难理解整个系统的频率响应。

问题:

也许对于这个特定问题有一个特殊的(最佳?)IIR 滤波器 - 从具有噪声斜率的信号中找到平滑的一阶导数?

【问题讨论】:

  • 这个问题不只是关于信号处理(即不是关于代码/C++)吗?不确定,但我想这个问题有更好的地方。
  • 您可以使用RANSAC algorithm。高性能且易于集成。

标签: matlab signal-processing smoothing


【解决方案1】:

对数据(或缓慢变化的部分数据)执行线性最小二乘拟合,即y=a*x+b。那么a 是您正在寻找的导数的近似值。

【讨论】:

  • 如前所述,“最小二乘、回归和 FIR 滤波器(矩形窗口除外)具有很高的计算成本” - 我无法在每一步中计算 100 阶的滤波器。这就是我寻找低阶 IIR 滤波器的原因。
  • @Sairus 如果这是个问题,那么你真的来错地方了,恕我直言
【解决方案2】:

通常您会得到瞬时导数 x(i)-x(i-1),然后从此处应用标准 IIR 低通滤波器:https://www.mathworks.com/help/signal/ug/iir-filter-design.html

执行这些操作的顺序无关紧要,因为结果完全相同。

您可以通过将导数运算应用于您从 matlab 返回的 b 数组,将这两个操作合并到一个 IIR 滤波器中,但这会将数组长度增加 1,并且不会为您节省任何时间你把它翻译成你的微控制器的代码。事实上,无论如何,您可能会在实现中再次将其分离出来。

在微控制器上,您可能希望先进行微分运算,因为这可能会导致信号幅度较小,从而减少削波的机会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多