⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modmap.m

📁 数字通信第四版原书的例程
💻 M
字号:
function y = modmap(x, Fd, Fs, method, M, opt2, opt3)
%MODMAP Maps digital signal to analog signal for modulation.
%       Y = MODMAP(X, Fd, Fs, METHOD, OPT1, OPT2, OPT3) maps a sample
%       frequency Fd (Hz) signal vector X in to a sample frequency Fs (Hz)
%       in-phase and quadrature components in Y. Y is a two column matrix.
%       The first column is an in-phase component and second column is a
%       quadrature component. When METHOD = 'ask', Y is a column vector
%       instead of a matrix. This function does mapping only. For digital
%       modulation, use DMOD for passband simulation and DMODCE for baseband
%       simulation.
%
%       METHOD is a string, which can be one of the following:
%       'ask'       M-ary Amplitude shift keying modulation.
%       'psk'       M-ary Phase shift keying modulation.
%       'qask'      M-ary Quadrature amplitude shift-keying modulation.
%       'fsk'       M-ary Frequency shift keying modulation.
%       'msk'       Minimum shift keying modulation.
%       'sample'    Up sample the input signal.
%
%       MODMAP(METHOD, OPT1, OPT2, OPT3) plots the constellation of given 
%       method.
%
%       Use MODMAP(METHOD) to view the help for a specific method.
%
%       See also DEMODMAP, DMOD, DDEMOD, AMOD, ADEMOD, DMODCE, DDEMODCE.

%       Wes Wang 1/9/95, 10/10/95.
%       Copyright (c) 1995-96 by The MathWorks, Inc.
%       $Revision: 1.1 $  $Date: 1996/04/01 18:01:27 $

%position for optional parameters.
opt_pos = 5;
plot_const = 0;
if nargin < 1
    feval('help','modmap')
    return;
elseif isstr(x)
    if exist('method')
        tmp_sto = method;
    end;
    method = lower(deblank(x));
    if findstr(method, 'samp')
        method = 'samp';
    end;
    if nargin == 1
        % help lines for individual modulation method.
        if strcmp(method, '')
            method = 'ask';
        end;
        hand = fopen('modmap.hlp');
        if hand<=0
            error('The Communications Toolbox on your machine is not a completed one.')
        else
            x = fscanf(hand, '%c', Inf);
            index_begin = findstr(x, [method,'_help_begin']);
            index_end = findstr(x, [method,'_help_end']);
            if index_end > index_begin
                x = x(index_begin+13+length(method):index_end-1);
                fprintf('%s', x);
                disp(' ')
                disp('       See also DEMODMAP, AMOD, ADEMOD, MODCE, DEMODCE.')
            else
                disp(['No help for ', method]);
            end;
        end;
        fclose(hand);
        return;
    else
        plot_const = 1;
        opt_pos = opt_pos - 3;
        M = Fd;
        if nargin > opt_pos
            opt2 = Fs;
        end;
        if nargin > opt_pos+1
            opt3 = tmp_sto;
        end;
    end;
else
    len_x = length(x);
    if (Fs == 0) | (Fd == 0) | isempty(Fd) | isempty(Fs)
        FsDFd = 1;
    else
        FsDFd = Fs / Fd;
        if (ceil(FsDFd) ~= FsDFd) | (FsDFd <= 0)
            error('Fs / Fd must be a positive integer.')
        end;
        [r, c] = size(x);
        if r * c == 0
            y = [];
            return;
        end;
        if r == 1
            x = x(:);
            len_x = c;
        else
            len_x = r;
        end;
        yy = [];
        for i = 1 : size(x, 2)
            tmp = x(:, ones(1, FsDFd)*i)';
            yy = [yy tmp(:)];
        end;
        x = yy;
        clear yy tmp
    end;
end;

if ~isstr(x)
    if nargin < 3
        disp('Usage: Y=MODMAP(X, Fd, Fs, METHOD, OPT1, OPT2, OPT3) for modulation mapping');
        return;
    elseif nargin < opt_pos-1
        method = 'sample';
    end;
end

% determine M
if nargin < opt_pos
    % this will happen only 
    M = max(max(x)) + 1;
    M = 2^(ceil(log(M)/log(2)));
    M = max(2, M);
end;
method = lower(method);

if length(method) < 3
    method = [method '   '];
end;

if strcmp(method(1:3), 'ask')
    if plot_const
        plot([0 0], [-1.1 1.1], 'w-', [-1.1, 1.1], [0 0], 'w-', ([0:M-1] - (M - 1) / 2 ) * 2 / (M - 1), zeros(1, M), '*');
        axis([-1.1 1.1 -1.1 1.1])
        xlabel('In-phase component');
        title('ASK constellation')
    else
        y = (x - (M - 1) / 2 ) * 2 / (M - 1);
    end;
elseif findstr(method, 'fsk')
    if nargin < opt_pos + 1
        Tone = 2 * Fd / M;
    else
        Tone = opt2;
    end;
    if plot_const
        x = [0 : M-1] * Tone;
        x = x([1 1 1], :);
        x = x(:)';
        tmp = [0 1 0];
        tmp = tmp(ones(1, M), :)';
        tmp = tmp(:)';
        tmp(2) = 2;
        plot(x, tmp);
        xlabel('Baseband spectrum for FSK (Hz)')
        title('FSK constellation')
    else
        y = x * Tone;
    end;
elseif findstr(method, 'psk')
    if plot_const
        apkconst(M);
    else
        y = modmap(x, Fs, Fs, 'qask/cir', M);
    end;
elseif findstr(method, 'msk')
    %This is a special case of fsk call back to get fsk
    if plot_const
        Fd = M;
        x = [0 0 0 Fd Fd Fd];
        tmp = [0 2 0 0 1  0];
        plot(x, tmp);
        xlabel('Baseband spectrum for FSK')
        title('FSK constellation')
    else
        M = 2;
        Tone = Fd;
        y = x * Tone;
    end;    
elseif ~isempty(findstr(method, 'qask')) |...
         ~isempty(findstr(method, 'qam')) |...
         ~isempty(findstr(method, 'qsk'))
    if findstr(method, '/ar')
        % arbitraryly defined I, Q. 
        if nargin < opt_pos + 1
            error('In correct format for METHOD=''qask/arbitrary''.');
        end;
        I = M;
        Q = opt2;
        M = length(I);
        if plot_const
            axx = max(max(abs(I))) * [-1 1] + [-.1 .1];
            axy = max(max(abs(Q))) * [-1 1] + [-.1 .1];
            plot(I, Q, 'r*', axx, [0 0], 'w-', [0 0], axy, 'w-');
            axis('equal')
            axis('off');
            text(axx(1) + (axx(2) - axx(1))/4, axy(1) - (axy(2) - axy(1))/30, 'QASK Constellation');
            return;
        else
            % leave to the end for processing
        end;
    elseif findstr(method, '/ci')
        % circle defined NIC, AIC, PIC.
        if nargin < opt_pos
            error('In correct format for METHOD=''qask/circle''.');
        end;
        NIC = M;
        M = length(NIC);
        if nargin < opt_pos+1
            AIC = [1 : M];
        else
            AIC = opt2;
        end;
        if nargin < opt_pos + 2
            PIC = NIC * 0;
        else
            PIC = opt3;
        end;
        if plot_const
            apkconst(NIC, AIC, PIC);
            return;
        else
            inx = apkconst(NIC, AIC, PIC);
            I = real(inx);
            Q = imag(inx);
            M = sum(NIC);
        end;
    else
        %consider as square style.
        if plot_const
            qaskenco(M);
            return;
        else
            [I, Q] = qaskenco(M);
        end;
    end;
    y = [];
    x = x + 1;
    if (min(min(x)) < 1)  | (max(max(x)) > M)
        error('Element in input X exceeded range.');
    end;
    for i = 1 : size(x, 2)
        tmp = I(x(:, i));
        y = [y tmp(:)];
        tmp = Q(x(:, i));
        y = [y tmp(:)];
    end; 
elseif findstr(method, 'samp')
    %This is made possible to convert an input signal from sampling frequency Fd
    %to sampling frequency Fs.
    y = x;
else
    %The choice is not a valid one.
    disp('You have used an invalid method. The method should be one of the following string:')
    disp('  ''ask'' Amplitude shift keying modulation;')
    disp('  ''psk'' Phase shift keying modulation;')
    disp('  ''qask'' Quadrature amplitude shift-keying modulation, square constellation;')
    disp('  ''qask/cir'' Quadrature amplitude shift-keying modulation, circle constellation;')
    disp('  ''qask/arb'' Quadrature amplitude shift-keying modulation, user defined constellation;')
    disp('  ''fsk'' Frequency shift keying modulation;')
    disp('  ''msk'' Minimum shift keying modulation;')
    disp('  ''sample'' Convert sample frequency Fd input to sample frequency Fs output.')
end;

%--end of modmap.m

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -