summaryrefslogtreecommitdiff
path: root/macros/digitrevorder.sci
blob: 01375421cfb650ad62dd2a7c3f1c8d83741d87f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright (C) 2018 - IIT Bombay - FOSSEE
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
// Original Source : https://octave.sourceforge.io/signal/
// Modifieded by: Abinash Singh Under FOSSEE Internship
// Date of Modification: 3 Feb 2024
// Organization: FOSSEE, IIT Bombay
// Email: toolbox@scilab.in
function [y, i] = digitrevorder (x, r)
  // Returns input data in digit-reversed order
  // Calling Sequence
  //[y,i] = digitrevorder(x,r)
  //y = digitrevorder(x,r)
  // Parameters
  //x: Vector of real or complex values
  //r: radix / base
  //y: input vector in digit reverse order
  //i: indices
  // Description
  //This function returns the input data after reversing the digits of the indices and reordering the elements of the input array.
  // Examples
  //x = [%i,1,3,6*%i] ;
  //r = 2 ;
  //[y i]=digitrevorder(x, r)
  //Output :
  // i  =
  //
  //    1.    3.    2.    4.
  // y  =
  //
  //    i      3.    1.    6.i
  funcprot(0);
  [nargout, nargin] = argn() ;

  if (nargin > 2 | nargin <= 1)
    error("digitrevorder : invalid number of inputs")
  elseif ( ~isvector(x) & ~isscalar(x))
    error ("digitrevorder : X must be a vector");
  elseif (~ (isscalar (r) & r == fix (r) & r >= 2 & r <= 36))
    error ("digitrevorder : R must be an integer between 2 and 36");
  else
    tmp = log (length(x)) / log (r);
    if (fix (tmp) ~= tmp)
      error ("digitrevorder: X must have length equal to an integer power of radix");
    end
  end

  old_ind = 0:max(size(x)) - 1;
  new_ind = base2dec (strrev(dec2base (old_ind, r)), r);
  i = new_ind + 1;
  y(old_ind + 1) = x(i);
  if (size(x,2)== 1)
    y = y(:);
  else
    i = i.';
  end
endfunction

/*
// tests base 0 2 OK
assert_checkequal (digitrevorder (0, 2), 0); // passed
assert_checkequal (digitrevorder (0, 36), 0); //passed
assert_checkequal (digitrevorder (0:3, 4), 0:3); //passed
assert_checkequal (digitrevorder ([0:3]', 4), [0:3]');//passed
assert_checkequal (digitrevorder (0:7, 2), [0 4 2 6 1 5 3 7]);//passed
assert_checkequal (digitrevorder ([0:7]', 2), [0 4 2 6 1 5 3 7]');//passed
assert_checkequal (digitrevorder ([0:7]*%i, 2), [0 4 2 6 1 5 3 7]*%i); //passed
assert_checkequal (digitrevorder ([0:7]'*%i, 2), [0 4 2 6 1 5 3 7]'*%i);//passed
assert_checkequal (digitrevorder (0:15, 2), [0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15]); // passed

//FIXME : debug the failed test
assert_checkequal (digitrevorder (0:15, 4), [0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15]); // failed 

//Test input validation - passed
error digitrevorder ();
error digitrevorder (1);
error digitrevorder (1, 2, 3);
error digitrevorder ([], 1);
error digitrevorder ([], 37);
error digitrevorder (0:3, 8);
*/