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

📄 channel_estimator.m

📁 OFDM的详细仿真代码
💻 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 + -