初识MIMO(四):MIMO的接收端检测技术及其仿真
零 代码地址
https://github.com/liu-zongxi/MIMO_simulation
请大家看完觉得有用别忘了点赞收藏,github项目给star哦
一. 接收端检测技术概念
我们之前的仿真已经包含了SISO,MISO,SIMO,而检测技术就是MIMO中非常重要的一个技术,他的目的是从接收端提取出每一根发射天线的信号,此时,别的信号成为了干扰,也就第一次有了信干噪比的概念。
二. 仿真
1.代码展示
%------------------ZF和MMSE检测算法----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:17点18分-----------------%
%% 参数设置
NT = 4;
NR = 4; % 天线数
L_frame = 100; %帧长度
N_iter = 1000; % 循环次数
SNRs_dB = 3:1:20; % 信噪比
SNRs = 10.^(SNRs_dB./10);
N_SNR = length(SNRs);
Nmod = 2; % QPSK
N_case = 3; % 不同类型
BERs = zeros(N_case, N_SNR);
gss = ["-kx" "-^" "-ro" "-b>" "-g<" "-m+"]; % 画图图像,注意使用双引号
%% 主函数
for icase = 1:N_case
gs = gss(icase);
if icase == 1
W_formula = @(Hiid, sigma, NT) Hiid'*inv(Hiid*Hiid');
elseif icase == 2
W_formula = @(Hiid, sigma, NT) Hiid'*inv(Hiid*Hiid'+2*sigma.^2*diag(ones(1,NT)));
elseif icase == 3
W_formula = @(Hiid, sigma, NT) inv(Hiid);
end
for isnr = 1:N_SNR
SNR = SNRs(isnr);
n_biterror = 0;
for iiter = 1:N_iter
% 生成数据
frame_origin = randi([0,1],L_frame,Nmod*NT);
% QPSK调制
frame_mod=QPSKMod(frame_origin,L_frame, NT);
% 生成信道,SIMO有NR个信道
Hiid = (randn(NR,NT)+1j*randn(NR,NT))./sqrt(2);
% AWGN噪声
sigma = sqrt(1/(2*SNR));
noise = sigma*(randn(L_frame, NR) + 1j*randn(L_frame, NR));
% 接收信号
y = frame_mod*Hiid+noise;
% 信号检测
W = W_formula(Hiid, sigma, NT);
x_tilde = y*W;
% 解调
frame_demod = QPSKDemod(x_tilde,L_frame,NT);
% 计算误码率
n_biterror_tmp = sum(sum(abs(frame_demod - frame_origin)))
n_biterror = n_biterror + n_biterror_tmp;
end
BERs(icase, isnr) = n_biterror/(N_iter*L_frame*Nmod*2);
semilogy(SNRs_dB,BERs(icase,:),gs);
hold on;
axis([SNRs_dB([1 end]) 1e-6 1e0])
end
end
2.一些思考
- ZF和MMSE的目的是什么?
这个问题是绕了我很久的,直接×H的逆矩阵不就完了
后来我明白了ZF检测其实就是乘以了一个逆矩阵,不过他是“伪逆矩阵”
我在《通信新读》中看到了对ZF和MMSE的不同理解
可以看到MCR的目标是最大化MCR,ZF的目标是最大化SIR,MMSE的目标是最大化SINR
- 对于MIMO如何处理矩阵问题
这也是我在这个仿真中发现的,不能再借用所谓的.*了,会把逻辑搞的很混乱,后面会改为标准的矩阵运算
三.补充
检测算法是很博大精深的,后面有机会在补充别的算法