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

3

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

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

enter image description here 红色曲线从x值500到结束的部分正是我想要的,但初始振荡仍然存在。看起来滤波器函数试图匹配滤波器输入和输出的初始/结束值,因此振荡保留。有没有一种方法可以取消匹配初始值,以便我可以获得一个平滑的输出而没有任何振荡?

更新: 我认为我的问题不够清晰。我想要像黑色曲线(手绘)那样的东西:完全消除振荡,并且不匹配初始值。我该怎么做?enter image description here


1
所以你正在寻找一个临界阻尼响应 - Fabian Tamp
@FabianTamp 实际上不是,我只是想完全消除振荡并恢复“平均”趋势曲线。因此,我希望红色曲线从中间开始(例如值为22),而不是信号初始值(约为27)。您是否在说低通滤波器无法做到这一点?还有什么其他方法可以消除振荡? - LWZ
你能分享原始数据向量 y 吗?这样我们就可以尝试不同的方法了。 - bla
5个回答

6
简短的回答是你所要求的不可能实现。
所有滤波器都需要一些时间来“热身”-这被称为滤波器的“上升时间”。这是因为n阶滤波器执行最后n个样本的加权平均值,当信号刚开始时,那些积压的样本是不可用的。
你拥有的滤波器实际上具有相当好的上升时间-只需要大约10个样本就可以开始正确跟踪输入。
发生的振荡被称为“过冲”-在设计滤波器时,存在上升时间和过冲之间的权衡,无法快速上升时间和没有过冲。维基百科上damping的文章可能对你有所帮助。

我明白了,这很有道理。那么低通滤波器不能给我所需的结果。那么还有什么其他方法可以帮我消除这种振荡呢?肯定有办法的,对吧?这只是一个数学问题。 - LWZ
如果你对滤波器进行过度阻尼,可以消除振荡,但这将降低上升时间。 - Fabian Tamp
谢谢,但我觉得我的问题可能没有表达清楚,或者根本就不正确。我现在已经更新了它,我想要像黑色曲线一样的东西,完全消除振荡,只留下趋势线。临界阻尼仍然会给我初始上升。 - LWZ

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);

这确保了启动过程的最小化,使您能够“轻松上手”。

1
在信号的末尾进行填充可能是值得的。此外,您可以使用函数padarray来实现这个目的,它具有几个有趣的填充选项。 - Shai

1
在应用Butter滤波器之前,尝试使用Sgolay滤波器(一阶应该足够)。Sgolay滤波器使用其基础多项式逼近(对于一阶是直线)拟合初始点。 请参见类似于您的数据的示例。
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');

希望它仍然有所帮助。

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 );

在这个例子中,我使用了polyfit来进行Deg=5的操作,但你可以考虑不同的函数和不同的次数。

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


0

运行前向滤波器以生成红色曲线。然后再次通过滤波器运行红色曲线,这次从红色曲线的最后一个值开始向后运行。这将平滑红色曲线开头的瞬态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接