changelog shortlog tags changeset files revisions annotate raw

scripts/signal/detrend.m

changeset 10289: 4b124317dc38
parent:a1dbe9d80eee
author: John W. Eaton <jwe@octave.org>
date: Tue Feb 09 20:58:55 2010 -0500 (37 minutes ago)
permissions: -rw-r--r--
description: base_properties::set_children: account for hidden children
1## Copyright (C) 1995, 1996, 1999, 2000, 2002, 2005, 2006, 2007
2## Kurt Hornik
3##
4## This file is part of Octave.
5##
6## Octave is free software; you can redistribute it and/or modify it
7## under the terms of the GNU General Public License as published by
8## the Free Software Foundation; either version 3 of the License, or (at
9## your option) any later version.
10##
11## Octave is distributed in the hope that it will be useful, but
12## WITHOUT ANY WARRANTY; without even the implied warranty of
13## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14## General Public License for more details.
15##
16## You should have received a copy of the GNU General Public License
17## along with Octave; see the file COPYING. If not, see
18## <http://www.gnu.org/licenses/>.
19
20## -*- texinfo -*-
21## @deftypefn {Function File} {} detrend (@var{x}, @var{p})
22## If @var{x} is a vector, @code{detrend (@var{x}, @var{p})} removes the
23## best fit of a polynomial of order @var{p} from the data @var{x}.
24##
25## If @var{x} is a matrix, @code{detrend (@var{x}, @var{p})} does the same
26## for each column in @var{x}.
27##
28## The second argument is optional. If it is not specified, a value of 1
29## is assumed. This corresponds to removing a linear trend.
30## @end deftypefn
31
32## Author: KH <Kurt.Hornik@wu-wien.ac.at>
33## Created: 11 October 1994
34## Adapted-By: jwe
35
36function y = detrend (x, p)
37
38 if (nargin == 1)
39 p = 1;
40 elseif (nargin == 2)
41 if (! (isscalar (p) && p == round (p) && p >= 0))
42 error ("detrend: p must be a nonnegative integer");
43 endif
44 else
45 print_usage ();
46 endif
47
48 [m, n] = size (x);
49 if (m == 1)
50 x = x';
51 endif
52
53 r = rows (x);
54 b = ((1 : r)' * ones (1, p + 1)) .^ (ones (r, 1) * (0 : p));
55 y = x - b * (b \ x);
56
57 if (m == 1)
58 y = y';
59 endif
60
61endfunction
62
63%!test
64%! N=32;
65%! x = (0:1:N-1)/N + 2;
66%! y = detrend(x);
67%! assert(all (all (abs (y) < 20*eps)));
68
69%!test
70%! N=32;
71%! t = (0:1:N-1)/N;
72%! x = t .* t + 2;
73%! y = detrend(x,2);
74%! assert(all (all (abs (y) < 30*eps)));
75
76%!test
77%! N=32;
78%! t = (0:1:N-1)/N;
79%! x = [t;4*t-3]';
80%! y = detrend(x);
81%! assert(all (all (abs (y) < 20*eps)));
82