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

Matlab低通滤波器输出初始值/结束值,matlab,filter,lowpass-filter,Matlab,Filter,Lowpass Filter,我有一个不需要的振荡载波的信号,如蓝色曲线所示。我制作了一个低通滤波器(5阶butterworth)并应用了filtfilt函数,低通滤波器的输出是红色曲线 [b,a] = butter(5,.7); y = filtfilt(b,a,y); 从x值500到终点的红色曲线正是我想要的,但是初始振荡仍然存在。似乎filter函数试图匹配filter输入和输出的初始/结束值,因此振荡保持不变。有没有办法取消初始值的匹配,这样我就可以在没有任何振荡的情况下获得平滑的输出 更新: 我想我的问题不清楚

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

[b,a] = butter(5,.7);
y = filtfilt(b,a,y);
从x值500到终点的红色曲线正是我想要的,但是初始振荡仍然存在。似乎filter函数试图匹配filter输入和输出的初始/结束值,因此振荡保持不变。有没有办法取消初始值的匹配,这样我就可以在没有任何振荡的情况下获得平滑的输出

更新:
我想我的问题不清楚。我想要黑色曲线(手绘):完全消除振荡,并且不匹配初始值。我该怎么做

简而言之,你所问的是不可能的

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

这里的过滤器实际上有一个很好的上升时间——只需要10个样本就可以开始正确跟踪输入


发生的振荡称为“超调”——在设计滤波器时,在上升时间和超调之间有一个折衷,不能有快速上升时间和无超调。维基百科上的文章对你来说可能是一个很好的资源。

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

你考虑过用一些参数曲线来拟合信号吗?由于寻找的曲线位于信号中间(没有“异常值”),因此最小二乘拟合似乎可以做得很好

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

我在这个例子中使用<代码> PultFult <代码> DEG=5 < /Cord>,但是您可以考虑不同的功能和不同的程度。


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

当遇到这个问题时,我通常会在过滤信号之前创建一个启动信号

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

[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);
这样可以确保启动的时间最少,并且您可以“启动运行”。

在应用黄油过滤器之前,尝试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');

希望它仍然有用。

那么你正在寻找一个?@FabianTamp实际上不,我只是想完全消除振荡,并检索“平均”趋势曲线。因此,我希望红色曲线从中间开始(大约值22),而不是信号初始值(大约值27)。你是说低通滤波器不能做到这一点吗?还有什么方法可以消除振荡?你能分享原始数据向量
y
,这样我们可以尝试不同的方法吗?我明白了。这是有道理的。所以低通滤波器不能满足我的需要。那么还有什么方法可以消除这种振荡呢?一定有办法,对吧?这只是一个数学问题。如果对过滤器进行临界阻尼,可以消除振荡,但这会减少上升时间。谢谢,但我想我的问题你不清楚,或者根本不正确。我现在更新了它,我想要像黑色曲线一样的东西,完全消除振荡,只留下趋势线。极度潮湿仍然会使我的体温最初升高。也许在最后增加信号也值得。此外,您可以使用函数
paddarray
来实现此目的,它有几个有趣的填充选项。