sdtrend   remove annually cycle in matlab

function [y,psave,ssave]=sdtrend(x,T,n,plfg,descriptor)

%

%   [y,psave,ssave]=sdtrend(x,T,n,plfg,descriptor)

%

% x = input series

% T = period

% n = order of polynomials to fit

% plfg > 0 to plot series, residuals and seasonal trends

% descriptor = string for plots

if plfg

    �=figure;

    subplot(211);

    plot(x);

    title([descriptor,' with seasonal polys of degree : ',int2str(n)]);

    hold on;

end

colors=['y';'m';'c';'r';'g';'b'];

ncols=6;

colper=ncols;

if T < ncols

    colper=T;

end

nx=length(x);

resid0=zeros(size(x));

ssave=[];

psave=[];

%legstr=descriptor;

legstr=[];

cnum=1;

for j=1:T

    indexes=[j:T:nx];       % get the indexes starting at j and skipping by T

    xs=x(indexes);          % xs is x sampled at these indexes

    [pout,sout]=polyfit(indexes',xs,n);

    ssave=[ssave;sout];

    psave=[psave;pout];

    y=polyval(pout,indexes)'; % make it a column

    if plfg

        %figure(f1);

        hold on;

        plot(indexes',y,colors(cnum));

%         legstr=[legstr;sprintf('s = %0.2d',j)];

        cnum=rem(cnum,colper)+1;

    end

    resid0(indexes)=x(indexes)-y;

    

end

y=resid0;

if plfg

    % put on the legend for last plot

%     legend(legstr,2);   % 2 puts legend in upper left corner

    hold off;

    

    %figure;

    subplot(212);

    plot(resid0);

    title([descriptor,'resids from sdtrend with polys of degree : ',int2str(n)]);

end

原文地址:https://www.cnblogs.com/gisalameda/p/12840556.html