代码之家  ›  专栏  ›  技术社区  ›  Juliette

基于MATLAB的peicewise三次样条算法消除基线漂移

  •  5
  • Juliette  · 技术社区  · 7 年前

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

    但我看不到任何基线删除。。原始数据恰好位于插值数据上。 Displayed plot

    plot2

    问题是我如何“使用peicewise三次样条插值

    非常感谢。

    2 回复  |  直到 7 年前
        1
  •  5
  •   jodag    7 年前

    似乎您希望将多项式拟合到数据中,以估计由于热变化引起的基线漂移。问题在于 spline pchip )因为这是一种插值技术。你可能想要一个适合你的courser,你可以使用它 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);
    

    拟合 polyval 样条曲线 .

    enter image description here

        2
  •  3
  •   shamalaia    7 年前

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

    result