LS和MMSE信道估计以及Matlab仿真

        首先希望能有大佬看见后指点我一下为什么大多MMSE代码中直接代入了真实信道,既然已经知道了真实信道,那干嘛还要求

        对信号求FFT后可以表示为:

Y=HX+N

仅考虑单发单收情况(SISO),大写字母代表了频域。

LS估计

        最常用的最小二乘(Least Square,LS)估计,考虑得到信道估计\hat{H}使得均衡后的信号\hat{X}=\frac{Y}{\hat{H}}和原始的发射信号X之间平方差最小:

J(\hat{H})=(X-\hat{X})^2

二次项显然取极值的时候最小,因为这个是由估计信道\hat{H}决定的,因此对其求导并令倒数为0得到了:

        \frac{\partial{J(\hat{H})}}{\partial{\hat{H}}}=2\frac{XY}{\hat{H}^2}-2\frac{Y^2}{\hat{H}^3}=0

\hat{H}=\frac{Y}{X}

        此时信道估计的MSE误差为:

MSE=E\begin{Bmatrix} (H-\hat{H})^2 \end{Bmatrix}

用Y=HX+N取代Y/X得到:

MSE=E\begin{Bmatrix} (\frac{N}{X})^2 \end{Bmatrix}=\frac{1}{SNR}

        也就是说LS估计的性能随着信噪比降低而变差,大多数情况下只适用于高信噪比,但是非常简单,在OFDM中用接收导频除以真实导频就可以了。

MMSE估计

        为了解决LS带来的问题,对LS结果进行加权希望能最小化MSE误差。在《MIMO-OFDM》书中提到误差向量与H_LS正交,一时间不是很理解。

通过GPT提醒以及画图后可以清晰看出原因。

        本质上是最优化理论中的投影定理:将一个向量投影到一个子空间上时,剩余的误差向量必定与这个子空间正交

        从推理角度,我们得到了加权W后的MSE误差为:

最后发现误差最小时候的W会使得误差e和H_LS正交。

        书中直接用这个结论可以更快的得到W的推导,也就是GPT给出的“5.误差与正交性的关系”中得到展开后的结果并令其正交为0:

R_{HH_{LS}}-WR_{H_{LS}}=0 \\ W = R_{HH_{LS}}R_{H_{LS}}^{-1}

在标量中表示为H和H_LS的互相关除上H_LS的自相关。那么就需要计算出具体的值了。H_LS可以用LS估计得到,同时计算出互相关。那么真实信道H的值以及互相关要怎么计算呢?

        这里的H使用了当前信道的统计分布来替代,即经过长时间收集后得到了该场景下信道分布模型以及参数等必要条件,进行了建模。在书中假设了信道服从指数衰减的PDP

        需要说明的是,在这里的推导过程其实是LMMSE,因为对信号进行了简单的线性加权,即乘上了加权矩阵W。而复杂的非线性MMSE是f(H_LS)进行非线性映射。

 代码仿真

        这里我试了试瑞丽信道(Rayleigh)下的MMSE信道估计,假设发射的导频为全1,那么接收信号Y=H+N

1.生成另外一个相同瑞丽分布的信道作为长期观察的结果

% 参数设置
M = 64;           % 子载波数量
N = 1000;         % 仿真次数(信道样本数量)
SNR_dB = 0;      % 信噪比 (dB)
SNR = 10^(SNR_dB/10); % 线性信噪比

% 生成真实的Rayleigh信道 H_real
H_real = (randn(M, N) + 1j * randn(M, N)) / sqrt(2);  % Rayleigh 信道 (M*N)

% 添加噪声到接收信号 Y_r
noise = (randn(M, N) + 1j * randn(M, N)) / sqrt(2);
Y_r = H_real + noise / sqrt(SNR);  % 接收信号 = 真实信道 + 噪声

% LS 信道估计 H_LS
H_LS = Y_r;  % LS 估计信道

% 生成一个新的估计信道 H_est (假设通过另一个观测获得)
H_est = (randn(M, N) + 1j * randn(M, N)) / sqrt(2);  % 估计信道 (M*N)
% H_est = H_LS;

% 计算自相关矩阵 R_HH 和互相关矩阵 R_HH_LS
% 这里我们不再直接使用 H_real,而是用 H_est
R_HH = (H_est * H_est') / N;  % 估计信道 H_est 的自相关矩阵
R_HH_LS = (H_est * H_LS') / N;  % 估计信道 H_est 与 LS 估计信道的互相关矩阵

% LS 信道估计的自相关矩阵
R_HH_LS_LS = (H_LS * H_LS') / N + (1/SNR) * eye(M);  % 自相关矩阵,包含噪声

% MMSE 信道估计权矩阵 W
W = R_HH_LS / R_HH_LS_LS;

% 计算 MMSE 信道估计 H_MMSE
H_MMSE = W * H_LS;

% 计算 MSE (均方误差)
MSE_LS = mean(mean(abs(H_real - H_LS).^2));  % LS 估计的MSE
MSE_MMSE = mean(mean(abs(H_real - H_MMSE).^2));  % MMSE 估计的MSE

% 输出均方误差
fprintf('LS 估计的均方误差 (MSE): %.4f\n', MSE_LS);
fprintf('MMSE 估计的均方误差 (MSE): %.4f\n', MSE_MMSE);

结果发现效果很差,原因在于生成的H_est和真实信道差的非常多,因此导致了R_HH虽然依旧是近似一个单位矩阵(当两个标准正态分布构成瑞丽分布时,R_HH就是单位矩阵),但是R_HH_LS和真实情况会差的非常多,此时互相关矩阵的幅度为下图所示,显然不是单位矩阵。

2.直接用H_LS代替真实信道

        原因是H_LS虽然包含噪声,但是也一定程度反应了真实信道。将上述代码中的H_est修改

H_est = H_LS;

可以看到最后在0dB下MSE误差确实小了很多。

3.利用真实信道的分布

        在知道真实信道的统计特性后不用得到真实的信道冲激响应,我们可以计算出真实信道的互相关矩阵,并假设H_LS误差很小,此时直接用互相关R_HH代替了R_HH_LS。

% 假设信道的统计特性已知,我们假设信道的均值为 0,方差为 1
% 自相关矩阵 R_HH 是单位矩阵,表示各个子载波的独立性
R_HH = eye(M);  % 信道自相关矩阵

% 真实信道与LS估计信道的互相关矩阵,我们假设其与自相关矩阵相同
R_HH_LS = R_HH;

此时输出得到的MSE误差再次降低
 

不理解的地方

        我看到很多MMSE的代码直接代入了真实信道,可是既然我们已经知道了真实信道,那为什么还需要求信道呢?这个是我不太理解的地方,因此我问了GPT很多遍,它第一次也是直接代入了真实的信道冲击响应。后续我让它用别的方法替代了真实信道,发现在低信噪比情况下也能改进信道估计,同时感觉这些更加具有实际应用价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值