filtfilt(Matlab的零偏移滤波器)中的传递函数是什么?
我试图修改一些代码,从6小时平均值的输入中生成每日平均值时间序列,以使用1小时平均值的数据。这样做的方式似乎是使用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个数
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]