www.pudn.com > communication-systems-using-MATLAB-m-files.rar > constlay.m


function xx = constlay(k, flag) 
% CONSTLAY Layout the constellation for square QASK. 
%     X = CONSTLAY(K) is an internal utility function. 
 
%   Copyright 1996-2001 The MathWorks, Inc. 
%   $Revision: 1.9 $ 
 
if nargin < 2 
  flag = 0; 
end; 
a = [1, 0;3, 2]; 
b = a; 
xx = a; 
k = k - 2; 
 
while k >= 1 
  xx = subconstlay(xx); 
  k = k - 2; 
end 
 
[leny, lenx] = size(xx); 
if k < 0 
  xx = xx(1:lenx/2, :); 
  [leny, lenx] = size(xx); 
  if lenx >= 4 
    xx = [xx(:, lenx/2:lenx), xx(:, 1:lenx/2-1)]; 
  end 
  if lenx >= 8 
    xx = [xx(lenx/4+2:lenx/2, :); xx(1:lenx/4+1, :)]; 
    if flag 
      appd = NaN*ones(lenx/8, lenx/8); 
      xx = [appd xx(:, 1:lenx/8)' appd; ... 
            xx(:, lenx/8+1 : lenx - lenx/8);... 
            appd xx(:, lenx - lenx/8 + 1 : lenx)' appd]; 
    else 
      % for the simulink use. This is to make up the conner. 
      [appd1, appd] = meshgrid(xx(1, lenx/8+1:lenx/4), xx(1, 1:lenx/8)'); 
      appd1 = tril(appd1) + triu(appd) - diag(diag(appd)); 
      [appd2, appd] = meshgrid(xx(1, lenx-lenx/4+1:lenx-lenx/8)',... 
                               xx(leny, 1:lenx/8)); 
      appd2 = flipud(appd2); 
      appd = flipud(appd); 
      appd2 = tril(appd) + triu(appd2) - diag(diag(appd)); 
      appd2 = flipud(appd2); 
      [appd3, appd] = meshgrid(xx(leny, lenx/8+1:lenx/4),... 
                               xx(1, lenx-lenx/8+1:lenx)'); 
      appd3 = fliplr(appd3); 
      appd  = fliplr(appd); 
      appd3 = tril(appd) + triu(appd3) - diag(diag(appd)); 
      appd3 = fliplr(appd3); 
      [appd4, appd] = meshgrid(xx(leny, lenx-lenx/4+1:lenx-lenx/8)',... 
                               xx(leny, lenx-lenx/8+1:lenx)); 
      appd4 = tril(appd) + triu(appd4) - diag(diag(appd)); 
      xx = [appd1 xx(:, 1:lenx/8)' appd2; ... 
            xx(:, lenx/8+1 : lenx - lenx/8);... 
            appd3 xx(:, lenx - lenx/8 + 1 : lenx)' appd4]; 
    end; 
  end 
else 
  if lenx >= 4 
    xx = [xx(:, lenx/2:lenx), xx(:, 1:lenx/2-1)]; 
    xx = [xx(lenx/2+2:lenx, :); xx(1:lenx/2+1, :)]; 
  end 
end 
 
% verify the correctness To have it turned on, change "if 0" to "if 1" 
if 0 & (k >=0) 
  for i = 1 : length(xx)-1 
    for j= 1 : length(xx)-1 
      zz = [sum(de2bi(bitxor(xx(i,j), xx(i, j+1)))); ... 
          sum(de2bi(bitxor(xx(i,j), xx(i+1, j))))]; 
      yy = max(zz); 
      if yy > 1 
        fprintf('When i = %d and j = %d, the distance is > 1\n', i, j); 
      end 
    end 
  end 
end 
% end of constlay 
 
% The basic building function. 
function xx = subconstlay(a) 
b = [1, 0;3, 2]; 
for i = 1 : 2 
  for j = 1 : 2 
    bb{i,j} = fliplr(de2bi(b(i,j), 2)); 
    aa{i,j} = a; 
  end 
end 
 
for i = 1 : 2 
  for j = 1 : 2 
    if bb{i, j}(1) == 1 
      aa{i, j} = flipud(aa{i,j}); 
    end 
    if bb{i,j}(2) == 1 
      aa{i, j} = fliplr(aa{i, j}); 
    end 
  end 
end 
 
mul = max(max(aa{1,1}))+1; 
xx = [aa{1, 1}+b(1,1)*mul, aa{1, 2}+b(1,2)*mul; ... 
      aa{2, 1}+b(2,1)*mul, aa{2, 2}+b(2,2)*mul]; 
%end of subconstlay