从具有嘈杂斜率的信号中找到平滑的一阶导数

时间:2017-07-12 11:22:10

标签: matlab signal-processing smoothing

如何从具有y=kx+b形式缓慢变化斜率的噪声信号中滤除一阶导数? k可以在时间上慢慢改变,我想估计它的价值。

slope noise

我尝试了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)
  4. 问题:

    1. 最小二乘,回归和FIR滤波器(矩形窗除外)具有很高的计算成本,因为我必须将其转换为没有DSP的微控制器。这就是为什么我只能使用矩形窗口和IIR滤镜(它们的顺序很低)。
    2. 如果我先找到一阶导数,那么光滑,就会很吵。所以,我应该首先平滑原始信号,然后找到平滑信号的导数(并且可能再次平滑导数!)。
    3. 我应该手动使用滤波器参数,很难理解整个系统的频率响应。
    4. 问题:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

您可以将衍生操作应用到从matlab返回的b数组,将这两个操作合并到一个IIR过滤器中,但这会将数组长度增加1并且不会为您节省任何数据将它翻译成微控制器代码的时间。实际上,无论如何,你可能会在实现中将它再次分开。

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