X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fm%2Fsignal%2Fdetrend.m;fp=octave_packages%2Fm%2Fsignal%2Fdetrend.m;h=50ac4c4e6788a425d8da048fa50eb0606e2b47eb;hp=0000000000000000000000000000000000000000;hb=1c0469ada9531828709108a4882a751d2816994a;hpb=63de9f36673d49121015e3695f2c336ea92bc278 diff --git a/octave_packages/m/signal/detrend.m b/octave_packages/m/signal/detrend.m new file mode 100644 index 0000000..50ac4c4 --- /dev/null +++ b/octave_packages/m/signal/detrend.m @@ -0,0 +1,89 @@ +## Copyright (C) 1995-2012 Kurt Hornik +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {} detrend (@var{x}, @var{p}) +## If @var{x} is a vector, @code{detrend (@var{x}, @var{p})} removes the +## best fit of a polynomial of order @var{p} from the data @var{x}. +## +## If @var{x} is a matrix, @code{detrend (@var{x}, @var{p})} does the same +## for each column in @var{x}. +## +## The second argument is optional. If it is not specified, a value of 1 +## is assumed. This corresponds to removing a linear trend. +## +## The order of the polynomial can also be given as a string, in which case +## @var{p} must be either @t{"constant"} (corresponds to @code{@var{p}=0}) or +## @t{"linear"} (corresponds to @code{@var{p}=1}). +## @seealso{polyfit} +## @end deftypefn + +## Author: KH +## Created: 11 October 1994 +## Adapted-By: jwe + +function y = detrend (x, p = 1) + ## Check input + if (nargin > 0 && isreal (x) && ndims (x) <= 2) + ## Check p + if (ischar (p) && strcmpi (p, "constant")) + p = 0; + elseif (ischar (p) && strcmpi (p, "linear")) + p = 1; + elseif (!isscalar (p) || p < 0 || p != fix (p)) + error ("detrend: second input argument must be 'constant', 'linear' or a positive integer"); + endif + else + error ("detrend: first input argument must be a real vector or matrix"); + endif + + [m, n] = size (x); + if (m == 1) + x = x'; + endif + + r = rows (x); + b = ((1 : r)' * ones (1, p + 1)) .^ (ones (r, 1) * (0 : p)); + y = x - b * (b \ x); + + if (m == 1) + y = y'; + endif + +endfunction + +%!test +%! N=32; +%! x = (0:1:N-1)/N + 2; +%! y = detrend(x); +%! assert(all (all (abs (y) < 20*eps))); + +%!test +%! N=32; +%! t = (0:1:N-1)/N; +%! x = t .* t + 2; +%! y = detrend(x,2); +%! assert(all (all (abs (y) < 30*eps))); + +%!test +%! N=32; +%! t = (0:1:N-1)/N; +%! x = [t;4*t-3]'; +%! y = detrend(x); +%! assert(all (all (abs (y) < 20*eps))); +