matlab代码--基于注水法的MIMO信道容量实现

今天接触一个简单的注水法程序,搞懂数学原理即可看懂代码。

1 注水法简介

详细原理可以参考:
MIMO的信道容量以及实现
大致理论就是利用拉格朗日乘子法,求解信道容量的最大化问题,得到的解形如往水池中注水的形式,最后根据公式敲代码即可。

2 代码及结果

信道可以替换多种:
如常用的复高斯信道,正交信道,对角信道,获得相应的特征值进行信道容量计算

1 正交信道
B=randn(Nt,Nt)+i*randn(Nt,Nt); %产生信道
h1=orth(B); %获得正交信道
lambda = sort(eig(h1*h1'),'descend')'; %信道降序排序2 对角信道
h_v = 1/sqrt(2)*(randn(1,Nt)+1j*randn(1,Nt)); %产生信道矩阵中对角线的值
h1 = diag(h_v,0); %产生对角信道矩阵
lambda = sort(eig(h1*h1'),'descend')'; %信道降序排序
3 常用的iid信道
h1 = 1/sqrt(2)*(randn(Nr(1),Nt(1))+1j*randn(Nr(1),Nt(1)));%添加iid信道
lambda = sort(eig(h1*h1'),'descend')'; %信道降序排序

完整仿真代码如下:

clc;
clear all;
close all;
Nr = 6; %接收天线
Nt = 6; %发送天线
snrdb = -5:1:10; %信噪比变化趋势,单位瓦特
snr = 10.^(snrdb/10); % 单位dB
Niterr = 1000; % 蒙特卡罗仿真次数
c = zeros(length(snr),1);%变量用于存储
mu = zeros(1,length(snr));%变量用于存储
p_opt = zeros(length(snr),2);%变量用于存储
for q =1:Niterr
h1 = 1/sqrt(2)*(randn(Nr(1),Nt(1))+1j*randn(Nr(1),Nt(1)));%添加iid信道
lambda = sort(eig(h1*h1'),'descend')'; %信道降序排序
for j = 1:length(snr)
%% 使用注水法
r = rank(h1);niter=0;while 1mu(j) = 1/(r-niter)*(1+1/snr(j)*sum(1./lambda(1:(r-niter))));  %功率门限值p_opt(j,1:(r-niter)) = mu(j)- 1./(snr(j)*lambda(1:(r-niter))); %注水法公式if abs(p_opt(j,:))== p_opt(j,:)breakelsep_opt(j,end-niter:end) = 0;        niter = niter+1;endendc(j,1) = c(j,1)+ sum(log2(1+snr(j)*p_opt(j,:).*lambda(1:rank(h1))));%信道容量公式
end
end
grid on;
plot(snrdb,c(:,1)/Niterr,'r-*');
xlabel('SNR(dB)');
ylabel('Channel Capacity (bits/sec)');
hold on;%%%%%%%
clc;
Nr = 12; %接收天线
Nt = 12; %发送天线
snrdb = -5:1:10; %信噪比变化趋势,单位瓦特
snr = 10.^(snrdb/10); % 单位dB
Niterr = 1000; % 蒙特卡罗仿真次数
c = zeros(length(snr),1);%变量用于存储
mu = zeros(1,length(snr));%变量用于存储
p_opt = zeros(length(snr),2);%变量用于存储
for q =1:Niterr
h1 = 1/sqrt(2)*(randn(Nr(1),Nt(1))+1j*randn(Nr(1),Nt(1)));%添加复信道
lambda = sort(eig(h1*h1'),'descend')'; %信道降序排序
for j = 1:length(snr)
%% 使用注水法
r = rank(h1);niter=0;while 1mu(j) = 1/(r-niter)*(1+1/snr(j)*sum(1./lambda(1:(r-niter))));p_opt(j,1:(r-niter)) = mu(j)- 1./(snr(j)*lambda(1:(r-niter))); %注水法公式if abs(p_opt(j,:))== p_opt(j,:)breakelsep_opt(j,end-niter:end) = 0;        niter = niter+1;endendc(j,1) = c(j,1)+ sum(log2(1+snr(j)*p_opt(j,:).*lambda(1:rank(h1))));
end
end
grid on;
plot(snrdb,c(:,1)/Niterr,'k-s');
xlabel('SNR(dB)');
ylabel('Channel Capacity (bits/sec)');
hold on;%%
clc;
Nr = 24; %接收天线
Nt = 24; %发送天线
snrdb = -5:1:10; %信噪比变化趋势,单位瓦特
snr = 10.^(snrdb/10); % 单位dB
Niterr = 1000; % 蒙特卡罗仿真次数
c = zeros(length(snr),1);%变量用于存储
mu = zeros(1,length(snr));%变量用于存储
p_opt = zeros(length(snr),2);%变量用于存储
for q =1:Niterr
h1 = 1/sqrt(2)*(randn(Nr(1),Nt(1))+1j*randn(Nr(1),Nt(1)));%添加复信道
lambda = sort(eig(h1*h1'),'descend')'; %信道降序排序
for j = 1:length(snr)
%% 使用注水法
r = rank(h1);niter=0;while 1mu(j) = 1/(r-niter)*(1+1/snr(j)*sum(1./lambda(1:(r-niter))));p_opt(j,1:(r-niter)) = mu(j)- 1./(snr(j)*lambda(1:(r-niter))); %注水法公式if abs(p_opt(j,:))== p_opt(j,:)breakelsep_opt(j,end-niter:end) = 0;        niter = niter+1;endendc(j,1) = c(j,1)+ sum(log2(1+snr(j)*p_opt(j,:).*lambda(1:rank(h1))));
end
end
%%画图 
grid on;
plot(snrdb,c(:,1)/Niterr,'g-o');
xlabel('SNR(dB)');
ylabel('Channel Capacity (bits/sec)');
hold on;
xticks([-5:1:10])
legend("Nt=6 Nr=6 MIMO", "Nt=12 Nr=12 MIMO", "Nt=24 Nr=24 MIMO")

在这里插入图片描述

可以看到,mimo技术可以提高信道容量。初次接触的朋友可以关注下蒙特卡洛仿真的写法(即为了克服信道每次的随机性,多次计算取平均)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/475206.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

波奇学Linux:动静态库

创建静态库 Makefile文件 mymath.c文件 mymath.h文件 编译main.c文件 gcc 编译时会把在系统目录中寻找头文件和库文件,文件不在系统目录中用参数 -I 头文件所在文件夹/ -L 库的地址文件夹 -l除去lib和后缀。 拷贝文件到系统目录即可不用参数 库的安装类似于把头文件…

【51单片机】如何设置中断函数(场景:在定时器工作完跳转到中断程序时,怎么识别我们的中断程序在哪里呢?)

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 本章是【利用定时器和中断实现一个简单项目】中的一部分,感兴趣的老铁可以跳转传送门查看传送门 欢迎订阅 YY滴C专栏!更多干货…

Ant Design Card 组件展示图片

文章目录 Ant Design Card 组件展示图片理解card组件结构隐藏卡片内容区域 下拉时加载图片卡片加载更多代码 分页的方式加载图片列表【推荐】实现思路代码demo缩略图在card组件下发显示图片文件名卡片操作 分页 Ant Design Card 组件展示图片 官方文档: Card卡片组…

二维码的颜色怎么改变?轻松3步修改二维码样式

怎么修改二维码的颜色呢?一般我们制作的二维码或者经过系统生成的二维码大多都是黑白颜色的,有些小伙伴会觉得不太美观无法满足自己的使用需求。那么对于想要修改二维码样式的小伙伴,可以使用二维码生成器的二维码美化功能来处理,…

Vue3

目录 一、 Vue3简介 1. 性能的提升 2. 源码的升级 3. 拥抱TypeScript 4. 新的特性 二、 创建Vue3工程 1. 基于 vue-cli 创建 2. 基于 vite 创建(推荐) 3. 一个简单的效果 三、Vue3核心语法 1. OptionsAPI 与 CompositionAPI (1)Options API …

2024春日营销三大内容趋势,种草爆文轻松get丨小红书数据分析

春季是市场迎来消费焕活的新周期,也是新一年品牌实现生意高速起步的必争节点。一年之“计”在于春,春日营销,吹响品牌营销第一声号角。那么,春日营销在小红书上有何内容趋势,跟着小编的脚步一起来看看~ 内容趋势 1、亲…

网页设计升阶秘籍:用Bootstrap打造响应式网站!

介绍:Bootstrap是一个流行的前端框架,它集成了HTML、CSS和JavaScript,旨在帮助开发者快速构建响应式和移动优先的网站。以下是Bootstrap的详细介绍: 响应式设计:Bootstrap的核心特性之一是其响应式布局系统&#xff0c…

相机图像质量研究(34)常见问题总结:图像处理对成像的影响--拖影

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

集团企业大数据应用:突破痛点,释放数据价值

在数字经济日益崛起的背景下,集团企业以其管理范围广泛、业务领域多元化和分支机构复杂化的特性,在市场竞争中扮演着重要角色。为了维持和提升这种竞争力,大数据应用成为了集团企业不可或缺的战略工具。然而,在实际应用中&#xf…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系,把每日所学的知识梳理出来,既能够当作读书笔记,又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念:信源、信道、信宿&…

wps快速生成目录及页码设置(自备)

目录 第一步目录整理 标题格式设置 插入页码(罗马和数字) 目录生成(从罗马尾页开始) ​编辑目录格式修改 第一步目录整理 1罗马标题 2罗马标题1一级标题 1.1 二级标题 1.2二级标题2一级标题 2.1 二级标题 2.2二级标题3一级标…

红队打靶练习:IMF: 1

目录 信息收集 1、arp 2、nmap 3、nikto 目录探测 gobuster dirsearch WEB 信息收集 get flag1 get flag2 get flag3 SQL注入 漏洞探测 脱库 get flag4 文件上传 反弹shell 提权 get flag5 get flag6 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# a…