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

📄 channel_estimator.m

📁 程序里面包含各部分算法仿真 可供参考和使用
💻 M
字号:
function [H_data , mse] = channel_estimator( pilot_sym,known_pilot,SISO_CE_Method,MIMO_CE_Method,...
    L_delay,InterpMethod,H_freq,N_Tx_ant,N_Rx_ant,N_subc,N_used,Idx_used,Modulation,var_noise,...
    ch,N_ts,N_sym_ts,N_pilot_sym_ts,N_data_sym_ts,Pos_pilot_sym,Pos_data_sym,N_syn_preamble,...
    frame,Idx_cir,TurnOn ,ChannelEffectTest,SwitchOrthogonalPilot);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 准备实现的信道估计算法

% 一. 单天线信道估计算法,使用导频辅助进行信道估计
% 1 - 基本LS算法; 2 - LS的DFT改进算法; 3 - 加判决反馈的LS-DFT
% 4 - 基本MMSE算法; 5 - MMSE的DFT改进算法; 6 - 加判决反馈的MMSE-DFT
% 7 - SVD分解算法,8 - Robust算法 
% 9 - 自适应滤波器结合单天线信道估计的方法, 10 - EM 方法
% 插值方法: 1 - 线性插值, 2 - 二次插值, 3 - 三次样条插值,  
%            4 - 时域插值, 5 - 低通滤波器插值

% 二. 多天线信道估计方法,使用导频辅助进行信道估计
% 1 - 基本LS算法; 2 - LS的改进算法1; 3 - LS的改进算法2; 4 - LS的改进算法3; 
% 5 - 频域区分子载波的方法,使用 SISO_CE_Method 选择的算法,以及 InterpMethod 选择的插值方法
% 6 - 发送多个OFDM符号,线性组合求得多天线信道响应

% 三. 理想信道估计: 所有导频位置和数据符号位置的信道为已知的。

% 四. 有关信道估计MSE的定义:估计的信道响应和理想响应的差的平方,并平均到每个子载波。
% 文献上给出的MSE,一般定义如下:
% 1) 第1类方法:估计导频位置的信道响应 + 频域和时域插值的方法,MSE定义为信道估计部分的MSE,不包括插值
% 2) 第2类方法:迭代进行估计,如判决反馈,LMS自适应滤波等,MSE定义为全部估计迭代出的信道响应的MSE            
% 在863项目仿真中,MSE应该统一,否则不能比较不同算法总体的性能。
% 定义为:本帧所有导频和数据OFDM符号处,估计的信道响应和理想信道响应的MSE

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% 输出为数据时隙的信道响应
H_data = zeros( N_subc, N_data_sym_ts*N_ts ,N_Tx_ant*N_Rx_ant );

Pos_data = zeros( 1,N_data_sym_ts*N_ts );
Pos_pilot = zeros( 1,N_pilot_sym_ts*N_ts );
for ts = 1:N_ts
    Pos_data(1,(ts-1)*N_data_sym_ts + 1:ts*N_data_sym_ts) = Pos_data_sym + (ts-1)*N_sym_ts;
    Pos_pilot(1,(ts-1)*N_pilot_sym_ts + 1:ts*N_pilot_sym_ts) = Pos_pilot_sym + (ts-1)*N_sym_ts;
end

global h_t;

if ( TurnOn & (ChannelEffectTest ~= 2) )  
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %一. 单天线信道估计
    
    if N_Tx_ant == 1
        
        for n_r = 1:N_Rx_ant
            
            if SISO_CE_Method == (1 | 2)
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                % 1.1 使用LS,LS-DFT, MMSE, SVD分解方法
                
                % 先估计出导频点位置的值 H_pilot
                H_ideal = H_freq(Idx_used,N_syn_preamble + Pos_pilot,n_r);    % 理想的信道响应
                % 进行LS-DFT改进的估计
                H_pilot = estimator_ls( pilot_sym(:,:,n_r) , known_pilot , 2 , L_delay , H_ideal ,Idx_cir);
                
                % 再进行插值,得到整个帧的信道估计 H_frame
                H_frame(:,:,n_r) = ( interp1(Pos_pilot',H_pilot.',[1:N_ts*N_sym_ts]','linear') ).'; 
                
                % 得到数据时隙的信道响应 H_data
                H_data(:,:,n_r) = H_frame(:,Pos_data,n_r);
                
            elseif SISO_CE_Method == 9
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                % 1.2 使用自适应滤波方法,DD,Robust,迭代方法
                
                % LS信道估计值,帧结构参数,最强径检测参数
                ReceivedChannelData = estimator_ls( pilot_sym(:,:,n_r) , known_pilot );
                FrameStruct = struct('N_ts',N_ts,'N_sym_ts',N_sym_ts,'Pos',Pos_pilot_sym,'fd',ch.fd);
                
                % 得到整个帧的频域信道响应
                H_frame(:,:,n_r) = LMS2DChannelEstimationAlgorithm(ReceivedChannelData,...
                    FrameStruct,Idx_cir);   
                H_data(:,:,n_r) = H_frame(:,Pos_data,n_r);
            end
        end
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % 二. 多天线信道估计        
    else
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
        % 2.1 使用联合求解的多天线LS估计方法:
        if MIMO_CE_Method == ( 1 | 2 | 3 | 4)
            
            % 得到导频位置的信道响应  H_pilot
            % 使用多天线的LS估计方法
            K = N_subc;
            K0 = L_delay;
            H_p = zeros(N_subc,N_pilot_sym_ts*N_ts,N_Rx_ant*N_Tx_ant);
            for ts = 1:N_ts
                for p = 1:N_pilot_sym_ts
                    % 接收到的频域导频样点
                    pilot_rx = pilot_sym(:,(ts-1)*N_pilot_sym_ts + p,:);
                    % 发送的频域导频样点
                    pilot_tx = known_pilot(:,(ts-1)*N_pilot_sym_ts + p,:);
                    % 进行多天线LS估计,得到不同发送天线,本时隙,所有导频位置的信道相应
                    H_tmp = estimator_ls_txdiv(K,K0,N_Tx_ant,N_Rx_ant,pilot_rx,pilot_tx,frame,ts,p,var_noise,0,N_pilot_sym_ts);
                    H_pilot(:,(ts-1)*N_pilot_sym_ts + p,:) = H_tmp;
                end
            end
            
            % 再进行插值,得到整个帧的信道估计 H_frame
            for nr = 1:N_Rx_ant
                for nt = 1:N_Tx_ant
                    H_frame(:,:,(nr-1)*N_Tx_ant+nt) = ( interp1(Pos_pilot',H_pilot(:,:,(nr-1)*N_Tx_ant+nt).',...
                        [1:N_ts*N_sym_ts]','linear') ).'; 
                end
            end
            
            % 输出数据OFDM的信道响应 H_data
            H_data = H_frame(:,Pos_data,:);
            
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
            % 2.2 使用频域区分子载波的方法:
        elseif MIMO_CE_Method == 5
            % 对每一条接收天线
            for n_r = 1:N_Rx_ant
                % 有多条发送天线
                for n_t = 1:N_Tx_ant
                    Idx_tx = [n_t:N_Tx_ant:N_used];
                    % 每条发送天线使用不同的子载波组,进行单天线的信道估计
                    pilot_tx = known_pilot(Idx_tx,:,n_t);
                    pilot_rx = pilot_sym(Idx_tx,:,n_r);
                    H_ideal = H_freq(Idx_tx,N_syn_preamble + Pos_pilot,(n_r-1)*N_Tx_ant + n_t);
                    
                    if SISO_CE_Method == 1 
                        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                        H_pilot  = estimator_ls( pilot_rx , pilot_tx , 2 ,L_delay , H_ideal ,Idx_cir );
                        % 频域插值,得到所有子载波位置的信道响应
                        H_interp = interp1( Idx_tx, H_pilot ,[1:N_used] ,'linear','extrap');
                        % 时域插值,得到整个帧所有OFDM符号的信道响应
                        H_frame(:,:,(n_r-1)*N_Tx_ant + n_t) = ...
                            ( interp1(Pos_pilot',H_interp.',[1:N_ts*N_sym_ts]','linear') ).'; 
                        
                    elseif SISO_CE_Method == 9
                        % LS信道估计值,帧结构参数
                        ReceivedChannelData = estimator_ls( pilot_rx , pilot_tx );
                        FrameStruct = struct('N_ts',N_ts,'N_sym_ts',N_sym_ts,'Pos',Pos_pilot_sym,'fd',ch.fd);
                        
                        % 得到整个帧所有OFDM符号的频域信道响应
                        H_tmp = LMS2DChannelEstimationAlgorithm(ReceivedChannelData,...
                           FrameStruct,Idx_cir);   
                        % 频域插值,得到所有子载波的信道响应
                        H_frame(:,:,(n_r-1)*N_Tx_ant + n_t) = interp1( Idx_tx', H_tmp ,[1:N_used]' ,'spline','extrap');
                         
%                         ChannelParameter = struct('SubCarrierNumber',N_subc,'TxAntennaNumber',n_t);
%                         H_frame(:,:,(n_r-1)*N_Tx_ant + n_t) = LMS2D( ReceivedChannelData, ...
%                             FrameStruct, ChannelParameter, Idx_cir );
                    end  
                    
                end
            end
            
            % 得到数据OFDM符号的信道响应
            H_data = H_frame(:,Pos_data,:);
            
            
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
            % 2.3 使用发送多个OFDM符号,线性组合求得多天线信道响应的方法:
        elseif MIMO_CE_Method == 6
            
            [H_data,H_frame]=estimator_linear_comb(pilot_sym,known_pilot,Idx_cir,...
                N_Rx_ant,N_Tx_ant,Pos_pilot,N_ts,N_sym_ts,Pos_data, Pos_pilot_sym,N_subc,N_data_sym_ts,...
                L_delay,SwitchOrthogonalPilot);                       
                
            
        end
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
    % 求信道估计的均方误差
    H_frame_ideal = H_freq(:,1 + N_syn_preamble : N_sym_ts*N_ts + N_syn_preamble ,:);
    diff = H_frame_ideal - H_frame;
    mse = sum(sum(sum( abs( diff ).^2 ) )) / ( N_subc*N_ts*N_sym_ts*N_Tx_ant*N_Rx_ant);
    mse_sym = sum(abs(diff).^2)/(N_subc);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 三. 理想信道估计    
else
    
    % 取出数据OFDM符号对应的理想信道估计
    H_data = zeros( N_subc, N_data_sym_ts*N_ts ,N_Tx_ant*N_Rx_ant );
    H_data = H_freq(:,Pos_data + N_syn_preamble ,:);
    mse = 0;
end

⌨️ 快捷键说明

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