speedup filter function
[scilab.git] / scilab / modules / signal_processing / macros / %_filter.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA - Serge STEER <serge.steer@inria.fr>
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function [y, z] = %_filter(b, a, x, z)
14     fname = "filter"
15     [lhs, rhs] = argn(0)
16
17     if rhs < 3 | rhs > 4
18         error(msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"), fname, 3, 4));
19     end
20
21     if rhs == 3
22         z = 0;
23     end
24
25     type_b = typeof(b);
26     type_a = typeof(a);
27     type_x = typeof(x);
28     type_z = typeof(z);
29
30     if type_b <> "constant" & type_b <> "polynomial"
31         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 1));
32     end
33
34     if type_a <> "constant" & type_a <> "polynomial"
35         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 2));
36     end
37
38     if type_x <> "constant"
39         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 3));
40     end
41
42     if type_z <> "constant"
43         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 4));
44     end
45
46     if ~isreal(b)
47         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 1));
48     end
49
50     if ~isreal(a)
51         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 2));
52     end
53
54     if ~isreal(x)
55         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 3));
56     end
57
58     if ~isreal(z)
59         error(msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 4));
60     end
61
62     if (size(b, "c") <> 1) & (size(b, "r") <> 1)
63         error(msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 1));
64     end
65
66     if (size(a, "c") <> 1) & (size(a, "r") <> 1)
67         error(msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 2));
68     end
69
70     if (size(x, "c") <> 1) & (size(x, "r") <> 1)
71         error(msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 3));
72     end
73
74     if (size(z, "c") <> 1) & (size(z, "r") <> 1)
75         error(msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 4));
76     end
77
78     // User mixes polynomial and vector notation
79     if type_b == "polynomial" & size(a, "*") <> 1
80         error(msprintf(_("%s: Incompatible input arguments #%d and #%d: a polynomial and 1-by-1 matrix or two polynomials expected.\n"), fname, 1, 2));
81     end
82
83     // User mixes polynomial and vector notation
84     if type_a == "polynomial" & size(b, "*") <> 1
85         error(msprintf(_("%s: Incompatible input arguments #%d and #%d: a polynomial and 1-by-1 matrix or two polynomials expected.\n"), fname, 1, 2));
86     end
87
88     if type_b == "polynomial" | type_a == "polynomial"
89         c = b/a;
90         b = numer(c);
91         a = denom(c);
92         deg_b = degree(b);
93         deg_a = degree(a);
94         deg = max(deg_b, deg_a);
95         b = coeff(b, deg:-1:0);
96         a = coeff(a, deg:-1:0);
97     end
98
99     if rhs == 4 then
100         [y, z] = filter(b, a, x, z);
101     else
102         [y, z] = filter(b, a, x);
103     end
104
105 endfunction