初识MIMO(六):MU-MIMO的仿真

零 代码地址

https://github.com/liu-zongxi/MIMO_simulation

请大家看完觉得有用别忘了点赞收藏,github项目给star哦

一.基本概念

多用户MIMO主要是希望实现一对多,这要求对于每一个MS,要去除掉发送给其他MS的信号,这也就是这一章的核心了,在接下来所有的仿真中,我们都更关注下行广播,而我感觉到所有仿真里都隐含了一个条件就是
N T = N R × N u s e r NT = NR \times N_{user} NT=NR×Nuser​

二. 信道传播方式一——信道反转

1.理论

信道反转就是所谓的预编码均衡,没有任何区别,但注意,此时NR=1,直接去掉信道的影响来看代码吧

2. 代码

%------------------MU-MIMO的信道反转方式---------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月3日15点50分-----------------%
%% 参数设置
clear;clf;
L_frame = 100;      % 一个帧里多少符号
N_packet = 2000;    % 一个包里多少帧
Nmod = 2;           % 调制阶数
NT = 4;             % 发射天线数
N_user = 20;        % 用户数
N_user_active = NT;  % 当前使用的用户数
I = eye(NT,NT);
Ncase = 4;SNRs_dB = 0:2:20;
SNRs = 10.^(SNRs_dB/10);
N_SNR = length(SNRs);
BERs = zeros(Ncase, N_SNR);
gss = ["-kx" "-b^" "-ro" "-m+"];   % 画图图像,注意使用双引号
%% 主函数
for icase = 1:Ncasegs = gss(icase);if icase ==1W_formula = @(H, sigma, I) H'*inv(H*H');flag_select = 0;elseif icase ==2W_formula = @(H, sigma, I) H'*inv(H*H'+sigma*I);flag_select = 0;elseif icase ==3W_formula = @(H, sigma, I) H'*inv(H*H');flag_select = 1;elseif icase ==4W_formula = @(H, sigma, I) H'*inv(H*H'+sigma*I);flag_select = 1;end for isnr = 1:N_SNRSNR = SNRs(isnr);n_biterror = 0;sigma = sqrt(NT/(2*SNR));for ipacket = 1:N_packet% 生成信号frame_origin = randi([0,1],L_frame,N_user_active*Nmod);frame_mod = QPSKMod(frame_origin,L_frame, N_user_active);frame_reshape = reshape(frame_mod, N_user_active, L_frame);% 生成信道if flag_select == 0H_DL = (randn(N_user_active,NT)+1j*randn(N_user_active,NT))/sqrt(2);elseif flag_select ==1H = zeros(N_user, NT);Channel_norm = zeros(1, N_user);for iuser = 1:N_userH(iuser,:) = (randn(1,NT)+1j*randn(1,NT))/sqrt(2);Channel_norm(iuser)=norm(H(iuser,:));end[Ch_norm,Index]=sort(Channel_norm,'descend');H_DL = H(Index(1:N_user_active),:);endW = W_formula(H_DL, sigma, I);beta = sqrt(NT/trace(W*W'));W_pre = beta*W;frame_trnasmit = W_pre*frame_reshape;noise = sigma*(randn(N_user_active,L_frame)+1j*randn(N_user_active,L_frame));y = H_DL * frame_trnasmit + noise;% 接收frame_re = y/beta;frame_pre_demod = reshape(frame_re, L_frame, N_user_active);frame_demod = QPSKDemod(frame_pre_demod,L_frame,N_user_active);% 计算误码率n_biterror_tmp = sum(sum(abs(frame_demod - frame_origin)))n_biterror = n_biterror + n_biterror_tmp;endBERs(icase, isnr) = n_biterror/(N_packet*L_frame*Nmod);endsemilogy(SNRs_dB,BERs(icase,:),gs);hold on;
end
%% 画图
title('MU-MIMO BER inv');
xlabel('SNR[dB]');
ylabel('BER')
grid on;
set(gca,'fontsize',9)
legend('ZF','MMSE','ZF with select', 'MMSE with select')

3. 一些思考

啊,没有什么好思考的,上一张都思考过了,看不懂这个代码的可以看我的前一个博客~

三. 信道传播方式二——块对角化

1.理论

2.代码

%------------------MU-MIMO的对角块化---------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月3日15点50分-----------------%
%% 设置
clear;
clf;
L_frame = 100;
N_packet = 2000;
Nmod = 2;
NT = 4;
NR = 2;
N_user = 2;gss = ["-kx" "-^" "-ro" "-b>" "-g<" "-m+"];
SNRs_dB = 0:2:20;
SNRs = 10.^(SNRs_dB/10);
N_SNR = length(SNRs_dB);
BERs = zeros(5, N_SNR);
%% 主函数
for isnr = 1:N_SNRSNR = SNRs(isnr);n_biterror = 0;sigma = sqrt(NT/(2*SNR));for ipacket = 1:N_packet% 生成信号frame_origin = randi([0,1],L_frame,NT*Nmod);frame_mod = QPSKMod(frame_origin,L_frame, NT);frame_reshape = reshape(frame_mod, NT, L_frame);% 信道noise = sigma* (randn(NR,L_frame)+1j*randn(NR,L_frame));H1 = (randn(NR,NT)+1j*randn(NR,NT))/sqrt(2);H2 = (randn(NR,NT)+1j*randn(NR,NT))/sqrt(2);H = (randn(NR,NT, N_user)+1j*randn(NR,NT, N_user))/sqrt(2);% 对角化处理for iuser = 1:N_userif iuser == 1region_tilde = [2:N_user];elseif iuser == N_userregion_tilde = [1:N_user - 1];elseregion_tilde = [1:iuser-1 iuser+1:N_user];endH_tilde_temp = [];for ii = region_tildeH_tilde_temp = [H_tilde_temp H(:,:,ii)'];endH_tilde = H_tilde_temp';[U,S,V] = svd(H_tilde);index_zero = size(S,2)-rank(S);W(:,:,iuser) = V(:,end-index_zero+1:end);endframe_transmit = 0;for iuser = 1:N_userframe_transmit = frame_transmit+W(:,:,iuser)*frame_reshape(NR*(iuser-1)+1:NR*(iuser-1)+NR,:);end
%         [U1,S1,V1] = svd(H1);
%         W2 = V1(:,3:4);
%         [U2,S2,V2] = svd(H2);
%         W1 = V2(:,3:4);
%         frame_transmit = W1*frame_reshape(1:2,:) + W2*frame_reshape(3:4,:);for iuser = 1:N_usery(:,:,iuser) = H(:,:,iuser)*frame_transmit+noise;end
%         y1 = H1*frame_transmit+noise;
%         y2 = H2*frame_transmit+noise;
%         HV1 = H1*W1;
%         EQ1 = HV1'*inv(HV1*HV1'); % Equalizer for the 1st user
%         HV2 = H2*W2;
%         EQ2 = HV2'*inv(HV2*HV2'); % Equalizer for the 2nd usery_re=[];for iuser = 1:N_userHV =  H(:,:,iuser)*W(:,:,iuser);EQ = HV'*inv(HV*HV');y_re_temp = EQ*y(:,:,iuser);y_re = [y_re;y_re_temp];end% y = [EQ1*y1; EQ2*y2];% frame_pre_demod = reshape(y,L_frame,NT);frame_pre_demod = reshape(y_re,L_frame,NT);frame_demod = QPSKDemod(frame_pre_demod,L_frame,NT);% 计算误码率n_biterror_tmp = sum(sum(abs(frame_demod - frame_origin)))n_biterror = n_biterror + n_biterror_tmp;endBERs(1, isnr) = n_biterror/(N_packet*L_frame*Nmod);
end
%% 画图
BERs(2,:) = [1.40608250000000  1.27856000000000    1.12480750000000    0.941037500000000   0.738272500000000   0.582960000000000   0.417507500000000   0.287120000000000   0.197902500000000   0.115562500000000   0.0775400000000000];
BERs(3,:) = [0.892967500000000 0.736142500000000   0.576275000000000   0.428812500000000   0.306602500000000   0.212430000000000   0.143212500000000   0.0964100000000000  0.0644250000000000  0.0476550000000000  0.0363025000000000];
BERs(4,:) = [1.16728000000000  1.02494250000000    0.830452500000000   0.641750000000000   0.481362500000000   0.320395000000000   0.211695000000000   0.144177500000000   0.0884050000000000  0.0634100000000000  0.0345100000000000];
BERs(5,:) = [0.679290000000000 0.521507500000000   0.376435000000000   0.253155000000000   0.160840000000000   0.102062500000000   0.0656150000000000  0.0394150000000000  0.0272925000000000  0.0190700000000000  0.0148800000000000];
for i = 1:5semilogy(SNRs_dB,BERs(i,:), gss(i));hold on;
end

3.一些思考

  1. 代码我做了推广,可以适用于任意的NT和NR,但都要满足NT=NR*N_user 是严格按照书本公式来的,不过随着NT增大,效果越差这,这也很好理解,因为干扰越来越难以消除
  2. 我们可以看到,块对角化最大的特点是(13.17),他考虑了不属于当前MS的信号对当前MS的影响,并尝试消除他,就是说专门的NT服务专门的MS。

四. 信道传播方式三——DPC和TH

2.代码

%------------------------DPC和TH编码-------------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月4日10点38分-----------------%
%% 参数设置
clear;clf;
L_frame =100;
N_packet = 2000;
Nmod = 2;
NT = 4;
N_user = 10;
N_user_ative = 4;
I=eye(NT,NT);SNRs_dB = 0:2:20;
SNRs = 10.^(SNRs_dB/10);
N_SNR = length(SNRs);BERs = zeros(2, N_SNR);Ncase = 2;
gss = ["-kx" "-b^" "-ro" "-m+"];   % 画图图像,注意使用双引号
%% 主函数
for icase = 1:Ncasegs = gss(icase);for isnr = 1:N_SNRSNR = SNRs(isnr);n_biterror = 0;sigma = sqrt(NT/(2*SNR));for ipacket = 1:N_packet% 生成数据frame_origin = randi([0,1],L_frame,NT*Nmod);% QPSK调制frame_mod=QPSKMod(frame_origin,L_frame, NT);frame_reshape = reshape(frame_mod,NT,L_frame);% 信道H = (randn(N_user,NT)+1j*randn(N_user,NT))/sqrt(2);% 选出四个最好的信道Types = nchoosek([1:N_user],N_user_ative);for itype = 1:size(Types, 1)H_sel = H(Types(itype,:)',:);[Q_H, R_H] = qr(H_sel);L_min(itype) = min(diag(R_H));end% 最大的最小值就是最好的四个[val_max_L_min,index_max_L_min] = max(L_min);H_selected = H(Types(index_max_L_min,:)',:);% Matlab没有LQ分解,要这样曲线救国[Q_temp,R_temp] = qr(H_selected');L=R_temp';Q=Q_temp';% 预编码frame_prepre = frame_reshape;if icase == 1for ipre = 2:4frame_prepre(ipre,:) = frame_prepre(ipre,:) - L(ipre,1:ipre-1)/L(ipre,ipre)*frame_prepre(1:ipre-1,:);endelsefor ipre = 2:4frame_prepre(ipre,:) = ModTH(frame_prepre(ipre,:) - L(ipre,1:ipre-1)/L(ipre,ipre)*frame_prepre(1:ipre-1,:), 2);endendframe_pre = Q'*frame_prepre;% 信道noise = sigma*(randn(N_user_ative,L_frame)+1j*randn(N_user_ative,L_frame));y = H_selected*frame_pre+noise;% 接收frame_re = inv(diag(diag(L)))*y;frame_recieved = reshape(frame_re,NT*L_frame,1);if icase==2 % in the case of TH precodingframe_recieved = ModTH(frame_recieved,2);endframe_pre_demod = reshape(frame_recieved,L_frame,NT);frame_demod = QPSKDemod(frame_pre_demod,L_frame,NT);% 计算误码率n_biterror_tmp = sum(sum(abs(frame_demod - frame_origin)))n_biterror = n_biterror + n_biterror_tmp;endBERs(icase, isnr) = n_biterror/(N_packet*L_frame*Nmod);endsemilogy(SNRs_dB,BERs(icase,:),gs);hold on;
end

3.一些思考

  1. % 选出四个最好的信道
    Types = nchoosek([1:N_user],N_user_ative);
    for itype = 1:size(Types, 1)
    H_sel = H(Types(itype,:)‘

    初识MIMO(六):MU-MIMO的仿真相关推荐

    1. 初识MIMO(四):MIMO的接收端检测技术及其仿真

      初识MIMO(四):MIMO的接收端检测技术及其仿真 零 代码地址 https://github.com/liu-zongxi/MIMO_simulation 请大家看完觉得有用别忘了点赞收藏,git ...

    2. 初识OFDM(六):从零开始的OFDM误码率仿真

      文章目录 初识OFDM(六):从零开始的OFDM误码率仿真 零.代码地址 一. 加性高斯白噪声对OFDM误码率的影响 1. 代码展示 2. 代码分析 fftshift和ifftshift 能量和信噪比 ...

    3. 初识MIMO(一): MIMO信道模型

      初识MIMO(一): MIMO信道模型 一.MIMO中常用的一些量 1. 统计模型 MIMO中信道使用相关性来描述的,而相关性是和AoA强相关的,如何来描述呢? 可以看到,建模的方式是得到PADS后分 ...

    4. LTE学习笔记六:MIMO多天线技术

      不断提高空中接口的吞吐率是无线制式的发展目标.MIMO多天线技术是LTE大幅提升吞吐率的物理层关键技术.MIMO技术和OFDM技术一起并称为LTE的两大最重要物理层技术.MIMO技术很多原理,涉及一些 ...

    5. 1x2 MIMO和2x2 MIMO 代表的意思?

      1x2 MIMO和2x2 MIMO 代表的意思? 1.1x2MIMO就是一个输入in,两个输出out: 2.2x2MIMO就是两个输入in,两个输出out. MIMO(Multiple-Input M ...

    6. FPGA学习笔记(六)Modelsim单独仿真和Quartus联合仿真及signaltap使用

      系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

    7. 基于Simulink的六足机器人运动控制仿真

      基于Simulink的六足机器人运动控制仿真 在机器人领域中,六足机器人是一种具有灵活性和自适应性的移动机器人.它们可以通过多足支撑和多足行走来克服崎岖地形带来的挑战,因此具有广泛的应用前景.在这篇文 ...

    8. FPGA作业_阶段一(六进制计数器仿真6-9进制循环计数器)

      一.六进制计数器仿真 题目内容如下: 自行绘制的电路结构RTL设计图 Quartus扫描生成的电路RTL图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQR5BEJ ...

    9. matlab通信仿真mimo,MIMO通信系统天线选择算法仿真

      我的思路是这样的: 一个通信链路, 包括发送端和接受端, 在发送端进行天线选择,选择信道矩阵H的相应列, 目前我已经有一个函数来表示选择的算法, 但是缺少一个可以用的的链路,  来计算出具体的BER- ...

    10. VHDL六层电梯控制器及仿真

      六层电梯电梯 设计要求:设计一个六层电梯控制系统要求有超载.关门中断.提前关门清除报警信电梯外人的上升请求信号,电梯外人的下降请求信号, 电梯外人上升请求信号显示电梯外人下降请求信号显示  到达楼层信 ...

    最新文章

    1. Acwing第 38 场周赛【完结】
    2. Allegro PCB 怎么对齐元器件
    3. Java编写基于netty的RPC框架
    4. js this指向问题,同级this指向同级,非同级this指向全局
    5. Chilkat -- python又一个强大的库
    6. 【基础知识】【中缀转逆波兰(后缀)表达式】
    7. WinFlash AwdFlash分析
    8. ATMC/ATMP是啥?
    9. android 7 sl4a,SL4A 伴随Android7 浴火重生
    10. 记录下自己拙计的算法之旅 LeetCode Rotate Array
    11. OpenGL--摄像机
    12. 用iPhone开高达:日本推出可驾驭的真实重型机甲
    13. D妹上新|DoH和DoT开始公测啦!
    14. SP2限制连接数补丁!最新版本2.11a
    15. 1.JAVASE 语言简述
    16. 实现海康监控视频播放(实时预览)(抓拍,录像,对讲等功能)
    17. Camtasia视频剪辑功能详解
    18. Python数据分析-笔记01
    19. numpy矩阵删除一列或一行
    20. educoder 数据挖掘算法原理与实践:线性回归(房价预测)

    热门文章

    1. 360cdn能挡住cc攻击_又被CC攻击弄得心有余悸?莫怕!这里教你如何防御
    2. 韩国为什么“恢复”汉字?
    3. linux内存占用过高怎么解决,centos7内存占用过高处理方法
    4. JAVA中输出分两栏,老司机搞定Java 设置Word分栏
    5. linux安装系统如何查看硬盘,如何检查Linux系统服务器的硬盘是SSD还是HDD?
    6. html图片超出内容隐藏,图片按比例缩小,溢出超出DIV边框的内容自动隐藏方法!...
    7. 下载百度编辑器ueditor
    8. (转)游戏运营18种方式
    9. 【EndNote文献管理】批量导入删除引用
    10. LINUX   LVM 硬盘管理及LVM的扩容