All,

I recently had to create a library replacement of qammod.m in the
communications toolbox, because it doesn't allow for non-square (power
of 4) symbol sets and that was desired for my project.  Here is what I
have:

my_qammod.m:

function [y] = my_qammod(x, M, qam_type)
        
    switch(qam_type)
        case 1
            error('qammod type %d is undefined', qam_type);
            exit;

        case 3
            if (nargin < 2)
                usage('y = my_qammod(x,m,type)');
                exit;
            end
            if (M ~= fix(M))
                error('m must be an integer power of 2 > 4');
                exit;
            end
            if (any(x >= M))
                error('values of x must be in range [0,M-1]');
                exit;
            end
            if (~any(x == fix(x)))
                error('values of x must be integer');
                exit;
            end

            c = sqrt(M);
            if (c ~= fix(c)|| log2(c) ~= fix(log2(c)))
                switch(M)
                    case 8
                        a = [ -1,  1, ...
                              -1,  1, ...
                              -1,  1, ...
                              -1,  1];

                        b = [  3,  3, ...
                               1,  1, ...
                              -1, -1, ...
                              -3, -3];

                        c = a + i*b;
                        y = c(x + 1);
                    case 32
                        a = [    -3, -1, 1, 3, ...
                             -5, -3, -1, 1, 3, 5, ...
                             -5, -3, -1, 1, 3, 5, ...
                             -5, -3, -1, 1, 3, 5, ...
                             -5, -3, -1, 1, 3, 5, ...
                                 -3, -1, 1, 3];

                        b = [     5,  5,  5,  5, ...
                              3,  3,  3,  3,  3,  3, ...
                              1,  1,  1,  1,  1,  1, ...
                             -1, -1, -1, -1, -1, -1, ...
                             -3, -3, -3, -3, -3, -3, ...
                                 -5, -5, -5, -5];

                        c = a + i*b;
                        y = c(x + 1);
                    case 128
                        a = [           -7,  -5,  -3,  -1,   1,   3,
5,   7, ...
                                        -7,  -5,  -3,  -1,   1,   3,
5,   7, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                               -11, -9, -7,  -5,  -3,  -1,   1,   3,
5,   7,   9,  11, ...
                                        -7,  -5,  -3,  -1,   1,   3,
5,   7, ...
                                        -7,  -5,  -3,  -1,   1,   3,   5,   7];

                        b = [           11,  11,  11,  11,  11,  11,
11,  11, ...
                                         9,   9,   9,   9,   9,   9,
9,   9, ...
                               7,   7,   7,   7,   7,   7,   7,   7,
7,   7,   7,   7, ...
                               5,   5,   5,   5,   5,   5,   5,   5,
5,   5,   5,   5, ...
                               3,   3,   3,   3,   3,   3,   3,   3,
3,   3,   3,   3, ...
                               1,   1,   1,   1,   1,   1,   1,   1,
1,   1,   1,   1, ...
                              -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-1,  -1,  -1,  -1, ...
                              -3,  -3,  -3,  -3,  -3,  -3,  -3,  -3,
-3,  -3,  -3,  -3, ...
                              -5,  -5,  -5,  -5,  -5,  -5,  -5,  -5,
-5,  -5,  -5,  -5, ...
                              -7,  -7,  -7,  -7,  -7,  -7,  -7,  -7,
-7,  -7,  -7,  -7 ...
                                        -9,  -9,  -9,  -9,  -9,  -9,
-9,  -9, ...
                                       -11, -11, -11, -11, -11, -11, -11, -11];

                        c = a + i*b;
                        y = c(x + 1);
                    otherwise
                        error('qammod for M = %d is undefined', M);
                        exit;

                end
            else
                b = -2.*mod(x,(c)) + c-1;
                a = 2.*floor(x./(c)) - c+1;
                y = a + i.*b;
            end

        otherwise
            error('qammod type %d is undefined', qam_type);
            exit;
    end

end

It's basically a copy of what was already there, except I added
special cases for each non-square, like 8, 32, etc.  I also added a
"type" which for QAM could be type I, II, or III.  Square
constellations are type III and are the most common.  However, type
I's can be useful in fading situations, so I may add that
functionality later.  Basically, type I's are circular constellations,
and they're useful in fading channels if you use a differential coding
scheme.

You can use the qamdemod that already exists in the communications
package, though you may have to change the reference to "qammod" to be
"my_qamdemod" or rename this file and put it in a path that is at a
higher priority than your communications package.

Please let me know what you think.

Thanks,
Kelly

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Octave-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/octave-dev

Reply via email to