% LS_ChannelEstimation 基于梳状导频序列的LS信道估计算法,采用线性内插法、时域插值法进行滤波得到整个信道的响应
% 注意:方便C++移植,故输入输出信号均为串行信号
% 输入信号:
% 信源端导频序列: Logical_TxPilot % 只有一个列向量,需要在函数中进行复制Np次。
% 信宿端导频序列: Logical_RxPilot
% 待均衡数据信号: Logical_PreSignal
% 比特率: n_BitRateIn
% 输出信号:
% 均衡后数据信号: Logical_PostSignal
% 比特率: n_BitRateOut
% 属性参数:
% 数据子载波数目: n_DataSubCarrier
% OFDM符号数: n_SymbolCount
% 导频子载波数: n_Np 导频数保证最后一列也是导频
% 两个导频符号之间的间隔: n_LI
% 插值滤波方案选择: method 1 线性内插法
% 2 时域插值法
function[Logical_PostSignal,n_BitRateOut]= LS_ChannelEstimation(Logical_TxPilot,Logical_RxPilot,Logical_PreSignal,n_BitRateIn,n_DataSubCarrier,n_SymbolCount,n_Np,n_LI,method)
RxPilot = Logical_RxPilot;
TxPilot= repmat(Logical_TxPilot,n_Np,1); % n_Np*n_SymbolCount
TxPilot = reshape(TxPilot,n_Np*n_SymbolCount,1); % (n_Np*n_SymbolCount)*1
% *******************************************************************
% LS算法对Np个导频进行信道估计,由于将Np个导频合成一列向量处理,故直接取LS计算即可,不需要别的操作
% 可以分别用以下两种方法实现LS算法,得到导频处的信道响应
% 方法1 向量处理
H = RxPilot./TxPilot;
Hls_1 = conj(H);
Hls_2= H.^2;
Hls_Np = Hls_1./Hls_2;
% 方法2 矩阵处理
TxPilot_1 = TxPilot.'; % 1*(n_Np*n_SymbolCount)
TxPilot_2 = diag(TxPilot_1); % (n_Np*n_SymbolCount)*(n_Np*n_SymbolCount) 的对角矩阵 对角线上的元素为TxPilot_1上的向量值
TxPilot_3 = inv(TxPilot_2); % 取逆矩阵
Hls_Np= TxPilot_3*RxPilot; % 得到导频处信道频域响应 矩阵的处理等同于R = XH,则X = H^(-1)R;
% *************************************************************************
% 插值处理
Hls1=reshape(Hls_Np,n_Np,n_SymbolCount); % n_Np*n_SymbolCount
switch method
case 1 %使用线性内插法
HLS =[];
HLS1 = [];
if(ceil(n_DataSubCarrier/n_LI)==n_DataSubCarrier/n_LI) % 数据子载波数正好是导频间隔的整数倍,这样所有的处理可以在一个循环中进行
for m = 1:n_Np-1;
HLS2=[];
for l=1:n_LI;
HLS1(1,:)=Hls1(m,:)+(l-1)/n_LI*(Hls1(m+1,:)-Hls1(m,:));
HLS2=[HLS2;HLS1];
end
HLS=[HLS;HLS2];
end
else %不满足此条件时需要把最后两个导频之间的信道频率相应单独处理
for m = 1:n_Np-2;
HLS2=[];
for l=1:n_LI;
HLS1(1,:)=Hls1(m,:)+(l-1)/n_LI*(Hls1(m+1,:)-Hls1(m,:));
HLS2=[HLS2;HLS1];
end
HLS=[HLS;HLS2]; % 每次循环在原来基础上增加一行,共增加在两个导频间隔之内包含的数据子载波的列数
end
HLS3=[];
for l = 1:mod(n_DataSubCarrier,n_LI);
HLS1(1,:) = Hls1(n_Np-1,:)+(l-1)/n_LI*(Hls1(n_Np,:)-Hls1(n_Np-1,:));
HLS3 = [HLS3;HLS1];
end
HLS=[HLS;HLS3];
end
case 2 % 时域插值法
HLS1 = [];
HLS3 =[];
for ii = 1:n_SymbolCount; % 每次处理一个OFDM符号的信道响应
HLS1 = Hls1(:,ii);
HLS2 = ifft(HLS1);
% 时域插值
HLS3(1:(n_Np/2),ii) = HLS2(1:(n_Np/2));
HLS3(n_Np/2+1:n_DataSubCarrier-n_Np/2,ii)=0;
HLS3(n_DataSubCarrier-n_Np/2+1:n_DataSubCarrier,ii) = HLS2(n_Np/2+1:end);
end
HLS = fft(HLS3);
end
% % *****************************************************
% % 相位估计
% RxPilotTemp = reshape(RxPilot,n_Np,n_SymbolCount);
% TxPilotTemp = reshape(TxPilot,n_Np,n_SymbolCount);
% Arg = zeros(1,n_SymbolCount); %估计得到的CPE相位信息
%
% for ii = 1:n_SymbolCount;
% ArgTemp = 0;
% for jj = 1:n_Np;
% ArgTemp = ArgTemp+(angle(RxPilotTemp(jj,ii))-angle(TxPilotTemp(jj,ii)));
% end
% Arg(ii)= 1/n_Np*ArgTemp;
% end
% % ***********************************************************
%
% % 得到整个信道的频率响应
% for ii = 1:n_SymbolCount;
% HLS(:,ii)=HLS(:,ii).*exp(-i*Arg(ii));
% end
% ***********************************************************
HLS = reshape(HLS,length(Logical_PreSignal),1);
% 输出信号赋值
Logical_PostSignal = Logical_PreSignal./HLS;
n_BitRateOut = n_BitRateIn;