function [channel_est , mse] = channel_estimator( training_sym ,CE_Method ,CE_Method2 ,...
CE_SubcRemain ,H_freq ,known_training, N_Tx_ant, N_Rx_ant,...
N_subc,N_used, Idx_used,Modulation,var_noise,TurnOn )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 实现信道估计算法
% 单天线的信道估计算法:
% 1 - 基本LS算法; 2 - LS的DFT改进算法; 3 - 加判决反馈的LS-DFT
% 4 - 基本MMSE算法; 5 - MMSE的DFT改进算法; 6 - 加判决反馈的MMSE-DFT
% 7 - 使用SVD分解算法; 8 - Robust算法
% 多天线信道估计方法
% 1 - 多天线基本LS算法
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if TurnOn
if N_Tx_ant == 1
% 单天线信道估计
channel_est = zeros(N_subc,1,N_Rx_ant);
Idx_tmp1 = reshape(Idx_used(1:N_used/2),2,N_used/4);
Idx_tmp2 = reshape(Idx_used(N_used/2+1:N_used),2,N_used/4);
Idx_even = [Idx_tmp1(1,:) Idx_tmp2(2,:)]; % 举例: 113,为-400位置的子载波,为偶数位置
Idx_odd = [Idx_tmp1(2,:) Idx_tmp2(1,:)]; % 举例: 114,为-399位置的子载波,为奇数位置
for n_r = 1:N_Rx_ant
% 先对导频位置的信道响应进行LS估计
ch_ls = zeros(N_subc,1);
ch_ls_even = training_sym(Idx_even,1,n_r).*conj(known_training(Idx_even,2))./...
abs(known_training(Idx_even,2)).^2 ;
% 然后再进行插值,得到所有使用的子载波上的信道响应
ch_ls_odd = interp1( Idx_even, ch_ls_even, Idx_odd, 'linear' ); % 线性插值
% 得到整个频率区域上的频域信道响应
ch_ls(Idx_even) = ch_ls_even;
ch_ls(Idx_odd) = ch_ls_odd;
% 理想的信道响应
ideal_ch = H_freq(:,2,n_r);
switch CE_Method
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 基本LS算法
case 1
channel_est(:,1,n_r) = ch_ls;
diff = (ideal_ch - ch_ls);
mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LS的DFT改进算法
case 2
% 变换到时域
time_domain = ifft(fftshift(ch_ls)) * sqrt(N_subc) ;
time_cut = zeros(N_subc,1);
leakage = 20; % 能量泄漏的子载波数
% 取时域能量集中的样点
time_cut( 1: CE_SubcRemain ) = time_domain( 1: CE_SubcRemain );
time_cut( N_subc - leakage : N_subc ) = time_domain( N_subc - leakage : N_subc );
% 变换到频域
ch_ls_dft = fftshift(fft(time_cut) * 1/sqrt(N_subc));
channel_est(:,1,n_r) = ch_ls_dft;
diff = (ideal_ch - ch_ls_dft);
mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 加判决反馈的LS-DFT
case 3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 基本MMSE算法
case 4
R_freq_H = ideal_ch * ideal_ch'; % 乘上共轭转置,得到频域信道协方差矩阵
switch Modulation
case 1
constel_para = 1;
case 2
constel_para = 0.5;
case 3
constel_para = 1/3;
case 4
constel_para = 17/90;
case 6
constel_para = 0.0639;
otherwise
constel_para = 1;
end
% 根据信道频域响应的自相关矩阵,高斯白噪的功率,产生MMSE估计的矩阵W
W = R_freq_H * inv( R_freq_H + var_noise*constel_para*eye(N_subc));
ch_mmse = W*ch_ls;
channel_est(:,1,n_r) = ch_mmse;
diff = (ideal_ch - ch_mmse);
mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MMSE的DFT改进算法
case 5
R_freq_H = ideal_ch * ideal_ch'; % 乘上共轭转置,得到频域信道协方差矩阵
switch Modulation
case 1
constel_para = 1;
case 2
constel_para = 0.5;
case 3
constel_para = 1/3;
case 4
constel_para = 17/90;
case 6
constel_para = 0.0639;
otherwise
constel_para = 1;
end
% 根据信道频域响应的自相关矩阵,高斯白噪的功率,产生MMSE估计的矩阵W
W = R_freq_H * inv( R_freq_H + var_noise*constel_para*eye(N_subc));
% 载入FFT和IFFT矩阵
fft_matrix = zeros(N_subc,N_subc);
for j = 1:N_subc
for k =1:N_subc
fft_matrix(j,k) = exp( complex(0,(-2*pi/N_subc)) * (j-1) *(k-1) )/sqrt(N_subc);
end
end
ifft_matrix = fft_matrix';
Q_tmp = ifft_matrix * W *fft_matrix;
Q = zeros(N_subc,N_subc);
% 保留能量最为集中的前CE_SubcRemain个
Q(1:CE_SubcRemain,1:CE_SubcRemain) = Q_tmp(1:CE_SubcRemain,1:CE_SubcRemain);
% 把LS估计值变换到时域,乘上Q矩阵,再变换到频域
time_domain = ifft(fftshift(ch_ls)) * sqrt(N_subc) ;
time_tmp = Q * time_domain;
ch_mmse_dft = fftshift(fft(time_tmp) * 1/sqrt(N_subc));
channel_est(:,1,n_r) = ch_mmse_dft;
diff = (ideal_ch - ch_mmse_dft);
mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 加判决反馈的MMSE-DFT
case 6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 使用SVD分解算法
case 7
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Robust算法
case 8
otherwise
end
end
mse = abs(sum(mse))/N_Rx_ant;
else
% 多天线信道估计
end
else
channel_est = H_freq(:,2,:); % 假设已知第二个OFDM符号的信道响应
mse = 0;
end