使用 MATLAB 通过分段三次样条算法消除基线漂移
Remove base line drift with peicewise cubic spline algorithm using MATLAB
我有一个信号,我想在 MATLAB 中使用分段三次样条算法消除基线漂移。
d=load(file, '-mat');
t=1:length(a);
xq1=1:0.01:length(a);
p = pchip(t,a,xq1);
s = spline(t,a,xq1);
%
figure, hold on, plot(a, 'g'), plot(t,a,'o',xq1,p,'-',xq1,s,'-.')
legend('Sample Points','pchip','spline','Location','SouthEast')
但我看不到任何基线删除..原始数据正好在插值上。
或者在另一个信号中,我们可以看到没有基线被移除。
问题是我如何“使用逐次三次样条插值来
在 MATLAB 中去除基线漂移”。
谢谢
您似乎希望对数据拟合多项式以估计由于热变化引起的基线漂移。 spline
的问题在于它总是完全适合您的数据(类似于 pchip
),因为它是一种插值技术。您可能想要一个可以使用 polyfit
获得的课程。以下代码示例显示了如何使用 polyfit
来估计漂移。在这种情况下,我拟合了一个三阶多项式。
% generate some fake data
t = 0:60;
trend = 0.003*t.^2;
x = trend + sin(0.1*2*pi*t) + randn(1,numel(t))*0.5;
% estimate trend using polyfit
p_est = polyfit(t,x,3);
trend_est = polyval(p_est,t);
% plot results
plot(t,x,t,trend,t,trend_est,t,x-trend_est);
legend('data','trend','estimated trend','trend removed','Location','NorthWest');
更新
如果你有曲线拟合工具箱,你可以用额外的平滑约束来拟合三次样条。在上面的示例中,您可以使用
trend_est = fnval(csaps(t,x,0.01),t);
而不是 polyfit
和 polyval
。您将不得不使用平滑参数,0 是完全线性的,1 给出与 spline
.
相同的结果
我认为你应该减少计算样条拟合的点数(这样可以避免过度拟合)并连续对原始 x 数据进行插值拟合。
t = 0:60;
trend = 0.003*t.^2;
x = trend + sin(0.1*2*pi*t) + randn(1,numel(t))*0.5;
figure;hold on
plot(t,x,'.-')
%coarser x-data
t2=[1:10:max(t) t(end)]; %%quick and dirty. I probably wanna do better than this
%spline fit here
p = pchip(t,x,t2);
s = spline(t,x,t2);
plot(t2,s,'-.','color' ,'g')
%interpolate back
trend=interp1(t2,s,t);
%remove the trend
plot(t,x-trend,'-.','color' ,'c')
我有一个信号,我想在 MATLAB 中使用分段三次样条算法消除基线漂移。
d=load(file, '-mat');
t=1:length(a);
xq1=1:0.01:length(a);
p = pchip(t,a,xq1);
s = spline(t,a,xq1);
%
figure, hold on, plot(a, 'g'), plot(t,a,'o',xq1,p,'-',xq1,s,'-.')
legend('Sample Points','pchip','spline','Location','SouthEast')
但我看不到任何基线删除..原始数据正好在插值上。
或者在另一个信号中,我们可以看到没有基线被移除。
问题是我如何“使用逐次三次样条插值来 在 MATLAB 中去除基线漂移”。
谢谢
您似乎希望对数据拟合多项式以估计由于热变化引起的基线漂移。 spline
的问题在于它总是完全适合您的数据(类似于 pchip
),因为它是一种插值技术。您可能想要一个可以使用 polyfit
获得的课程。以下代码示例显示了如何使用 polyfit
来估计漂移。在这种情况下,我拟合了一个三阶多项式。
% generate some fake data
t = 0:60;
trend = 0.003*t.^2;
x = trend + sin(0.1*2*pi*t) + randn(1,numel(t))*0.5;
% estimate trend using polyfit
p_est = polyfit(t,x,3);
trend_est = polyval(p_est,t);
% plot results
plot(t,x,t,trend,t,trend_est,t,x-trend_est);
legend('data','trend','estimated trend','trend removed','Location','NorthWest');
更新
如果你有曲线拟合工具箱,你可以用额外的平滑约束来拟合三次样条。在上面的示例中,您可以使用
trend_est = fnval(csaps(t,x,0.01),t);
而不是 polyfit
和 polyval
。您将不得不使用平滑参数,0 是完全线性的,1 给出与 spline
.
我认为你应该减少计算样条拟合的点数(这样可以避免过度拟合)并连续对原始 x 数据进行插值拟合。
t = 0:60;
trend = 0.003*t.^2;
x = trend + sin(0.1*2*pi*t) + randn(1,numel(t))*0.5;
figure;hold on
plot(t,x,'.-')
%coarser x-data
t2=[1:10:max(t) t(end)]; %%quick and dirty. I probably wanna do better than this
%spline fit here
p = pchip(t,x,t2);
s = spline(t,x,t2);
plot(t2,s,'-.','color' ,'g')
%interpolate back
trend=interp1(t2,s,t);
%remove the trend
plot(t,x-trend,'-.','color' ,'c')