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

通讯编程文档

开发平台:

Matlab

  1. function [x,y]=qaskenco(msg,M)
  2. %QASKENCO Map a message to a QASK square signal constellation.
  3. %   QASKENCO(M) plots a QASK square constellation with M-ary number M.
  4. %   M must be an integer power of 2.
  5. %
  6. %   QASKENCO(MSG, M) plots the location of MSG in constellation with
  7. %   M-ary number M. The elements in MSG must be integers in the range
  8. %   [0, M-1].
  9. %
  10. %   [X, Y] = QASKENCO(M) outputs the in-phase and quadrature components
  11. %   of the QASK square constellation in variables X and Y respectively.
  12. %
  13. %   [X, Y] = QASKENCO(MSG, M) encodes the message signal given in MSG
  14. %   into in-phase and quadrature component variables X and Y.
  15. %
  16. % The output signal constellations are scaled such that the minimum
  17. %   distance between adjacent signal points is 2.
  18. %
  19. %   This function generates a Gray code with K = log2(M) bits, when K
  20. %   is an even integer. When K is an odd integer, this function generates a
  21. %   non-Gray-code near-square constellation.
  22. %
  23. %   See also QASKDECO.
  24. %   Copyright 1996-2001 The MathWorks, Inc.
  25. %   $Revision: 1.15 $
  26. if nargin < 1
  27.     disp('Usage: QASKENCO(M)');
  28. end;
  29. plot_type = [];
  30. if nargin == 1
  31.     M = msg;
  32.     plot_type = 'N';
  33. elseif isstr(M)
  34.     plot_type = M;
  35.     M = msg;
  36. end;
  37. if M < 0
  38.     error('M must be a positive number.');
  39. end;
  40. K = log2(M);
  41. if floor(K) ~= K
  42. error('M must equal an integer power of 2.');
  43. end;
  44. if ~isempty(plot_type)
  45.     msg = 0:M-1;
  46. end;
  47. if any(msg<0) | any(msg>M-1)
  48. error('Input message to QASKENCO must be integers in the range [0, M-1].');
  49. end
  50. msg = msg + 1;
  51. % define a table for the coding.
  52. [tabx, taby] = QASKConstlation(K);
  53. if nargout > 0 % Encode the message
  54.     x = tabx(msg);
  55.     y = taby(msg);
  56. else % Plot the constellation
  57.     if isempty(plot_type)
  58. plot_type = 'N';
  59.     end
  60. lims = max(max([tabx(msg) taby(msg)])) * [-1 1];
  61.     axx =  lims + [-1 1];
  62.     if findstr(lower(plot_type), 'n')
  63.        handle = plot(tabx(msg), taby(msg), 'r.',...
  64.           [max(tabx(msg)) min(tabx(msg))],[0 0], 'k-',...
  65.           [0 0], [max(taby(msg)) min(taby(msg))], 'k-');
  66.         set(handle(1),'Markersize',12);
  67.         set(get(handle(1),'parent'), ...
  68.             'box','off',...
  69.             'defaulttextfontsize', 9,...
  70.             'Ylim',axx,...
  71.             'Xlim',axx );
  72.         for i = 1 : length(msg)
  73.             text(tabx(msg(i)), taby(msg(i)), num2str(msg(i)-1));
  74.         end;
  75.     else
  76.         handle = plot(tabx(msg), taby(msg), plot_type,...
  77.                  axx, [0 0], 'k-', [0 0], axx, 'k-');
  78.     end
  79.     axis('square');
  80.     set(handle(2), 'Xdata', get(get(handle(2), 'parent'), 'Xlim'));
  81.     set(handle(3), 'Ydata', get(get(handle(3), 'parent'), 'Ylim'));
  82. set(gca, 'xtick', lims(1):2:lims(2), 'ytick', lims(1):2:lims(2));
  83. pos = get(gcf, 'position');
  84. pos = [pos(1) pos(2)-(pos(3)-pos(4)) pos(3) pos(3)];
  85. set(gcf,'position',pos);
  86.     xlabel('In-phase'); ylabel('Quadrature'); title('QASK Constellation');
  87. end;
  88. %------------------------------------------------------------------
  89. function [xt, yt] = QASKConstlation(K)
  90. % Output the constellation in-phase and quadrature components.
  91. xx = constlay(K, 1);
  92. [leny, lenx] = size(xx);
  93. [xt, yt]= meshgrid([1-lenx : 2 : lenx-1], [leny-1 : -2 : 1-leny]');
  94. xx = xx(:);
  95. xt = xt(:);
  96. yt = yt(:);
  97. tmp = isnan(xx);
  98. if ~isempty(tmp)
  99.   xx(tmp) = [];
  100.   xt(tmp) = [];
  101.   yt(tmp) = [];
  102. end;
  103. [xx, tmp] = sort(xx);
  104. xt = xt(tmp);
  105. yt = yt(tmp);
  106. % [EOF]