channel_estimator.m
上传用户:gzcxg999
上传日期:2021-07-15
资源大小:190k
文件大小:7k
源码类别:

matlab例程

开发平台:

CHM

  1. function [channel_est , mse] = channel_estimator( training_sym ,CE_Method ,CE_Method2 ,...
  2.     CE_SubcRemain ,H_freq ,known_training, N_Tx_ant, N_Rx_ant,...
  3.     N_subc,N_used, Idx_used,Modulation,var_noise,TurnOn )
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. % 实现信道估计算法
  6. % 单天线的信道估计算法: 
  7. % 1 - 基本LS算法; 2 - LS的DFT改进算法; 3 - 加判决反馈的LS-DFT
  8. % 4 - 基本MMSE算法; 5 - MMSE的DFT改进算法; 6 - 加判决反馈的MMSE-DFT
  9. % 7 - 使用SVD分解算法; 8 - Robust算法
  10. % 多天线信道估计方法
  11. % 1 - 多天线基本LS算法
  12. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  13. if TurnOn
  14.     if N_Tx_ant == 1
  15.         % 单天线信道估计
  16.         channel_est = zeros(N_subc,1,N_Rx_ant);
  17.         Idx_tmp1 = reshape(Idx_used(1:N_used/2),2,N_used/4);
  18.         Idx_tmp2 = reshape(Idx_used(N_used/2+1:N_used),2,N_used/4); 
  19.         Idx_even = [Idx_tmp1(1,:) Idx_tmp2(2,:)];  % 举例: 113,为-400位置的子载波,为偶数位置
  20.         Idx_odd = [Idx_tmp1(2,:) Idx_tmp2(1,:)];   % 举例: 114,为-399位置的子载波,为奇数位置
  21.         
  22.         for n_r = 1:N_Rx_ant
  23.             % 先对导频位置的信道响应进行LS估计
  24.             ch_ls = zeros(N_subc,1);
  25.             
  26.             ch_ls_even = training_sym(Idx_even,1,n_r).*conj(known_training(Idx_even,2))./...
  27.                 abs(known_training(Idx_even,2)).^2 ;
  28.             
  29.             % 然后再进行插值,得到所有使用的子载波上的信道响应
  30.             ch_ls_odd = interp1( Idx_even, ch_ls_even, Idx_odd, 'linear' ); % 线性插值
  31.             
  32.             % 得到整个频率区域上的频域信道响应
  33.             ch_ls(Idx_even) = ch_ls_even;
  34.             ch_ls(Idx_odd) = ch_ls_odd;
  35.             
  36.             % 理想的信道响应
  37.             ideal_ch = H_freq(:,2,n_r);     
  38.             
  39.             switch CE_Method
  40.                                  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  41.                 % 基本LS算法
  42.             case 1          
  43.                 channel_est(:,1,n_r) = ch_ls;
  44.                 
  45.                 diff = (ideal_ch - ch_ls);
  46.                 mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
  47.                 
  48.                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  49.                 % LS的DFT改进算法
  50.             case 2          
  51.                 % 变换到时域
  52.                 time_domain =  ifft(fftshift(ch_ls)) * sqrt(N_subc)  ;
  53.                 time_cut = zeros(N_subc,1);
  54.                 leakage = 20;       % 能量泄漏的子载波数
  55.                 % 取时域能量集中的样点
  56.                 time_cut( 1: CE_SubcRemain ) = time_domain( 1: CE_SubcRemain );
  57.                 time_cut( N_subc - leakage : N_subc ) = time_domain( N_subc - leakage : N_subc );
  58.                 % 变换到频域
  59.                 ch_ls_dft = fftshift(fft(time_cut) * 1/sqrt(N_subc));
  60.                 channel_est(:,1,n_r) = ch_ls_dft;
  61.                 
  62.                 diff = (ideal_ch - ch_ls_dft);
  63.                 mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
  64.                 
  65.                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  66.                 % 加判决反馈的LS-DFT
  67.             case 3          
  68.                 
  69.                 
  70.                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  71.                 % 基本MMSE算法
  72.             case 4          
  73.                 R_freq_H = ideal_ch * ideal_ch';         % 乘上共轭转置,得到频域信道协方差矩阵
  74.                 switch Modulation
  75.                 case 1 
  76.                     constel_para = 1;
  77.                 case 2
  78.                     constel_para = 0.5;
  79.                 case 3
  80.                     constel_para = 1/3;
  81.                 case 4
  82.                     constel_para = 17/90;
  83.                 case 6
  84.                     constel_para = 0.0639;
  85.                 otherwise
  86.                     constel_para = 1;
  87.                 end
  88.                 % 根据信道频域响应的自相关矩阵,高斯白噪的功率,产生MMSE估计的矩阵W
  89.                 W = R_freq_H * inv( R_freq_H + var_noise*constel_para*eye(N_subc));
  90.                 ch_mmse = W*ch_ls;
  91.                 channel_est(:,1,n_r) = ch_mmse;
  92.                 
  93.                 diff = (ideal_ch - ch_mmse);
  94.                 mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
  95.                 
  96.                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  97.                 % MMSE的DFT改进算法
  98.             case 5
  99.                 
  100.                 R_freq_H = ideal_ch * ideal_ch';         % 乘上共轭转置,得到频域信道协方差矩阵
  101.                 switch Modulation
  102.                 case 1 
  103.                     constel_para = 1;
  104.                 case 2
  105.                     constel_para = 0.5;
  106.                 case 3
  107.                     constel_para = 1/3;
  108.                 case 4
  109.                     constel_para = 17/90;
  110.                 case 6
  111.                     constel_para = 0.0639;
  112.                 otherwise
  113.                     constel_para = 1;
  114.                 end
  115.                 % 根据信道频域响应的自相关矩阵,高斯白噪的功率,产生MMSE估计的矩阵W
  116.                 W = R_freq_H * inv( R_freq_H + var_noise*constel_para*eye(N_subc));
  117.                 
  118.                 
  119.                 % 载入FFT和IFFT矩阵
  120.                 fft_matrix = zeros(N_subc,N_subc);
  121.                 for j = 1:N_subc
  122.                     for k =1:N_subc
  123.                         fft_matrix(j,k) = exp( complex(0,(-2*pi/N_subc)) * (j-1) *(k-1) )/sqrt(N_subc);
  124.                     end
  125.                 end
  126.                 ifft_matrix = fft_matrix';
  127.                 
  128.                 Q_tmp = ifft_matrix * W *fft_matrix;
  129.                 Q = zeros(N_subc,N_subc);
  130.                 
  131.                 % 保留能量最为集中的前CE_SubcRemain个
  132.                 Q(1:CE_SubcRemain,1:CE_SubcRemain) = Q_tmp(1:CE_SubcRemain,1:CE_SubcRemain);
  133.                 
  134.                 % 把LS估计值变换到时域,乘上Q矩阵,再变换到频域
  135.                 time_domain =  ifft(fftshift(ch_ls)) * sqrt(N_subc)  ;
  136.                 time_tmp = Q * time_domain;
  137.                 ch_mmse_dft = fftshift(fft(time_tmp) * 1/sqrt(N_subc));
  138.                 
  139.                 channel_est(:,1,n_r) = ch_mmse_dft;
  140.                 
  141.                 diff = (ideal_ch - ch_mmse_dft);
  142.                 mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
  143.                 
  144.                 
  145.                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  146.                 % 加判决反馈的MMSE-DFT
  147.             case 6
  148.                 
  149.                 
  150.                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  151.                 % 使用SVD分解算法
  152.             case 7
  153.                 
  154.                 
  155.                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  156.                 % Robust算法
  157.             case 8
  158.                 
  159.                 
  160.             otherwise
  161.                 
  162.             end
  163.             
  164.         end
  165.         
  166.         mse = abs(sum(mse))/N_Rx_ant;
  167.         
  168.     else
  169.         % 多天线信道估计
  170.         
  171.         
  172.     end
  173.     
  174.     
  175.     
  176. else
  177.     channel_est = H_freq(:,2,:);             % 假设已知第二个OFDM符号的信道响应
  178.     mse = 0;
  179. end