modmap.m
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:8k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. function y = modmap(x, Fd, Fs, method, M, opt2, opt3)
  2. %MODMAP Map a digital signal to an analog signal.
  3. %
  4. %   Plotting syntaxes:
  5. %   MODMAP(METHOD...) plots the signal constellation associated with
  6. %   the specified mapping method.
  7. %
  8. %   Mapping syntaxes:
  9. %   Y = MODMAP(X, Fd, Fs, METHOD...) maps the digital signal X to
  10. %   an analog signal Y. This syntax only maps; it does not modulate.
  11. %   More help for all syntaxes:
  12. %   ---------------------------
  13. %   For information about METHOD and subsequent parameters, and about
  14. %   using a specific technique, type one of these commands at the MATLAB
  15. %   prompt:
  16. %
  17. %   FOR DETAILS, TYPE     MAPPING/MODULATION TECHNIQUE
  18. %     modmap ask          % M-ary amplitude shift keying 
  19. %     modmap psk          % M-ary phase shift keying 
  20. %     modmap qask         % M-ary quadrature amplitude shift keying
  21. %     modmap fsk          % M-ary frequency shift keying 
  22. %     modmap msk          % Minimum shift keying 
  23. %
  24. %   For digital modulation, use DMOD for passband simulation and
  25. %   DMODCE for baseband simulation.
  26. %
  27. %   See also DEMODMAP, DMOD, DMODCE, AMOD, AMODCE, APKCONST.
  28. %   Copyright 1996-2001 The MathWorks, Inc.
  29. %   $Revision: 1.16 $
  30. opt_pos = 5;        % position of 1st optional parameter
  31. plot_const = 0;
  32. if nargin < 1
  33.     feval('help','modmap')
  34.     return;
  35. elseif isstr(x)
  36.     if exist('method', 'var')
  37.         tmp_sto = method;
  38.     end
  39.     method = lower(deblank(x));
  40.     if findstr(method, 'samp')
  41.         method = 'samp';
  42.     end
  43.     if nargin == 1
  44.         % help lines for individual modulation method.
  45.         if strcmp(method, '')
  46.             method = 'ask';
  47.         end
  48.         hand = fopen('modmap.hlp');
  49.         if hand<=0
  50.             error('The Communications Toolbox on your computer is not completely installed.')
  51.         else
  52.             x = fscanf(hand, '%c', Inf);
  53.             index_begin = findstr(x, [method,'_help_begin']);
  54.             index_end = findstr(x, [method,'_help_end']);
  55.             if index_end > index_begin
  56.                 x = x(index_begin+12+length(method):index_end-1);
  57.                 fprintf('%s', x);
  58.                 disp(' ')
  59.                 disp('    See also DEMODMAP, DMOD, DMODCE, AMOD, AMODCE, APKCONST.')
  60.             else
  61.                 disp(['No help for ', method]);
  62.             end
  63.         end
  64.         fclose(hand);
  65.         return;
  66.     else
  67.         plot_const = 1;
  68.         opt_pos = opt_pos - 3;
  69.         M = Fd;
  70.         if nargin > opt_pos
  71.             opt2 = Fs;
  72.         end
  73.         if nargin > opt_pos+1
  74.             opt3 = tmp_sto;
  75.         end
  76.     end
  77. else
  78.     if nargin < 3
  79.         error('Usage: Y=MODMAP(X, Fd, Fs, METHOD, OPT1, OPT2, OPT3) for modulation mapping');
  80.     elseif nargin < opt_pos-1
  81.         method = 'sample';
  82.     end
  83.     if length(Fs)~=1 | ~isfinite(Fs) | ~isreal(Fs) | Fs<=0
  84.         error('Fs must be a positive number.');
  85.     elseif length(Fd)~=1 | ~isfinite(Fd) | ~isreal(Fd) | Fd<=0
  86.         error('Fd must be a positive number.');
  87.     else
  88.         FsDFd = Fs / Fd;
  89.         if ceil(FsDFd) ~= FsDFd
  90.             error('Fs/Fd must be a positive integer.');
  91.         end
  92.     end
  93.     
  94.     % determine M
  95.     if isempty(findstr(method, '/arb')) & isempty(findstr(method, '/cir'))
  96.         if nargin < opt_pos
  97.             M = max(max(x)) + 1;
  98.             M = 2^(ceil(log(M)/log(2)));
  99.             M = max(2, M);
  100.         elseif length(M) ~= 1 | ~isfinite(M) | ~isreal(M) | M <= 0 | ceil(M) ~= M
  101.             error('Alphabet size M must be a positive integer.');
  102.         end
  103.     end
  104.     
  105.     if isempty(x)
  106.         y = [];
  107.         return;
  108.     end
  109.     [r, c] = size(x);
  110.     if r == 1
  111.         x = x(:);
  112.         len_x = c;
  113.     else
  114.         len_x = r;
  115.     end
  116.     if ~(strncmpi(method, 'qask', 4) | strncmpi(method, 'qam', 3) |...
  117.          strncmpi(method, 'qsk', 3)) & ...
  118.        (~isreal(x) | all(ceil(x)~=x) | any(any(x<0)) | any(any(x>M-1)))
  119.         error('Elements of input X must be integers in [0, M-1].');
  120.     end
  121.     yy = [];
  122.     for i = 1 : size(x, 2)
  123.         tmp = x(:, ones(1, FsDFd)*i)';
  124.         yy = [yy tmp(:)];
  125.     end
  126.     x = yy;
  127.     clear yy tmp;
  128. end
  129. method = lower(method);
  130. if strncmpi(method, 'ask', 3)
  131.     if plot_const
  132.         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), '*');
  133.         axis([-1.1 1.1 -1.1 1.1])
  134.         xlabel('In-phase component');
  135.         title('ASK constellation')
  136.     else
  137.         y = (x - (M - 1) / 2 ) * 2 / (M - 1);
  138.         if r==1 & ~isempty(y)
  139.             y = y.';
  140.         end
  141.     end
  142. elseif strncmpi(method, 'fsk', 3)
  143.     if nargin < opt_pos + 1
  144.         Tone = Fd;
  145.     else
  146.         Tone = opt2;
  147.     end
  148.     if plot_const
  149.         maxTone = Tone*(M-1);
  150.         x = [0 : Tone : maxTone];
  151.         tmp = ones(1, M);
  152.         tmp(1) = 2;
  153.         stem(x, tmp);
  154.         axis([-1, maxTone+1, 0, 2]);
  155.         xlabel('Frequency (Hz)');
  156.         title('FSK constellation');
  157.     else
  158.         y = x * Tone;
  159.         if r==1 & ~isempty(y)
  160.             y = y.';
  161.         end
  162.     end
  163. elseif strncmpi(method, 'psk', 3)
  164.     if plot_const
  165.         apkconst(M);
  166.     else
  167.         y = modmap(x, Fs, Fs, 'qask/cir', M);
  168.     end
  169. elseif strncmpi(method, 'msk', 3)
  170.     % This is a special case of fsk.
  171.     if plot_const
  172.         stem([0 Fd], [2 1]);
  173.         axis([-1, Fd+1, 0, 2]);
  174.         xlabel('Frequency (Hz)');
  175.         title('MSK constellation');
  176.     else
  177.         M = 2;
  178.         Tone = Fd/2;
  179.         y = x * Tone;
  180.         if r==1 & ~isempty(y)
  181.             y = y.';
  182.         end
  183.     end
  184. elseif ( strncmpi(method, 'qask', 4) | strncmpi(method, 'qam', 3) |...
  185.          strncmpi(method, 'qsk', 3) )
  186.     if findstr(method, '/ar')   % arbitrary constellation
  187.         if nargin < opt_pos + 1
  188.             error('Incorrect format for METHOD=''qask/arbitrary''.');
  189.         end
  190.         I = M;
  191.         Q = opt2;
  192.         M = length(I);
  193.         if plot_const
  194.             axx = max(max(abs(I))) * [-1 1] + [-.1 .1];
  195.             axy = max(max(abs(Q))) * [-1 1] + [-.1 .1];
  196.             plot(I, Q, 'r*', axx, [0 0], 'w-', [0 0], axy, 'w-');
  197.             axis('equal');
  198.             axis('off');
  199.             text(axx(1) + (axx(2) - axx(1))/4, axy(1) - (axy(2) - axy(1))/30, 'QASK Constellation');
  200.             return;
  201.         else
  202.             % leave to the end for processing
  203.         end
  204.     elseif findstr(method, '/ci')   % circular constellation
  205.         if nargin < opt_pos
  206.             error('Incorrect format for METHOD=''qask/circle''.');
  207.         end
  208.         NIC = M;
  209.         M = length(NIC);
  210.         if nargin < opt_pos+1
  211.             AIC = [1 : M];
  212.         else
  213.             AIC = opt2;
  214.         end
  215.         if nargin < opt_pos + 2
  216.             PIC = NIC * 0;
  217.         else
  218.             PIC = opt3;
  219.         end
  220.         if plot_const
  221.             apkconst(NIC, AIC, PIC);
  222.             return;
  223.         else
  224.             inx = apkconst(NIC, AIC, PIC);
  225.             I = real(inx);
  226.             Q = imag(inx);
  227.             M = sum(NIC);
  228.         end
  229.     else    % square constellation
  230.         if plot_const
  231.             qaskenco(M);
  232.             return;
  233.         else
  234.             [I, Q] = qaskenco(M);
  235.         end
  236.     end
  237.     y = [];
  238.     x = x + 1;
  239.     if (min(min(x)) < 1)  | (max(max(x)) > M)
  240.         error('An element in input X is outside the permitted range.');
  241.     end
  242.     for i = 1 : size(x, 2)
  243.         tmp = I(x(:, i));
  244.         y = [y tmp(:)];
  245.         tmp = Q(x(:, i));
  246.         y = [y tmp(:)];
  247.     end
  248. elseif strncmpi(method, 'samp', 4)
  249.     %This is made possible to convert an input signal from sampling frequency Fd
  250.     %to sampling frequency Fs.
  251.     y = x;
  252. if r==1 & ~isempty(y)
  253. y = y.';
  254. end
  255. else    % invalid method
  256. error(sprintf(['You have used an invalid method.n',...
  257. 'The method should be one of the following strings:n',...
  258. 't''ask'' Amplitude shift keying modulation;n',...
  259. 't''psk'' Phase shift keying modulation;n',...
  260. 't''qask'' Quadrature amplitude shift-keying modulation, square constellation;n',...
  261. 't''qask/cir'' Quadrature amplitude shift-keying modulation, circle constellation;n',...
  262. 't''qask/arb'' Quadrature amplitude shift-keying modulation, user defined constellation;n',...
  263. 't''fsk'' Frequency shift keying modulation;n',...
  264. 't''msk'' Minimum shift keying modulation.']));
  265. end
  266. % [EOF]