⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ls_channelestimation.m

📁 基于MATLAB的OFDM信道估计算法
💻 M
字号:
% 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;


























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -