1 ## Copyright (C) 2007 R.G.H. Eschauzier <reschauzier@yahoo.com>
3 ## This program is free software; you can redistribute it and/or modify it under
4 ## the terms of the GNU General Public License as published by the Free Software
5 ## Foundation; either version 3 of the License, or (at your option) any later
8 ## This program is distributed in the hope that it will be useful, but WITHOUT
9 ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 ## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 ## You should have received a copy of the GNU General Public License along with
14 ## this program; if not, see <http://www.gnu.org/licenses/>.
16 ## Adapted by Carnë Draug on 2011 <carandraug+dev@gmail.com>
18 ## This function is necessary for impinvar and invimpinvar of the signal package
20 ## Inverse of Octave residue function
21 function [b_out, a_out] = inv_residue(r_in, p_in, k_in, tol)
23 n = length(r_in); % Number of poles/residues
25 k = 0; % Capture contstant term
26 if (length(k_in)==1) % A single direct term (order N = order D)
27 k = k_in(1); % Capture constant term
28 elseif (length(k_in)>1) % Greater than one means non-physical system
29 error("Order numerator > order denominator");
35 b_out += k*a_out; % Constant term: add k times denominator to numerator
38 term = [1 -p_in(i)]; % Term to be factored out
39 p = r_in(i)*deconv(a_out,term); % Residue times resulting polynomial
40 p = prepad(p, n+1, 0, 2); % Pad for proper length
46 while (i<n && abs(first_pole-p_in(i+1))<tol) % Multiple poles at p(i)
49 mterm = conv(mterm, term); % Next multiplicity to be factored out
50 p = r_in(i) * deconv(a_out, mterm); % Resulting polynomial
51 p = prepad(p, n+1, 0, 2); % Pad for proper length