1️⃣ 为什么要分析MIMO系统在CSI有无情况下的信道容量?
当系统已知CSI时,发送端可以优化传输方式,从而最大化信道容量。
在实际场景中,CSI不可预知,此时,通信系统无法做出优化调整,信道容量就会受到限制。
通过这个分析,可以帮助我们评估无线通信系统在没有 CSI 时,系统的性能损失
2️⃣ 解题思路
MIMO信道容量的经典公式为,
C = log 2 det ( I N R x + E x N T x N 0 H H H ) C=\log 2 \operatorname{det}\left(\boldsymbol{I}{N_{\mathrm{Rx}}}+\frac{E_x}{N_{\mathrm{Tx}} N_0} \boldsymbol{H} \boldsymbol{H}^{\mathrm{H}}\right) C=log2det(INRx+NTxN0ExHHH)
其中, I N R x I_{N_{\mathrm{Rx}}} INRx是一个单位矩阵,大小为 N R x × N R x N_{\mathrm{Rx}} \times N_{\mathrm{Rx}} NRx×NRx ,其中 N R x N_{\mathrm{Rx}} NRx 是接收天线数; E x E_x Ex 是发送信号的总功率; N T x N_{\mathrm{Tx}} NTx 是发送天线数; N 0 N_0 N0 是噪声功率谱密度; H H H表示信道矩阵; H H H^H HH是信道矩阵的共轭转置
已知CSI时MIMO系统信道容量
公式可以表示为:
C = log 2 det ( I N R x + E x N T x N 0 Γ ⋅ S V ) C=\log 2 \operatorname{det}\left(\boldsymbol{I}{N_{\mathrm{Rx}}}+\frac{E_x}{N_{\mathrm{Tx}} N_0} \mathbf{\Gamma} \cdot \mathbf{SV} \right) C=log2det(INRx+NTxN0ExΓ⋅SV)
其中,SV表示信道的奇异值,即 H H H \mathbf{H}^H \mathbf{H} HHH 的特征值 (等价于信道矩阵 H H H的奇异值 的平方),表示每个子信道的增益或信道条件。 Γ \Gamma Γ 表示注水法的功率分配
关于注水法的原理后续再具体介绍,理解注水法就是利用每个子信道的增益【信道矩阵 H H H的奇异值的平方】来决定该子信道的功率分配。增益大的子信道分配较少的功率,增益小的子信道分配较多的功率,使得系统容量最大化
未知CSI时MIMO系统信道容量可以表示为:
C = log 2 det ( I N R x + E x N T x N 0 H H H ) C=\log 2 \operatorname{det}\left(\boldsymbol{I}{N_{\mathrm{Rx}}}+\frac{E_x}{N_{\mathrm{Tx}} N_0} \boldsymbol{H} \boldsymbol{H}^{\mathrm{H}}\right) C=log2det(INRx+NTxN0ExHHH)
3️⃣ 代码
3.1 创建文件 MIMO_CL_OL.m
matlab
%%%%%%%%%%%%%%%%%%%%%%%%%%%MIMO在已知和未知CSI时的信道容量%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%
%信噪比范围
SNR = 0:5:20;
%SNR从dB转换为线性比例
SNR_linear = 10.^(SNR/10);
%蒙特卡洛迭代次数,每个SNR会进行1000次随机信道生成, 并求得信道容量的平均值
num_literation = 1000;
%收发天线数
Ntx = 4;
Nrx = 4;
I = eye(min(Nrx,Ntx));
%收发天线的相关性矩阵
Rtx = [1 0.2 0.2^2 0.2^3;
0.2 1 0.2 0.2^2;
0.2^2 0.2 1 0.2;
0.2^3 0.2^2 0.2 1];
Rrx = [1 0.2 0.2^2 0.2^3;
0.2 1 0.2 0.2^2;
0.2^2 0.2 1 0.2;
0.2^3 0.2^2 0.2 1];
%初始化信道容量,CL表示已知CSI,OL表示未知CSI
C_CL = zeros(1,length(SNR));
C_OL = zeros(1,length(SNR));
%%%%%%%%%%%%%%%%%%%%%%%主循环%%%%%%%%%%%%%%%%%%%%%
for index_snr = 1:length(SNR)
%无相关性信道,随机生成的瑞利衰落信道矩阵
Hw = sqrt(0.5)*(randn(Nrx,Ntx)+1i*randn(Nrx,Ntx));
%有相关性时的信道模型,参考"信道相关性对MIMO信道容量的影响"
H = sqrt(Rrx)*Hw*sqrt(Rtx);
SV = svd(H).^2;
for iteration = 1:num_literation
%已知CSI的信道容量
%注水功率分配法
Gamma = water_pouring(SV,SNR_linear(index_snr),Ntx);
C_CL(index_snr) = C_CL(index_snr)+log2(det(I+SNR_linear(index_snr)*diag(SV)*diag(Gamma)/Ntx));
%未知CSI的信道容量
C_OL(index_snr) = C_OL(index_snr)+log2(det(I+SNR_linear(index_snr)*H'*H/Ntx));
end
end
C_CL = real(C_CL)/num_literation;
C_OL = real(C_OL)/num_literation;
plot(SNR,C_CL,'b-s',SNR,C_OL,'r-o');
xlabel('SNR(dB)');
ylabel('bps/Hz');
legend('信道已知','信道未知');
title('CSI已知和未知的情况下MIMO的信道容量');
grid on;
3.2 创建函数 water_pouring.m
matlab
%lamda:信道矩阵奇异值的平方
%SNR:线性信噪比
%Ntx:发送天线数目
function Gamma = water_pouring(lamda,SNR,Ntx)
%子信道个数
r = length(lamda);
%已选择的子信道数量,开始时选择一个子信道
p = 1;
%index和index_temp用于在循环中选择哪些特征值对应的子信道还没有被注水
index = 1:r;
index_temp = index;
%while p < r 进入一个循环,直到所有子信道都有分配功率为止
while p<r
%irp是当前选择的子信道索引(从第 p 个到最后一个)
irp = 1:(r-p+1);
%Gamma 初始化为零,用于存储每个子信道的功率分配
Gamma = zeros(1,length(irp));
temp = sum(1./lamda(index_temp(irp)));
mu = Ntx/(r-p+1)*(1+1/SNR*temp);
Gamma(index_temp(irp)) = mu - Ntx./(SNR*lamda(index_temp(irp)));
if min(Gamma(index_temp))<0
i = find(Gamma==min(Gamma));
ii = find(index_temp == i);
index_temp2 = [index_temp(1:ii-1) index_temp(ii+1:end)];
clear index_temp;
index_temp = index_temp2;
p = p+1;
else
p = r;
end
end
Gamma_t = zeros(1,length(lamda));
Gamma_t(index_temp) = Gamma(index_temp);
Gamma = Gamma_t;
结果分析:
- 图中比较了发射端已知和未知 CSI 情况下 4 × 4 4 \times 4 4×4 MIMO 信道的遍历容量。可以看出已知CSI的系统能够提供更大的容量。
- 当 SNR 很高时,CSI 的获取并不能帮助改善信道的容量。因为信号质量足够好,即使没有CSI,也能获得接近的性能
4️⃣ 知识点
- 注水法只有在已知CSI情况下才能使用,增益大的子信道分配较少的功率,增益小的子信道分配较多的功率,使得系统容量最大化