3

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

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

在此处输入图像描述 从 x 值 500 到结束的红色曲线正是我想要的,但是初始振荡仍然存在。似乎过滤器函数试图匹配过滤器输入和输出的初始/结束值,因此振荡保留。有没有办法使初始值不匹配,这样我就可以获得平滑的输出而没有任何振荡?

更新:我认为我的问题不清楚。我想要黑色曲线(手绘)之类的东西:完全消除振荡,并且不匹配初始值。我怎样才能做到这一点?在此处输入图像描述

4

4 回答 4

6

简短的回答是,你所问的是不可能的。

所有过滤器都需要一些时间来“预热”——这被称为过滤器的“上升时间”。发生这种情况是因为n阶滤波器对最后一个样本执行加权平均n,并且当信号第一次开始时,该积压的样本不可用。

你在那里的滤波器实际上有一个相当好的上升时间——只需要大约 10 个样本就可以开始正确跟踪输入。

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

于 2012-12-30T06:26:01.530 回答
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);

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

于 2013-01-01T07:23:01.767 回答
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一个有用的工具。

于 2012-12-31T09:38:30.523 回答
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');

希望它仍然有帮助。

于 2013-04-04T16:47:46.473 回答