* Bugs 16090 16163 fixed: prbs_a(n,nc) infringed nc & slow. Page overhauled
[scilab.git] / scilab / modules / cacsd / macros / prbs_a.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2019 - Samuel GOUGEON
3 //
4 // This file is hereby licensed under the terms of the GNU GPL v2.0,
5 // pursuant to article 5.3.4 of the CeCILL v.2.1.
6 // This file was originally licensed under the terms of the CeCILL v2.1,
7 // and continues to be available under such terms.
8 // For more information, see the COPYING file which you should have received
9 // along with this program.
10
11 function u = prbs_a(n, nc, ic)
12     // n  : number of points
13     // nc : number of state changes
14     // ic : indices of state changes
15
16     fname = "prbs_a"
17
18     // Checking n
19     // ----------
20     if type(n)<>1 | n==[] | ~isreal(n,0) | or(n<>round(n)) then
21         msg = _("%s: Argument #%d: Decimal integer expected.\n")
22         error(msprintf(msg, fname, 1))
23     end
24     n = n(1)
25     if n < 0 then
26         msg = _("%s: Argument #%d: Must be >= %d.\n")
27         error(msprintf(msg, fname, 1, 0))
28     end
29     if n==0 then
30         u = []
31         return
32     end
33     // Default ic and nc
34     // -----------------
35     if ~isdef("ic","l") | ic==[] then
36         u = grand(1,n-1,"unf",0,1);
37         [?, ic] = gsort(u);
38         ic = gsort(ic(1:nc));
39     else
40         if type(ic)<>1 | ic==[] | ~isreal(ic,0) then
41             msg = _("%s: Argument #%d: Decimal integer expected.\n")
42             error(msprintf(msg, fname, 1))
43         end
44         if min(ic) < 1 | max(ic) >= n then
45             msg = _("%s: Argument #%d: Must be in the interval %s.\n")
46             error(msprintf(msg, fname, 3, msprintf("[1, %d[", n)))
47         end
48         nc = length(ic)
49         ic = gsort(ic,"g","i");
50     end
51     // Checking nc
52     // -----------
53     if nc >= n then
54         msg = _("%s: The number of switches can''t be ≥ %d = number of points.\n")
55         error(msprintf(msg, fname, n))
56     end
57     if nc<0 then
58         msg = _("%s: Argument #%d: Must be >= %d.\n")
59         error(msprintf(msg, fname, 2, 0))
60     end
61
62     // PROCESSING
63     // ----------
64     u = zeros(1,n-1)
65     u(ic(1:2:$)) = 1;
66     u(ic(2:2:$)) = -1;
67     u = cumsum(u);
68     if min(u)==0 then
69         u = [1 1-2*u];
70     else
71         u = [1 1+2*u];
72     end
73     u = u*sign(grand(1,1,"unf",-1,1));    // randomize the initial state
74 endfunction