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

传真(Fax)编程

开发平台:

Matlab

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