filtfilt(Matlab的零偏移滤波器)中的传递函数实际上是什么?

问题描述 投票:0回答:1

我正在尝试修改一些代码,该代码从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个回答
0
投票

[a = 1时,filter仅在一个方向上应用卷积,filtfilt在两个方向(向前然后向后)应用卷积。

所以filtfilt只不过是双向卷积:

例如:

close all
% make the example reproductible
rng('default')
% random vector
x = rand(72,1); 

% a, the trailing zero are totally useless.
a = 1; 
% b, that can be seen as the convolution product
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')

输出此图:

enter image description here

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

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

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

因此,实际上,如果您需要应用移动平均值来考虑过去的12个值和接下来的12个值,则b向量应为[0.5 ones(1,23) 0.5]

© www.soinside.com 2019 - 2024. All rights reserved.