summaryrefslogtreecommitdiff
path: root/macros/uencode.sci
blob: 4814998eed3551061580098c732664d3de9e6e4a (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
85
function y=uencode(u,n,v,signflag)
    //Performs uniform quantization of the input into 2^n levels
    //Calling Sequence
    //y=uencode(u,n,v,'signflag')
    //Parameters
    //u
    //A vector, matrix or n-dimensional array
    //n
    //An integer between 2 and 32
    //v
    //A positive real scalar 
    //'signflag'
    //A string which can take only 2 values 'signed' or 'unsigned'
    //Description
    //Uniformly quantizes the input vector or n-dimensional array u into 2^n levels in the interval [-v,v]
    //If v is not specified, its default value is 1
    //'signflag' is a string that determines the nature of the quantization
    //If signflag='unsigned' then y contains unsigned integers in the range [0,2^n-1] corresponding to the 2^n levels
    //If signflag='unsigned' then y contains signed integers in the range [-2^(n-1),2^(n-1)-1] corresponding to the 2^n levels
    //The  size of the integers in y in bits(8,16, or 32) depends on the value of n
    //If the input lies beyond +/- v it is saturated
    //Example
    //y=uencode(-1:0.5:1,3)
    // y  =
    // 
    //  0  2  4  6  7 
    //Author
    //Ankur Mallick
    //References
    //[1] International Telecommunication Union. General Aspects of Digital Transmission Systems: Vocabulary of Digital Transmission and Multiplexing, and Pulse Code Modulation (PCM) Terms. ITU-T Recommendation G.701. March, 1993.
    //See also
    //udecode
    //floor
    funcprot(0);
    if(argn(2)<4)
        signflag='unsigned';
        if(argn(2)<3)
            v=1;
        end
    end
    if(argn(2)>4|argn(2)<2)
        error('Incorrect number of input arguments.');
    elseif(signflag~='signed'&signflag~='unsigned')
        error('Sign flag must be signed or unsigned');
    elseif(~isscalar(v)|abs(v)~=v)
        error('Peak value must be a positive real scalar');
    elseif(~isscalar(n)|round(n)~=n|n<2|n>32)
        error('n must be an integer between 2 and 32')
    else
        if(or(imag(u(:))~=0))
            //Complex Number
            u_real=real(u);
            y_real=uencode(u_real,n,v,signflag);
            disp(type(y_real));
            u_imag=imag(u);
            y_imag=uencode(u_imag,n,v,signflag);
            y=double(y_real)+%i*double(y_imag);
           else
            //Real Numbers
            y=zeros(u);
            L=2*v/(2^n);
            y=floor((u+v)/L);
            y(y<0)=0;
            y(y>(2^n-1))=2^n-1;
            if(signflag=='signed')
                y=y-2^(n-1);
                if(n>=2&n<=8)
                    y=int8(y);
                elseif(n>=9&n<=16)
                    y=int16(y);
                else
                    y=int32(y);
                end
            else
                if(n>=2&n<=8)
                    y=uint8(y);
                elseif(n>=9&n<=16)
                    y=uint16(y);
                else
                    y=uint32(y);
                end
            end
        end
    end
endfunction