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

而不是 polyfitpolyval。您将不得不使用平滑参数,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')