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

📄 channel_estimator.m

📁 信道估计中所使用的关键程序希望对大家有帮助
💻 M
字号:
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 

⌨️ 快捷键说明

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