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