MATLAB に基づく MIMO チャネル推定 (完全なコードと分析を含む)

目次

1. はじめに

2. MATLAB コード

3. 実行結果と分析

3.1 平均二乗誤差 (MSE) とトレーニングパワー (dB) の関係

3.2 さまざまなチャネル推定方法の性能比較


1. はじめに

この記事では、MATLAB シミュレーション環境におけるいくつかの一般的な MIMO チャネル推定法のパフォーマンスを比較します。

MIMO の概要については、次のブログを参照してください。

MIMOシステムのモデル構築 ブログ-CSDN ブログ

すべての無線通信では、信号がチャネルを通過する際に歪みが発生したり、さまざまなノイズが信号に追加されたりします。受信信号を正しくデコードするには、チャネルによって生じた歪みとノイズを除去する必要があります。チャネルの特性を理解するにはチャネル推定が必要です。

チャネル推定にはさまざまなアプローチがありますが、一般的なフローは次のように要約できます。

  1. 数学的モデルを設定し、チャネル行列を使用して、送信信号と受信信号の間の関係を構築します。
  2. 既知の信号 (基準信号またはパイロット信号と呼ばれることが多い) を送信し、受信した信号を検出します。
  3. チャネル行列の各要素は、送信信号と受信信号を比較することによって決定されます。

2. MATLAB コード

3 つの機能コードと 1 つのメイン実行コードを含む、合計 4 つのコードがあります。

メインの実行コードは、最終イメージの生成に使用されます。

(1) main.m ファイルのコード

%由于信道数据随机产生,每次运行出的图像可能有略微差异

%初始化
close all;
clear all;


%%设定仿真参数

rng('shuffle'); %产生随机化种子,也可以使用另一函数randn('state',sum(100*clock));


%设定蒙特卡洛仿真的数目
nbrOfMonteCarloRealizations = 1000;

nbrOfCouplingMatrices = 50; %相关矩阵数目

Nt = 8; %发射天线的数量,训练序列的长度
Nr = 4; %接收天线的数量

%训练的总功率
totalTrainingPower_dB = 0:1:20; %单位为dB
totalTrainingPower = 10.^(totalTrainingPower_dB/10); %转为线性范围

%最优化算法
option = optimset('Display','off','TolFun',1e-7,'TolCon',1e-7,'Algorithm','interior-point');


%比较不同的信道估计算法 
%使用蒙特卡洛仿真法
average_MSE_MMSE_estimator_optimal = zeros(length(totalTrainingPower),nbrOfCouplingMatrices,2); %最优训练下的MMSE估计法
average_MSE_MMSE_estimator_heuristic = zeros(length(totalTrainingPower),nbrOfCouplingMatrices,2); %启发训练下的MMSE估计法
average_MSE_MVU_estimator = zeros(length(totalTrainingPower),nbrOfCouplingMatrices,2); %最优训练下的MVU估计法
average_MSE_onesided_estimator = zeros(length(totalTrainingPower),nbrOfCouplingMatrices,2); %单边线性估计法 
average_MSE_twosided_estimator = zeros(length(totalTrainingPower),nbrOfCouplingMatrices,2); %双边线性估计法


%随机信道统计量下的迭代
for statisticsIndex = 1:nbrOfCouplingMatrices
    
    %产生Weichselberger模型下的耦合矩阵V
    %元素均来自卡方分布(自由度为2)
    V = abs(randn(Nr,Nt)+1i*randn(Nr,Nt)).^2;
    V = Nt*Nr*V/sum(V(:)); %将矩阵Frobenius范数设为 Nt x Nr.
    
    %计算耦合矩阵的协方差矩阵
    R = diag(V(:));
    
    R_T = diag(sum(V,1)); %在Weichselberger模型下,计算发射端的协方差矩阵
    R_R = diag(sum(V,2)); %在Weichselberger模型下,计算接收端的协方差矩阵
    
    
    %使用MATLAB内置自带的优化算法,计算MMSE估计法下最优的训练功率分配
    trainingpower_MMSE_optimal = zeros(Nt,length(totalTrainingPower)); %每个训练序列的功率分配向量
    
    for k = 1:length(totalTrainingPower) %遍历每个训练序列的功率分配
        trainingpower_initial = totalTrainingPower(k)*ones(Nt,1)/Nt; %初始设定功率均相等
        
        %使用fmincon函数来最优化功率分配
        %最小化MSE,所有功率均非负
        trainingpower_MMSE_optimal(:,k) = fmincon(@(q) functionMSEmatrix(R,q,Nr),trainingpower_initial,ones(1,Nt),totalTrainingPower(k),[],[],zeros(Nt,1),totalTrainingPower(k)*ones(Nt,1),[],option);
    end
    
    
    %计算功率分配
    [eigenvalues_sorted,permutationorder] = sort(diag(R_T),'descend'); %计算和整理特征值
    [~,inversePermutation] = sort(permutationorder); %记录特征值的order
    
    q_MMSE_heuristic = zeros(Nt,length(totalTrainingPower));
    for k = 1:length(totalTrainingPower) %遍历每个训练功率
        alpha_candidates = (totalTrainingPower(k)+cumsum(1./eigenvalues_sorted(1:Nt,1)))./(1:Nt)'; %计算拉格朗日乘子的不同值
        optimalIndex = find(alpha_candidates-1./eigenvalues_sorted(1:Nt,1)>0 & alpha_candidates-[1./eigenvalues_sorted(2:end,1); Inf]<0); %找到拉格朗日乘子的α
        q_MMSE_heuristic(:,k) = max([alpha_candidates(optimalIndex)-1./eigenvalues_sorted(1:Nt,1) zeros(Nt,1)],[],2); %使用最优的α计算功率分配
    end
    
    q_MMSE_heuristic = q_MMSE_heuristic(inversePermutation,:); %通过重新整理特征值来确定最终的功率分配
    
    
    %计算均匀功率分配
    q_uniform = (ones(Nt,1)/Nt)*totalTrainingPower;
    
    
    %蒙特卡洛仿真初始化
    vecH_realizations = sqrtm(R)*( randn(Nt*Nr,nbrOfMonteCarloRealizations)+1i*randn(Nt*Nr,nbrOfMonteCarloRealizations) ) / sqrt(2); %以向量的形式产生信道 
    vecN_realizations = ( randn(Nt*Nr,nbrOfMonteCarloRealizations)+1i*randn(Nt*Nr,nbrOfMonteCarloRealizations) ) / sqrt(2); %以向量的形式产生噪声
    
    
    %对于每种估计方法计算MSE和训练功率
    for k = 1:length(totalTrainingPower)
        
        %MMSE估计法:最优训练功率分配
        P_tilde = kron(diag(sqrt(trainingpower_MMSE_optimal(:,k))),eye(Nr)); %计算有效功率矩阵
        
        average_MSE_MMSE_estimator_optimal(k,statisticsIndex,1) = trace(R - (R*P_tilde'/(P_tilde*R*P_tilde' + eye(length(R))))*P_tilde*R); %计算MSE
        
        H_hat = (R*P_tilde'/(P_tilde*R*P_tilde'+eye(length(R)))) * (P_tilde*vecH_realizations+vecN_realizations); %使用蒙特卡洛仿真来计算该估计
        average_MSE_MMSE_estimator_optimal(k,statisticsIndex,2) = mean( sum(abs(vecH_realizations - H_hat).^2,1) ); %使用蒙特卡洛仿真来计算MSE
        
        
        %MMSE估计法:启发式训练功率分配MMSE 
        P_tilde = kron(diag(sqrt(q_MMSE_heuristic(:,k))),eye(Nr));  %计算有效训练矩阵
        
        average_MSE_MMSE_estimator_heuristic(k,statisticsIndex,1) = trace(R - (R*P_tilde'/(P_tilde*R*P_tilde' + eye(length(R))))*P_tilde*R); %计算MSE
        
        H_hat = (R*P_tilde'/(P_tilde*R*P_tilde'+eye(length(R)))) * (P_tilde*vecH_realizations + vecN_realizations); %使用蒙特卡洛仿真来计算该估计
        average_MSE_MMSE_estimator_heuristic(k,statisticsIndex,2) = mean( sum(abs(vecH_realizations - H_hat).^2,1) ); %使用蒙特卡洛仿真来计算MSE
        
        
        %MVY估计法: 最优均匀训练功率分配
        P_training = diag(sqrt(q_uniform(:,k))); %均匀功率分配
        P_tilde = kron(transpose(P_training),eye(Nr));  %计算有效训练矩阵
        P_tilde_pseudoInverse = kron((P_training'/(P_training*P_training'))',eye(Nr)); %计算有效训练矩阵的伪逆
        
        average_MSE_MVU_estimator(k,statisticsIndex,1) = Nt^2*Nr/totalTrainingPower(k); %计算MSE
        
        H_hat = P_tilde_pseudoInverse'*(P_tilde*vecH_realizations + vecN_realizations); %使用蒙特卡洛仿真来计算该估计
        average_MSE_MVU_estimator(k,statisticsIndex,2) = mean( sum(abs(vecH_realizations - H_hat).^2,1) ); %使用蒙特卡洛仿真来计算MSE
        
        
        %One-sided linear 估计法: 最优训练功率分配又被称为 "LMMSE 估计法" 
       
        
        P_training = diag(sqrt(q_MMSE_heuristic(:,k))); %使用最优功率分配来计算训练矩阵 
        P_tilde = kron(P_training,eye(Nr)); %计算有效训练矩阵
        
        average_MSE_onesided_estimator(k,statisticsIndex,1) = trace(inv(inv(R_T)+P_training*P_training'/Nr)); %计算MSE
        
        Ao = (P_training'*R_T*P_training + Nr*eye(Nt))\P_training'*R_T; %计算one-sided linear估计法中的矩阵A0 
        H_hat = kron(transpose(Ao),eye(Nr))*(P_tilde*vecH_realizations + vecN_realizations); %使用蒙特卡洛仿真来计算该估计
        average_MSE_onesided_estimator(k,statisticsIndex,2) = mean( sum(abs(vecH_realizations - H_hat).^2,1) );  %使用蒙特卡洛仿真来计算MS
        
        
        %Two-sided linear 估计法: 最优训练功率分配
        
        P_training = diag(sqrt(q_uniform(:,k))); %计算训练矩阵,均匀功率分配
        P_tilde = kron(P_training,eye(Nr)); %计算有效训练矩阵
        R_calE = sum(1./q_uniform(:,k))*eye(Nr); %计算协方差矩阵
        
        average_MSE_twosided_estimator(k,statisticsIndex,1) = trace(R_R-(R_R/(R_R+R_calE))*R_R); %计算MSE
        
        C1 = inv(P_training); %计算矩阵C1
        C2bar = R_R/(R_R+R_calE); %计算C2bar矩阵
        H_hat = kron(transpose(C1),C2bar)*(P_tilde*vecH_realizations + vecN_realizations);
        average_MSE_twosided_estimator(k,statisticsIndex,2) = mean( sum(abs(vecH_realizations - H_hat).^2,1) ); %使用蒙特卡洛仿真来计算MS
        
    end
    
end


%挑选训练功率的子集
subset = linspace(1,length(totalTrainingPower_dB),5);

normalizationFactor = Nt*Nr; %设定MSE标准化因子为trace(R), 标准化MSE为从0到1.


%使用理论MSE公式画图
figure(1); hold on; box on;

plot(totalTrainingPower_dB,mean(average_MSE_MVU_estimator(:,:,1),2)/normalizationFactor,'b:','LineWidth',2);

plot(totalTrainingPower_dB,mean(average_MSE_twosided_estimator(:,:,1),2)/normalizationFactor,'k-.','LineWidth',1);
plot(totalTrainingPower_dB,mean(average_MSE_onesided_estimator(:,:,1),2)/normalizationFactor,'r-','LineWidth',1);

plot(totalTrainingPower_dB(subset(1)),mean(average_MSE_MMSE_estimator_heuristic(subset(1),:,1),2)/normalizationFactor,'b+-.','LineWidth',1);
plot(totalTrainingPower_dB(subset(1)),mean(average_MSE_MMSE_estimator_optimal(subset(1),:,1),2)/normalizationFactor,'ko-','LineWidth',1);

legend('MVU, optimal','Two-sided linear, optimal','One-sided linear, optimal','MMSE, heuristic','MMSE, optimal','Location','SouthWest')

plot(totalTrainingPower_dB,mean(average_MSE_MMSE_estimator_heuristic(:,:,1),2)/normalizationFactor,'b-.','LineWidth',1);
plot(totalTrainingPower_dB,mean(average_MSE_MMSE_estimator_optimal(:,:,1),2)/normalizationFactor,'k-','LineWidth',1);
plot(totalTrainingPower_dB(subset),mean(average_MSE_MMSE_estimator_heuristic(subset,:,1),2)/normalizationFactor,'b+','LineWidth',1);
plot(totalTrainingPower_dB(subset),mean(average_MSE_MMSE_estimator_optimal(subset,:,1),2)/normalizationFactor,'ko','LineWidth',1);


set(gca,'YScale','Log'); %纵轴为log范围
xlabel('Total Training Power (dB)');
ylabel('Average Normalized MSE');
axis([0 totalTrainingPower_dB(end) 0.05 1]);

title('Results based on theoretical formulas');


%使用蒙特卡洛仿真画理论运算图
figure(2); hold on; box on;

plot(totalTrainingPower_dB,mean(average_MSE_MVU_estimator(:,:,2),2)/normalizationFactor,'b:','LineWidth',2);
plot(totalTrainingPower_dB,mean(average_MSE_twosided_estimator(:,:,2),2)/normalizationFactor,'k-.','LineWidth',1);
plot(totalTrainingPower_dB,mean(average_MSE_onesided_estimator(:,:,2),2)/normalizationFactor,'r-','LineWidth',1);
plot(totalTrainingPower_dB(subset(1)),mean(average_MSE_MMSE_estimator_heuristic(subset(1),:,2),2)/normalizationFactor,'b+-.','LineWidth',1);
plot(totalTrainingPower_dB(subset(1)),mean(average_MSE_MMSE_estimator_optimal(subset(1),:,2),2)/normalizationFactor,'ko-','LineWidth',1);

legend('MVU, optimal','Two-sided linear, optimal','One-sided linear, optimal','MMSE, heuristic','MMSE, optimal','Location','SouthWest')

plot(totalTrainingPower_dB,mean(average_MSE_MMSE_estimator_heuristic(:,:,2),2)/normalizationFactor,'b-.','LineWidth',1);
plot(totalTrainingPower_dB,mean(average_MSE_MMSE_estimator_optimal(:,:,2),2)/normalizationFactor,'k-','LineWidth',1);
plot(totalTrainingPower_dB(subset),mean(average_MSE_MMSE_estimator_heuristic(subset,:,2),2)/normalizationFactor,'b+','LineWidth',1);
plot(totalTrainingPower_dB(subset),mean(average_MSE_MMSE_estimator_optimal(subset,:,2),2)/normalizationFactor,'ko','LineWidth',1);


set(gca,'YScale','Log'); %纵轴为log范围
xlabel('Total Training Power (dB)');
ylabel('Average Normalized MSE');
axis([0 totalTrainingPower_dB(end) 0.05 1]);

title('Results based on Monte-Carlo simulations');

コードの特定の各行の説明が含まれています

(2) 3つの関数ファイル

function [deviation,powerAllocation]=functionLagrangeMultiplier(eigenvaluesTransmitter,totalPower,k,alpha)
%Compute the MSE for estimation of the squared Frobenius norm of the
%channel matrix for a given training power allocation. 
%INPUT:
%eigenvaluesTransmitter = Vector with the active eigenvalues at the
%                         transmitter side
%totalPower             = Total power of the training sequence
%k                      = Vector with k parameter values 
%alpha                  = Langrange multiplier value
%
%OUTPUT:
%deviation              = Difference between available power and used power
%powerAllocation        = Training power allocation 
%Compute power allocation 
powerAllocation = sqrt(8*(1./alpha(:))*eigenvaluesTransmitter'/3).*cos(repmat((-1).^k*pi/3,[length(alpha) 1])-atan(sqrt(8*(1./alpha(:))*(eigenvaluesTransmitter.^3)'/27-1))/3)-repmat(1./eigenvaluesTransmitter',[length(alpha) 1]);

%Deviation between total available power and the power that is used
deviation = abs(totalPower-sum(powerAllocation,2));
function MSE = functionMSEmatrix(R_diag,q_powerallocation,B)
%Compute the MSE for estimation of the channel matrix for a given training
%power allocation. 
%INPUT:
%R_diag            = Nt Nr x Nt Nr diagonal covariance matrix
%q_powerallocation = Nt x 1 vector with training power allocation
%B                 = Length of the training sequence.
%
%OUTPUT:
%MSE               = Mean Squared Error for estimation of the channel matrix

P_tilde = kron(diag(sqrt(q_powerallocation)),eye(B));

MSE = trace(R_diag - R_diag*(P_tilde'/(P_tilde*R_diag*P_tilde'+eye(length(R_diag))))*P_tilde*R_diag);
function MSE = functionMSEnorm(eigenvaluesTransmitter,eigenvaluesReceiver,powerAllocation)
%Compute the MSE for estimation of the squared Frobenius norm of the
%channel matrix for a given training power allocation. 
%INPUT:
%eigenvaluesTransmitter = Nt x 1 vector with eigenvalues at the
%                         transmitter side
%eigenvaluesReceiver    = Nr x 1 vector with eigenvalues at the
%                         receiver side
%powerAllocation        = Nt x 1 vector with training power allocation
%
%OUTPUT:
%MSE               = Mean Squared Error for estimation of the squared norm

MSE = sum(sum(((eigenvaluesTransmitter*eigenvaluesReceiver').^2 + 2*(powerAllocation.*eigenvaluesTransmitter.^3)*(eigenvaluesReceiver').^3)./(1+(powerAllocation.*eigenvaluesTransmitter)*eigenvaluesReceiver').^2));

知らせ:

  • この MIMO 送信アンテナは 8 つ、受信アンテナは 4 つです。
  • 3 つの関数ファイルの名前は、関数と一致している必要があります。
  • 最初に関数ファイルを実行してから、メインのメイン ファイルを実行します。
  • 関数ファイルが変数の数のエラーを報告するのは通常のことです。
  • 実行後の写真が 2 つありますので、どちらかを選択してください。

3. 実行結果と分析

分析します:

3.1 平均二乗誤差 (MSE) とトレーニングパワー (dB) の関係

画像から、チャネル推定方法に関係なく、トレーニング パワーが増加すると、平均二乗誤差 (MSE) が減少します。

MSE: 平均 二乗 誤差 平均二乗誤差

平均二乗誤差の正式名は、誤差の二乗の平均値です。誤差は、実際のチャネル値から推定チャネル値を引いたものです。名前からは簡単に理解できると思います。次に、その標準的な式を示します。

MSE=E\lbrace(H-\hat H)^2\rbrace

上の式で、E{} は内部の平均 (数学的期待値) を表し、H はチャネルの正確な値を表し、\hat{H}チャネルの推定値を表します。

チャネル推定にはパイロット信号を送信する必要があります。トレーニング パワーが大きいほど、より多くの投資が必要になり、チャネル推定誤差は小さくなります。チャネル推定パフォーマンスが優れているほど、平均二乗誤差が小さくなります。これが、すべての曲線がすべてである理由を説明しています。減少傾向を示した。

3.2 さまざまなチャネル推定方法の性能比較

垂直比較の場合、最適から最悪までのチャネル推定は、MMSE (最適)、MMSE (ヒューリスティック)、片側線形、両側線形、MVU です。

この図は合計 5 つの MIMO チャネル推定方法を示していますが、この図を理解するには、それぞれのチャネル推定方法を分析する必要があります。

(1)MVU、最適

最悪のことから始めましょう。MVU の正式名称は minimum variance unbiased で、中国語訳は minimum variance unbiased です。

おすすめ

転載: blog.csdn.net/forest_LL/article/details/129037367