demod_sym.m
上传用户:look542
上传日期:2009-06-04
资源大小:784k
文件大小:3k
源码类别:

传真(Fax)编程

开发平台:

Matlab

  1. function bit_out = demod_sym(sym,mod_type)
  2. % sym, 行向量
  3. % bit, mod_type行的矩阵,
  4. % 大于0, 硬判决为比特1 ; 小于0 ,硬判决为比特0
  5. bit_out = zeros(mod_type ,size(sym,2));
  6. switch mod_type
  7.     
  8.     % BPSK解调
  9.     case    1 
  10.         bit_out = real(sym) > 0; 
  11.         
  12.     % QPSK解调
  13.     case    2
  14.         % 由QPSK的星座图可以观察到
  15.         bit0 = real(sym) ; 
  16.         bit1 = imag(sym) ;
  17.         
  18.         % 得到2行, 列数为符号数的输出矩阵
  19.         bit_out(1,:) = bit0 > 0;
  20.         bit_out(2,:) = bit1 > 0;
  21.         
  22.     % 8PSK解调  
  23.     case    3
  24.         % 参见8PSK的星座图
  25.         bit0 = -imag( sym * exp(j*pi/8)) ;
  26.         % bit1和bit2解调,都需要进行星座旋转
  27.         bit1 = -real(sym * exp(j*pi/8)) ;
  28.         
  29.         bit2 = [];
  30.         for k = 1:length(sym)
  31.             tmp = sym(k) * exp(-j*pi/8); 
  32.             if ((real(tmp) <0) & (imag(tmp) >0)) | ((real(tmp) >0) & (imag(tmp) <0))
  33.                 bit2 = [bit2 0];
  34.             else
  35.                 bit2 = [bit2 1];
  36.             end   
  37.         end
  38.         
  39.         bit_out(1,:) = bit0 >0;
  40.         bit_out(2,:) = bit1 >0;
  41.         bit_out(3,:) = bit2 ;    % 已经硬判决
  42.             
  43.     % 16QAM解调   
  44.     case    4
  45.         
  46.         bit0 = real(sym);
  47.         bit2 = imag(sym);
  48.         % 以bit1的生成来说明方法:
  49.         % 2/sqrt(10) 为临界值, abs(real(sym))大于此, 则bit1为负,硬判决得到0 ; 反之为正
  50.         bit1 = 2/sqrt(10)-(abs(real(sym)));
  51.         bit3 = 2/sqrt(10)-(abs(imag(sym)));
  52.         bit_out(1,:) = bit0 > 0;
  53.         bit_out(2,:) = bit1 > 0;
  54.         bit_out(3,:) = bit2 > 0;
  55.         bit_out(4,:) = bit3 > 0;
  56.         
  57.     % 64QAM解调         
  58.     case    6       
  59.         bit0 = real(sym);
  60.         bit3 = imag(sym);
  61.         bit1 = 4/sqrt(42)-abs(real(sym));
  62.         bit4 = 4/sqrt(42)-abs(imag(sym));
  63.         for m=1:size(sym,2)
  64.             for k=1:size(sym,1)
  65.                 if abs(4/sqrt(42)-abs(real(sym(k,m)))) <= 2/sqrt(42)  
  66.                     bit2(k,m) = 2/sqrt(42) - abs(4/sqrt(42)-abs(real(sym(k,m))));
  67.                 elseif abs(real(sym(k,m))) <= 2/sqrt(42) 
  68.                     bit2(k,m) = -2/sqrt(42) + abs(real(sym(k,m)));
  69.                 else
  70.                     bit2(k,m) = 6/sqrt(42)-abs(real(sym(k,m)));
  71.                 end;
  72.       
  73.                 if abs(4/sqrt(42)-abs(imag(sym(k,m)))) <= 2/sqrt(42)  
  74.                     bit5(k,m) = 2/sqrt(42) - abs(4/sqrt(42)-abs(imag(sym(k,m))));
  75.                 elseif abs(imag(sym(k,m))) <= 2/sqrt(42) 
  76.                     bit5(k,m) = -2/sqrt(42) + abs(imag(sym(k,m)));
  77.                 else
  78.                     bit5(k,m) = 6/sqrt(42)-abs(imag(sym(k,m)));
  79.                 end;
  80.             end;
  81.         end;
  82.         bit_out(1,:) = bit0 > 0;
  83.         bit_out(2,:) = bit1 > 0;
  84.         bit_out(3,:) = bit2 > 0;
  85.         bit_out(4,:) = bit3 > 0;
  86.         bit_out(5,:) = bit4 > 0;
  87.         bit_out(6,:) = bit5 > 0;
  88.         
  89.     otherwise
  90.         error('调制方式有误! 子程序demod_sym出错'); 
  91. end