speedup filter function
[scilab.git] / scilab / modules / signal_processing / tests / unit_tests / filter.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7 //
8 // <-- unit tests for function filter  -->
9 //
10 // <-- CLI SHELL MODE -->
11 // <-- NO CHECK REF -->
12
13 //==============================================================================
14 // Error handling tests
15 //==============================================================================
16
17 fname = "filter";
18 func_call = "filter(B, A, x)";
19
20 // Type checks
21 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 1);
22 B = "test";
23 A = [0 1];
24 x = [1, zeros(1,99)];
25 assert_checkerror(func_call, err_msg);
26
27 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 2);
28 B = [0 0 1];
29 A = "test";
30 assert_checkerror(func_call, err_msg);
31
32 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 3);
33 B = [0 0 1];
34 A = [1 0 1];
35 x = "test";
36 assert_checkerror(func_call, err_msg);
37
38 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 4);
39 x = [1, zeros(1,99)];
40 z = "test";
41 func_call = "filter(B, A, x, z)";
42 assert_checkerror(func_call, err_msg);
43
44 // Values are real
45 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 1);
46 z = 0;
47 B = %i;
48 assert_checkerror(func_call, err_msg);
49
50 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix or polynomial expected.\n"), fname, 2);
51 A = 2 * %i;
52 B = [0 0 1];
53 assert_checkerror(func_call, err_msg);
54
55 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 3);
56 A = [1 0 1];
57 x = [%i 1 3 4];
58 assert_checkerror(func_call, err_msg);
59
60 x = [1 zeros(1, 99)];
61 z = %i;
62 err_msg = msprintf(_("%s: Wrong type for input argument #%d: Real matrix expected.\n"), fname, 4);
63 assert_checkerror(func_call, err_msg);
64
65 // Check vector values
66 A = [A; A];
67 z = 0;
68 err_msg = msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 2);
69 assert_checkerror(func_call, err_msg);
70
71 A = A(1, :);
72 B = [B; B];
73 err_msg = msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 1);
74 assert_checkerror(func_call, err_msg);
75
76 B = B(1, :);
77 x = [x; x];
78 err_msg = msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 3);
79 assert_checkerror(func_call, err_msg);
80
81 x = x(1, :);
82 z = [1 2; 3 4];
83 err_msg = msprintf(_("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 4);
84 assert_checkerror(func_call, err_msg);
85
86 // User mixes polynomial and vector notation
87 z = 0;
88 B = %s^3 + %s + 1;
89 A = [1 0];
90 err_msg = msprintf(_("%s: Incompatible input arguments #%d and #%d: a polynomial and 1-by-1 matrix or two polynomials expected.\n"), fname, 1, 2);
91 assert_checkerror(func_call, err_msg);
92
93 A = B;
94 B = [1 1];
95 err_msg = msprintf(_("%s: Incompatible input arguments #%d and #%d: a polynomial and 1-by-1 matrix or two polynomials expected.\n"), fname, 1, 2);
96 assert_checkerror(func_call, err_msg);
97
98 // Denominator must have first coefficient not equal to 0
99 A = [0 0 1];
100 err_msg = msprintf(_("%s: Wrong value for input argument #%d: First element must not be %s.\n"), fname, 2, "0");
101 assert_checkerror(func_call, err_msg);
102
103 B = %s^3 + %s + 1;
104 A = %s;
105 err_msg = msprintf(_("%s: Wrong value for input argument #%d: First element must not be %s.\n"), fname, 2, "0");
106 assert_checkerror(func_call, err_msg);
107
108 //==============================================================================
109 // Nominal behaviour
110 //==============================================================================
111
112 // Integrator y(n) = y(n - 1) + x(n)
113 // Filter is 1/(1 - 1 * z**-1)
114 B = 1;
115 A = [1 -1];
116 x = [1 1 1 1 1];
117
118 y = [1 2 3 4 5];
119 res = filter(B, A, x);
120 assert_checkalmostequal(res, y);
121
122 // Same behaviour with a polynomial
123 B = %s;
124 A = %s - 1;
125 res = filter(B, A, x);
126 assert_checkalmostequal(res, y);
127
128 // Integrator with delay y(n) = y(n-1) + x(n-1)
129 // Filter is z**-1 / (1 + z**-1)
130 B = 1;
131 y = [0 1 2 3 4];
132 res = filter(B, A, x);
133 assert_checkalmostequal(res, y);
134
135 B = [0 1];
136 A = [1 -1];
137 res = filter(B, A, x);
138 assert_checkalmostequal(res, y);
139
140 // Derivator y(n) = x(n) - x(n-1)
141 // Filter is 1 - z**-1
142 B = [1 -1];
143 A = 1;
144 x = [1 3 5 3 1];
145 y = [1 2 2 -2 -2];
146 res = filter(B, A, x);
147 assert_checkalmostequal(res, y);
148
149 // Complex filter y(n) = 2 * y(n-1) - 3 * y(n-2) + x(n-2) - 2 * x(n-1) + x(n)
150 // Filter is (1 - 2z**-1 + z**-2) / (1 - 2z**-1 + 3z**-2)
151 B = [1 -2 1];
152 A = [1 -2 3];
153 x = [1 2 -1 1 -1];
154 y = [1 2 -3 -7 -9];
155 res = filter(B, A, x);
156 assert_checkalmostequal(res, y);