【问题标题】:What actually are the transfer functions in filtfilt (Matlab's zero-offset filter)?filtfilt(Matlab 的零偏移滤波器)中的传递函数实际上是什么?
【发布时间】:2020-03-16 14:22:26
【问题描述】:

我正在尝试修改一些代码,这些代码从 6 小时平均值的输入生成每日平均时间序列,而不是使用具有 1 小时平均值的数据。这样做的方式似乎是使用 Matlab 的 filtfilt 函数和 b=[0.5 1 1 1 0.5]/4a=[1 0 0 0 0],这显然是滤波器传递函数。问题是我完全不知道滤波器传递函数是什么(我发现的大多数解释都需要我没有的工程背景),因此我不确定如何调整这个滤波器来代替使用 1 -每小时的意思。

天真地,由于 6 小时平均时间序列每天有 4 个数据点,我想知道这是否就是 b 中的数字加起来为 4 的原因,因为我现在有 24 个数据点每天,如果我需要的值是:

b=[0.5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.5]

a=[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

但我真的不确定!

【问题讨论】:

    标签: matlab filter


    【解决方案1】:

    a = 1filter 简单地应用卷积(在一个方向上)和filtfilt 在两个方向上应用卷积(向前然后向后)。

    所以filtfilt 无非是双向卷积,这里是正向一维连续卷积的例子。

    来源:维基百科,Lautaro Carmona 的动画

    例如:

    close all
    % make the example reproductible
    rng('default')
    % random vector
    x = rand(72,1); 
    
    % a, the trailing zero are totally useless.
    a = 1; 
    % b
    b = [0.5 1 1 1 0.5];
    % filtfilt
    Xfilt = filtfilt(b/4,a,x);
    % forward and then backward convolution
    Xconv = fliplr(conv(fliplr(conv(x,b/4,'same')),b/4,'same'));
    
    % plot the result
    hold on
    plot(Xfilt)
    plot(Xconv)
    legend('filtfilt','convolution')
    

    输出这个数字:

    卷积和 filtfilt 函数按预期输出相同的值(边界除外,因为filtfilt 补偿了边界效应)。

    如果您还补偿边界效应,您甚至可以获得完全相同的结果。

    现在很清楚,我们必须将b 除以sum(b) 以应用移动平均线。

    确实,如果您需要应用移动平均线来考虑过去的 12 个值和接下来的 12 个值,那么您的 b 向量应该是 [0.5 ones(1,23) 0.5]

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2018-11-03
      • 2020-12-24
      • 1970-01-01
      • 2015-01-29
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多