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

📄 lms2dchannelestimationalgorithm.m

📁 程序里面包含各部分算法仿真 可供参考和使用
💻 M
字号:
%----Version1.0: To Zhao for 863 Project.----%
function EstimatedChannelData = LMS2DChannelEstimationAlgorithm(   ...
                                ReceivedChannelData,     ... %接收到的帧数据
                                FrameStruct,             ... %信道帧结构参数
                                DetectionMaximumTapline ... %信道最强径位置
                                )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%本算法命名为2D-LMS,是基于OFDM蜂窝系统的二维自适应信道估计算法。
%特点:算法复杂度稍高,但性能优于目前已有的各种基于OFDM蜂窝系统
%的信道估计算法。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[nSubCarrier, nPilotSymbol] = size(ReceivedChannelData);
nSymbol = FrameStruct.N_ts * FrameStruct.N_sym_ts;

nPilotinSlot = length(FrameStruct.Pos);

if(nPilotinSlot * FrameStruct.N_ts ~= nPilotSymbol)
    errordlg('输入信道数据和帧结构不一致!');
    EstimatedChannelData = [];
    return
end

%根据导频信道进行插值
ReceivedChannelDatabyInterp = zeros(nSubCarrier, nSymbol);
xi = 1:FrameStruct.N_sym_ts;
for index = 1:FrameStruct.N_ts
    yi = interp1(FrameStruct.Pos,transpose(ReceivedChannelData(:,(index-1) * nPilotinSlot + 1:index * nPilotinSlot)),xi,'linear');
    ReceivedChannelDatabyInterp(:,(index-1) * FrameStruct.N_sym_ts + 1:index * FrameStruct.N_sym_ts) ...
       = transpose(yi);
end

%最强径检测或LS-DFT
PatternDD = zeros(nSubCarrier, nSymbol);
if nargin == 3 %最强径检测
        L = length(DetectionMaximumTapline);
        for index = 1:L
            PatternDD(DetectionMaximumTapline(index),:) = 1;
        end
elseif nargin == 2 %LSDFT
        PatternDD(1:nSubCarrier/4,:) = 1;
end
ReceivedChannelDataDD = ifft(ReceivedChannelDatabyInterp);
ReceivedChannelDataDD = ReceivedChannelDataDD .* PatternDD;
ReceivedChannelDataDD = fft(ReceivedChannelDataDD);

% 根据Doppler计算相关OFDM符号个数算法参数设置
% 假设200Hz Doppler时,相关时间取5; 1000Hz Doppler时,相关时间取2。其余按照线性关系取。
correlateTimeLength = round( -3/800 * FrameStruct.fd + 23/4 );
%correlateTimeLength = 6 ;

%算法实现
EstimatedChannelData = zeros(nSubCarrier, nSymbol); %放置信道估计的结果

G = ones(nSubCarrier, nSubCarrier * correlateTimeLength); %初始化算法迭代过程中需要的变量
G = mk_stochastic(G);

p = ReceivedChannelDatabyInterp(:,1:correlateTimeLength);            % 步长参数用插值后的信道响应计算   

p = p(:);

step = 1 / (p' * p);

for index = correlateTimeLength + 1 : nSymbol %算法迭代过程
    
    hEstimate = G * p;
    
    EstimatedChannelData(:,index) = hEstimate;      
    
    e = ReceivedChannelDataDD(:,index) - hEstimate;         % 误差信号用LS-DFT STC 改进的信道估计做参考信道
    
    G = G + step * e * p';
    
    p = ReceivedChannelDatabyInterp(:,index-correlateTimeLength+1:index);    % 步长参数用插值后的信道响应计算         
    p = p(:);
    
    step = 1 / (p' * p);
    
end

% 前面correlateTimeLength + 3个OFDM符号的估计用LS-DFT STC代替
EstimatedChannelData(:,1:correlateTimeLength + 3) = ReceivedChannelDataDD(:,1:correlateTimeLength + 3);

⌨️ 快捷键说明

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