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

通讯编程文档

开发平台:

Matlab

  1. function xx = constlay(k, flag)
  2. % CONSTLAY Layout the constellation for square QASK.
  3. %     X = CONSTLAY(K) is an internal utility function.
  4. %   Copyright 1996-2001 The MathWorks, Inc.
  5. %   $Revision: 1.9 $
  6. if nargin < 2
  7.   flag = 0;
  8. end;
  9. a = [1, 0;3, 2];
  10. b = a;
  11. xx = a;
  12. k = k - 2;
  13. while k >= 1
  14.   xx = subconstlay(xx);
  15.   k = k - 2;
  16. end
  17. [leny, lenx] = size(xx);
  18. if k < 0
  19.   xx = xx(1:lenx/2, :);
  20.   [leny, lenx] = size(xx);
  21.   if lenx >= 4
  22.     xx = [xx(:, lenx/2:lenx), xx(:, 1:lenx/2-1)];
  23.   end
  24.   if lenx >= 8
  25.     xx = [xx(lenx/4+2:lenx/2, :); xx(1:lenx/4+1, :)];
  26.     if flag
  27.       appd = NaN*ones(lenx/8, lenx/8);
  28.       xx = [appd xx(:, 1:lenx/8)' appd; ...
  29.             xx(:, lenx/8+1 : lenx - lenx/8);...
  30.             appd xx(:, lenx - lenx/8 + 1 : lenx)' appd];
  31.     else
  32.       % for the simulink use. This is to make up the conner.
  33.       [appd1, appd] = meshgrid(xx(1, lenx/8+1:lenx/4), xx(1, 1:lenx/8)');
  34.       appd1 = tril(appd1) + triu(appd) - diag(diag(appd));
  35.       [appd2, appd] = meshgrid(xx(1, lenx-lenx/4+1:lenx-lenx/8)',...
  36.                                xx(leny, 1:lenx/8));
  37.       appd2 = flipud(appd2);
  38.       appd = flipud(appd);
  39.       appd2 = tril(appd) + triu(appd2) - diag(diag(appd));
  40.       appd2 = flipud(appd2);
  41.       [appd3, appd] = meshgrid(xx(leny, lenx/8+1:lenx/4),...
  42.                                xx(1, lenx-lenx/8+1:lenx)');
  43.       appd3 = fliplr(appd3);
  44.       appd  = fliplr(appd);
  45.       appd3 = tril(appd) + triu(appd3) - diag(diag(appd));
  46.       appd3 = fliplr(appd3);
  47.       [appd4, appd] = meshgrid(xx(leny, lenx-lenx/4+1:lenx-lenx/8)',...
  48.                                xx(leny, lenx-lenx/8+1:lenx));
  49.       appd4 = tril(appd) + triu(appd4) - diag(diag(appd));
  50.       xx = [appd1 xx(:, 1:lenx/8)' appd2; ...
  51.             xx(:, lenx/8+1 : lenx - lenx/8);...
  52.             appd3 xx(:, lenx - lenx/8 + 1 : lenx)' appd4];
  53.     end;
  54.   end
  55. else
  56.   if lenx >= 4
  57.     xx = [xx(:, lenx/2:lenx), xx(:, 1:lenx/2-1)];
  58.     xx = [xx(lenx/2+2:lenx, :); xx(1:lenx/2+1, :)];
  59.   end
  60. end
  61. % verify the correctness To have it turned on, change "if 0" to "if 1"
  62. if 0 & (k >=0)
  63.   for i = 1 : length(xx)-1
  64.     for j= 1 : length(xx)-1
  65.       zz = [sum(de2bi(bitxor(xx(i,j), xx(i, j+1)))); ...
  66.           sum(de2bi(bitxor(xx(i,j), xx(i+1, j))))];
  67.       yy = max(zz);
  68.       if yy > 1
  69.         fprintf('When i = %d and j = %d, the distance is > 1n', i, j);
  70.       end
  71.     end
  72.   end
  73. end
  74. % end of constlay
  75. % The basic building function.
  76. function xx = subconstlay(a)
  77. b = [1, 0;3, 2];
  78. for i = 1 : 2
  79.   for j = 1 : 2
  80.     bb{i,j} = fliplr(de2bi(b(i,j), 2));
  81.     aa{i,j} = a;
  82.   end
  83. end
  84. for i = 1 : 2
  85.   for j = 1 : 2
  86.     if bb{i, j}(1) == 1
  87.       aa{i, j} = flipud(aa{i,j});
  88.     end
  89.     if bb{i,j}(2) == 1
  90.       aa{i, j} = fliplr(aa{i, j});
  91.     end
  92.   end
  93. end
  94. mul = max(max(aa{1,1}))+1;
  95. xx = [aa{1, 1}+b(1,1)*mul, aa{1, 2}+b(1,2)*mul; ...
  96.       aa{2, 1}+b(2,1)*mul, aa{2, 2}+b(2,2)*mul];
  97. %end of subconstlay