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

filtfilt(Matlab的零偏移滤波器)中的传递函数是什么?,matlab,filter,Matlab,Filter,我试图修改一些代码,从6小时平均值的输入中生成每日平均值时间序列,以使用1小时平均值的数据。这样做的方式似乎是使用Matlab的filtfilt函数和b=[0.5 1 0.5]/4和a=[1 0 0 0 0],它们显然是滤波器传递函数。问题是,我完全不知道什么是过滤器传递函数(我发现的大多数解释都需要我没有的工程背景),因此我不确定如何调整这个过滤器,而不是使用1小时平均值 天真地说,由于6小时平均时间序列每天有4个数据点,我想知道这是否是b中的数字加起来为4的原因,并且由于我现在每天有24个数

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

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

b=[0.5110.5]

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


但我真的不确定

a=1
时,
filter
只需在一个方向上应用卷积,而
filter
在两个方向上应用卷积(向前然后向后)

因此,
filtfilt
只不过是两个方向上的卷积,这里是正向1D连续卷积的示例

资料来源:维基百科,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个一(1,23)0.5]