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

传真(Fax)编程

开发平台:

Matlab

  1. function   st_decoded = st_decoding( Recv,channel_est ,N_subc,N_data_sym, N_Tx_ant, N_Rx_ant ,ST_Code, ...
  2.     Idx_data,RateSTCoding,Modulation,hard_soft,LST_method,var_noise,ChannelEffectTest)
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. % 空时解码和分集处理
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. st_decoded = zeros(N_subc,N_data_sym*RateSTCoding);
  7. if ChannelEffectTest ~= 2
  8.     
  9.     % 如果没有发送分集(无空时编码)
  10.     if N_Tx_ant == 1
  11.         %H = squeeze(channel_est(:,1,:)); 
  12.         % 1发多收最大比合并,如果是1收则此程序简化为单天线信道特性补偿
  13.         st_decoded = MRC_combine(Recv,channel_est,Idx_data,N_data_sym,N_Rx_ant,N_subc);
  14.         
  15.         % 如果有发送分集
  16.     else
  17.         % 如果使用空时分组码
  18.         if ST_Code == 1
  19.             % 先对每条接收天线进行多发1收解码
  20.             for n_r = 1:N_Rx_ant
  21.                 % 计算本帧的所有数据OFDM符号,需要分为多少组,送入STBC解码器
  22.                 loop_num = N_data_sym * RateSTCoding/N_Tx_ant ;
  23.                 for n = 1:loop_num
  24.                     % 取出一组OFDM符号,为一次性送入空时解码器的符号组
  25.                     R = Recv(:,(n-1)*N_Tx_ant/RateSTCoding + 1:n*N_Tx_ant/RateSTCoding,n_r);
  26.                     % 取出对应的信道估计,对一条接收天线而言,需要发送天线数N_Tx_ant个信道响应
  27.                     H = channel_est(:,(n-1)*N_Tx_ant/RateSTCoding + 1:n*N_Tx_ant/RateSTCoding,...
  28.                         (n_r-1)*N_Tx_ant + 1:n_r*N_Tx_ant);
  29.                     % 把一组OFDM符号和对应的信道响应,送入STBC解码器
  30.                     decoded(:,(n-1)*N_Tx_ant + 1:n*N_Tx_ant,n_r) = stbc_decode(R,H,Idx_data,N_Tx_ant,N_subc);
  31.                 end
  32.                 % 再进行1发多收的合并.因为在stbc_decode中已经补偿了信道,所以此处为等增益合并
  33.                 st_decoded = st_decoded + decoded(:,:,n_r);  
  34.             end
  35.             st_decoded = st_decoded / N_Rx_ant;
  36.             
  37.             % 如果使用分层空时码
  38.         elseif ST_Code == 2
  39.             if Modulation == 2
  40.                 Cons = exp(j*[-3/4*pi 3/4*pi -1/4*pi 1/4*pi])/sqrt(N_Tx_ant); %  QPSK 调制映射关系
  41.             elseif Modulation == 1
  42.                 Cons = [1 -1]/sqrt(N_Tx_ant);  %  BPSK 调制映射关系
  43.             end
  44.             for n = 1:N_data_sym
  45.                 % 取出一个OFDM符号以及其对应的(N_Tx_ant×N_Rx_ant)个信道响应
  46.                 Y = Recv(Idx_data,n,:);
  47.                 H = channel_est(Idx_data,n,:);
  48.                 % 送入BLAST空时解码器
  49.                 st_decoded(Idx_data,(n-1)*N_Tx_ant + 1:n*N_Tx_ant) = BLAST_decode(Y,H,Cons,hard_soft,LST_method,var_noise);
  50.             end
  51.         end
  52.     end   
  53.     
  54.     
  55. elseif ChannelEffectTest == 2
  56.     
  57.     st_decoded = Recv;
  58.     
  59. end