move unwrap() => [signal_processing]
[scilab.git] / scilab / modules / signal_processing / tests / unit_tests / unwrap.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2013 - Samuel Gougeon
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7 //
8 // <-- CLI SHELL MODE -->
9
10 // Example #1 (1D wrapped)
11 t = linspace(-4, 4.2, 800);
12 Y = t.^2 + t -1;
13 Yw = atan(tan(Y));  // Raw wrapped recovered Y [pi]
14 Yunw = unwrap(Yw, %pi);
15 assert_checkequal(size(Yunw), size(Y));
16 assert_checkalmostequal(max(Yunw), 8.273629385640850486539, [], 1e-12);
17 assert_checkalmostequal(min(Yunw), -13.816370473381940797708, [], 1e-12);
18
19 // Example #2 (1D wrapped)
20 rand("seed", 0);
21 c = (rand(1, 1)-0.5)*4;
22 Yw = pmodulo(Y, 5) + c;  // unwrap() is unsensitive to a constant and even to a trend
23 [Yunw, K] = unwrap(Yw, 0);
24 assert_checkequal(size(Yunw), size(Y));
25 assert_checkalmostequal(max(Yunw), 9.6852994618564913764658, [], 1e-12);
26 assert_checkalmostequal(min(Yunw), -12.404700397166287473283, [], 1e-12);
27 assert_checkequal(K, [15 98 233 450 585 668 734 791]);
28
29 // Example #3 (1D folded)
30 Yf = 1 + asin(sin(Y));  // Raw folded recovered Y [2.pi], + constant Y shift
31 Yunf = unwrap(Yf, "unfold");
32 assert_checkequal(size(Yunf), size(Y));
33 assert_checkalmostequal(max(Yunf), 9.4279967527199310950436, [], 1e-12);
34 assert_checkalmostequal(min(Yunf), -12.436144421661456505035, [], 1e-12);
35
36 // Example #4 (1D folded)
37 Yf = 1 + Y/10 + acos(cos(Y)); // Raw recovered Y [2.pi], + linear trend
38 [Yunf, K] = unwrap(Yf, "unfold");
39 assert_checkequal(size(Yunf), size(Y));
40 assert_checkalmostequal(max(Yunf), 15.801371238872524926933, [], 1e-12);
41 assert_checkalmostequal(min(Yunf), -6.1759877188984493301405, [], 1e-12);
42 assert_checkequal(K, [24 75 138 233 451 546 609 660 704 743 779]);
43
44 //Unwrapping 2D surfaces:
45 nx = 300;
46 ny = 400;
47 rmax = 8.8;
48 x = linspace(-rmax/2, rmax/2, nx)-1;
49 y = linspace(-rmax/2, rmax/2, ny)+1;
50 [X, Y] = meshgrid(x, y);
51
52 // Example #5 : 2D wrapped
53 Z = X.^2 + Y.^2;        // Parabolo├»d
54 m = 2.8;
55 Zw = pmodulo(Z, m);     // >raps it
56 Zunw  = unwrap(Zw, 0);  // Unwraps it in both directions, with free jumps
57 assert_checkequal(size(Zunw), size(Z));
58 assert_checkalmostequal(max(Zunw), 19.120000000000032969183, [], 1e-12);
59 assert_checkalmostequal(min(Zunw), -39.199790375290433531, [], 1e-12);
60 ZunwR = unwrap(Zw, 0, "r"); // Unwraps it along rows
61 assert_checkequal(size(ZunwR), size(Z));
62 assert_checkalmostequal(max(ZunwR), 2.78738299382542109583, [], 1e-12);
63 assert_checkalmostequal(min(ZunwR), -28.995103166214036605197, [], 1e-12);
64 ZunwC = unwrap(Zw, 0, "c"); // Unwraps it along columns
65 assert_checkequal(size(ZunwC), size(Z));
66 assert_checkalmostequal(max(ZunwC), 20.398076084160148724322, [], 1e-12);
67 assert_checkalmostequal(min(ZunwC), -11.462196183827872530969, [], 1e-12);
68
69 // Example #6 : 2D wrapped
70 Z = sqrt(0.3+sinc(sqrt(Z)*3))*17-7; // Defines the surface
71 m = 2.8;                     // Wrapping step (jump's amplitude)
72 Zw = pmodulo(Z, m);          // Wraps it
73 Zunw  = unwrap(Zw, m);       // Unwraps it in both directions, with given jump
74 assert_checkequal(size(Zunw), size(Z));
75 assert_checkalmostequal(max(Zunw), 12.380638179897072603808, [], 1e-12);
76 assert_checkalmostequal(min(Zunw), -2.109245308884592162713, [], 1e-12);
77 ZunwR = unwrap(Zw, m, "r"); // Unwraps it along rows
78 assert_checkequal(size(ZunwR), size(Z));
79 assert_checkalmostequal(max(ZunwR), 12.380638179897072603808, [], 1e-12);
80 assert_checkalmostequal(min(ZunwR), -2.109245308884592162713, [], 1e-12);
81 ZunwC = unwrap(Zw, m, "c"); // Unwraps it along columns
82 assert_checkequal(size(ZunwC), size(Z));
83 assert_checkalmostequal(max(ZunwC), 12.380638179897072603808, [], 1e-12);
84 assert_checkalmostequal(min(ZunwC), -2.1092453088845903863557, [], 1e-12);