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

传真(Fax)编程

开发平台:

Matlab

  1. function [ H_est , MSE ] = estimator_mmse( Recv , Training , Method , N_subc_Remain , H_ideal)
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. % 进行基本的MMSE和MMSE-DFT信道估计
  4. % 计算出均方误差.
  5. % 输入:   Recv, 频域接收到的各个子载波上的复数信号, N_subc(子载波数) 行, N(训练OFDM符号个数)列的复数向量
  6. %         Training , 发送的训练序列 , N_subc 行, N 列的向量 
  7. %                    注意: 训练序列中不能有零, 否则出错.
  8. %         Method, 信道估计的方法 ,正整数,  1--- MMSE估计, 2 ---MMSE-DFT估计的DFT改进
  9. %         N_subc_Remain, LS估计的DFT改进方法,所保留的子载波数. 为正整数值.
  10. %                        建议选取改值等于最大多径时延对应的时域样点数
  11. %         
  12. %
  13. % 输出:   H_est, 估计得到的各个子载波上的频域响应, N_subc 行, 1列的复数向量
  14. %         MSE, 本次估计的均方误差
  15. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  16. N_subc = size(Recv,1);  % 子载波数
  17. H_est = zeros(N_subc ,1);
  18. N = size(Recv,2);
  19. % 接收信号乘上训练序列的共轭, 除以训练序列的模值的平方,得到LS估计的信道响应
  20. H_ls = Recv.*conj(Training)./abs(Training).^2;
  21. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  22. % 如果仅输入两个参数
  23. if nargin == 2   
  24.     H_est = H_ls;   %  LS估计
  25.     MSE = [];
  26.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  27.     % 如果输入五个参数
  28. elseif nargin == 5
  29.     if  Method == 1 
  30.         H_est = H_ls; %  LS估计
  31.     elseif  Method == 2  %  LS估计DFT改进
  32.         % 首先变换到时域
  33.         time_domain = ifft(fftshift(H_ls,1)) * sqrt(N_subc);
  34.         time_cut = zeros(N_subc,N);
  35.         leakage = 0;       % 能量泄漏的子载波数
  36.         % 保留时域能量集中的N_subc_Remain个样点
  37.         time_cut( 1: N_subc_Remain,: ) = time_domain( 1: N_subc_Remain,: );
  38.         % 保留能量泄漏的leakage个样点
  39.         time_cut( N_subc - leakage : N_subc,: ) = time_domain( N_subc - leakage : N_subc,: );
  40.         % 变换到频域
  41.         H_ls_dft = fftshift(fft(time_cut) * 1/sqrt(N_subc),1);
  42.         H_est = H_ls_dft;
  43.     else
  44.         error('子程序estimator输入参数不匹配!');
  45.     end
  46.     % 计算均方误差
  47.     diff = H_ideal - H_est;
  48.     MSE = sum(sum( abs(diff).^2 )) / (N_subc*N) ;
  49. end