Matlab低通滤波器输出初始值/结束值

时间:2012-12-30 05:55:13

标签: matlab filter lowpass-filter

我有一个带有不需要的振荡载波的信号,如蓝色曲线所示。我做了一个低通滤波器(5阶butterworth)并应用filtfilt函数,低滤波输出是红色曲线。

[b,a] = butter(5,.7);
y = filtfilt(b,a,y);

enter image description here 从x值500到末端的红色曲线正是我想要的,但是初始振荡仍然存在。看起来滤波器函数试图匹配滤波器输入和输出的初始/结束值,因此振荡保持不变。有没有办法不匹配初始值,所以我可以得到平滑的输出,没有任何振荡?

更新: 我认为我的问题不明确。我想要像黑色曲线(手绘)之类的东西:完全消除振荡,并且不匹配初始值。我怎样才能做到这一点? enter image description here

4 个答案:

答案 0 :(得分:5)

简短的回答是你所要求的是不可能的。

所有过滤器都需要一些时间来“预热” - 这被称为过滤器的“上升时间”。之所以会出现这种情况,是因为n - 阶过滤器执行了最后n个样本的加权平均值,并且当信号首次启动时,样本的积压不可用。

你到达那里的过滤器实际上有一个非常好的上升时间 - 它只需要大约10个样本才能开始正确地跟踪输入。

发生的振荡被称为“过冲” - 在设计滤波器时,需要在上升时间和过冲之间进行权衡,不能有快速上升时间和没有过冲。关于damping的维基百科文章对您来说可能是一个很好的资源。

答案 1 :(得分:3)

当遇到这个问题时,我经常要做的就是在过滤后的信号之前创建一个启动信号。

对于低通滤波器来说,这是一项相对简单的任务,但取决于您的原始信号。我最初的尝试是反映关于原点的部分信号:

[b,a] = butter(5,.7);
N = 50; % change this to suit your needs
    yNew = filtfilt(b,a,[y(N:-1:1);y];
yNew = yNew(N+1:end);

这可确保启动最少,并且您可以“开始运行”。

答案 2 :(得分:1)

阅读之前的答案和评论,似乎过滤并不是这个特定问题的最佳答案。

您是否考虑过使用某些参数曲线拟合信号?由于寻求的曲线位于信号之中(没有“异常值”),看起来最小二乘拟合可以做得很好。

% assuming y is your signal
% fit polynomial of degree Deg
Deg = 5; 
x = linspace(0,1, numel(y));
p = polyfit( x, y, Deg );
figure('Name','fit poly');
plot( y, '-+b');
hold all;
plot( polyval( p, x ), ':k', 'LineWidth', 1.2 );

我在此示例中使用了polyfitDeg=5,但您可以考虑不同的功能和不同的程度。

您可能会发现fit是一个有用的工具。

答案 3 :(得分:1)

在应用黄油过滤器之前尝试sgolay过滤(顺序1应该足够)。 Sgolayfilter通过其基础多项式近似(第1阶的线)拟合初始点。 请参阅与您的数据类似的示例

tt=0:1000;
toto=cos(.3*tt).*cos(tt*pi/4000)-tt/500+sin(pi*tt/1000);
[B,A]=butter(4,.02);
plot(tt,toto,tt,filtfilt(B,A,toto),'r',tt,filtfilt(B,A,sgolayfilt(toto,1,51)),'k');

希望它可能仍有帮助。