MATLAB modem.qammod和randint函数

实在是受不了MATLAB改函数了

试图找到如何修改代码,诶嘿,失败了,那我就自己写一下吧 

randint函数

%% P pre-MMSE
clear all;clc
% 参数设置
N_frame = 100; %帧数
N_packet = 1000; % 分组数
b = 2; % 每符号比特数
M = 2 ^ b; % 调制阶数
mod_obj = modem.qammod('M',M,'SymbolOrder','Gray','InputType','bit');
demod_obj = modem.qamdemod(mod_obj);
Nt = 4;
Nr = 4;
sq2 = sqrt(2);
N_pbits = N_frame * Nt * b;
N_tbits = N_pbits * N_packet;
fprintf('=======================================\n');
fprintf('Pre-MMSE transmission');
fprintf('\n %d x %d MIMO \n %d QAM',Nt , Nr , M);
fprintf('\n Simulation bits: %d',N_tbits);
fprintf('=======================================\n');
SNRdBs = [0:2:20];
for i_SNR = 1 : length(SNRdBs)
    SNRdB = SNRdBs(i_SNR);
    noise_var = Nt * 0.5 * 10^(-SNRdB / 10);
    sigma = sqrt(noise_var);
    rand('seed',1);
    randn('seed',1);
    N_ebits = 0;
    %%%%%%%%%%发射机%%%%%%%%%%%
    for i_packet = 1 : N_packet
        msg_bit = randint(N_pbits , 1); % 比特生成
        symbol = modulate(mod_obj,M); % QAM调制
        Scale = modnorm(symbol , 'avpow' , 1); % 归一化
        Symbol_nomalized = reshape(Scale * symbol, Nt, N_frame); % 重构数组
……
……
    end
end
……
……

这是书《MIMO-OFDM无线通信技术及MATLAB实现》P336页MMSE预均衡的代码的一部分,我的MATLAB版本是2023,理所当然的,randint函数和modem.qammod,modem.qamdemod都运行不了,需要修改

那么首先了解一下randint函数

f = randint(n,m);

这个函数表示产生一个元素为0或者1的n*m的随机矩阵

f = randint(n,m,[a,b])

这个函数表示产生一个元素在区间[a,b]之间的n*m的随机矩阵 

在新版本中的MATLAB中,函数randint显示已经被删除了,需要修改成randi,但是并不能直接将函数修改成randi就可以了,这两者并不等价,在MATLAB中,randi函数式用于生成随机整数的,以第一个randint函数为例,如果将函数f = randint(n,m)直接修改成f = randi(n,m),那么此时f就不再是一个元素为0或者1的n*m的随机矩阵,而会变成一个m*m的矩阵,矩阵中的元素为[1,n] 的均匀离散分布得到的伪随机整数。从下图中可以发现,如果直接把代码中的randint函数改成randi函数,那么只会得到一个伪随机的整数,而不会得到我们想要的矩阵

经过研究,我发现可以利用round函数配合rand函数使用

如果将randint函数直接修改成rand函数,虽然可以得到我们想要的N_pbits*1矩阵,但是矩阵中的元素是0到1之间均匀分布的随机数,并不能得到我们想要的非0即1的元素。

 不过搭配上round函数就可以很好的弥补这一点。round函数式一个四舍五入的函数,round(X)可以将X的每个元素四舍五入至最近的整数,由于rand输出的数在0到1之间,因此round四舍五入之后的结果只可能是0和1,这就很好地达到了我们想要的结果。

modem.qammod函数

randint函数的修改实际上还是蛮简单的,我记得其他地方也有讲解,比较麻烦的是QAM调制解调的函数,不过我还是改出来了

我们先看一下modem.qammod函数和qammod函数之间的相似性,首先,二者都需要有M这个元素,M表示调制阶数,指定为2的正整数幂,指定的是信号中的点数星座,SymbolOrder表示符号顺序,Gray表示使用格雷编码排序,InputType表示输入类型,bit表示指定输入信号必须包含二进制。

上述信息是非常重要的,这关乎着在修改函数之后代码是否能运行。

在老版MATLAB中,modem.qammod函数通常是配合着modulate使用的,modulate表示着通信仿真的调制,但是新版的就不再需要了,我修改好可以运行的代码如下所示

% Y = Q^THPx + N Q是接收预编码,H是信道,P是发送预编码
%% P pre-MMSE
clear all;clc
% 参数设置
N_frame = 100; %帧数
N_packet = 1000; % 分组数
b = 2; % 每符号比特数
M = 2 ^ b; % 调制阶数
Nt = 4;
Nr = 4;
sq2 = sqrt(2);
N_pbits = N_frame * Nt * b;
N_tbits = N_pbits * N_packet;
fprintf('=======================================\n');
fprintf('Pre-MMSE transmission');
fprintf('\n %d x %d MIMO \n %d QAM',Nt , Nr , M);
fprintf('\n Simulation bits: %d',N_tbits);
fprintf('=======================================\n');
SNRdBs = [0:2:20];
for i_SNR = 1 : length(SNRdBs)
    SNRdB = SNRdBs(i_SNR);
    noise_var = Nt * 0.5 * 10^(-SNRdB / 10);
    sigma = sqrt(noise_var);
    rand('seed',1);
    randn('seed',1);
    N_ebits = 0;
    %%%%%%%%%%发射机%%%%%%%%%%%
    for i_packet = 1 : N_packet
        msg_bit = round(rand(N_pbits , 1)); % 比特生成
        symbol = qammod(msg_bit , M , 'gray' , 'InputType' , 'bit'); % QAM调制
        Scale = modnorm(symbol , 'avpow' , 1); % 归一化
        Symbol_nomalized = reshape(Scale * symbol, Nt, N_frame); % 重构数组
……
……
    end
end
……
……

首先是删除源代码中已经被删除用不了的两个函数,其次是将通信仿真调制函数直接修改成qammod函数,后面的调制格式一定要跟,就上面一段函数来说,如果缺少了bit这一限制条件,那么下面的reshape函数就会报错,因为symbol输出的时候就不是用二进制调制出来的400*1的矩阵,而是800*1的矩阵。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter笔记:Widgets Easier组件库-使用隐私守卫

Flutter笔记 Widgets Easier组件库:使用隐私守卫 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

local dimming(局部调光)介绍

文章目录 1. 什么是local dimming2. 工作原理3. 类型4. 优点5. 缺点和局限7. 技术发展趋势 1. 什么是local dimming local dimming(局部调光)是电视和显示器中用于提升画面对比度和画质的背光技术。其基本原理是将背光源(通常是LED&#xff…

【3dmax笔记】001:3dmax2020下载及安装教程

一、3dmax2020安装教程 1、双击运行exe文件,提取安装程序到指定文件夹; 2、提取完成,安装程序启动,点击安装 3、点击接受许可协议; 4、设置安装位置,点击安装; 5、等待产品安装; 6、…

C++:vector基础讲解

hello,各位小伙伴,本篇文章跟大家一起学习《C:vector基础讲解》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!&#…

【C++】牛客——OR64 求和

✨题目链接: OR64 求和 ✨题目描述 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 ✨输入描述: 每个测试输入包含2个整数,n和m ✨输出描述: 按每个组合的字典序排列…

如何使用 CapSolver 扩展找到 Google reCAPTCHA 站点密钥?

网站安全性在当今至关重要,Google reCAPTCHA 作为防止垃圾邮件和滥用行为的前线防御系统起着关键作用。reCAPTCHA 站点密钥是确保网站交互由人类驱动的唯一标识符。了解如何找到这个密钥对于网站管理员和开发人员来说至关重要。 什么是 reCAPTCHA 站点密钥 reCAPT…

做抖音小店需要清楚的5个核心点!

大家好,我是喷火龙。 不管你是在做抖音小店,还是在做其他的电商平台,如果已经做了一段时间了,但还是没有拿到什么结果,我所指的结果不是什么大结果,而是连温饱都解决不了,甚至说还在亏钱。 有…

翻转列表-力扣

题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: …

鸿蒙开发配置官方地图

一共需要配置 p12 p7b cer csr 四个文件 p12文件配置 注意创建文件名必须是.p12 到AGC创建项目 AppGallery Connect 添加自己的项目名称 我没有开启 暂时不需要 看个人需求 下载刚创建的cer证书 回到我的项目中 点击刚创建的项目 点击这里 四个文件齐全了 "metadata&qu…

【数据结构】哈夫曼树和哈夫曼编码

一、哈夫曼树 1.1 哈夫曼树的概念 给定一个序列,将序列中的所有元素作为叶子节点构建一棵二叉树,并使这棵树的带权路径长度最小,那么我们就得到了一棵哈夫曼树(又称最优二叉树) 接下来是名词解释: 权&a…

吉林大学软件工程易错题

1.【单选题】软件工程方法是( )。 A、为开发软件提供技术上的解决方法 (软件工程方法 ) B、为支持软件开发、维护、管理而研制的计算机程序系统(软件工程工具) …

爬虫实训案例:中国大学排名

近一个月左右的时间学习爬虫,在用所积累的知识爬取了《中国大学排名》这个网站,爬取的内容虽然只是可见的文本,但对于初学者来说是一个很好的练习。在爬取的过程中,通过请求数据、解析内容、提取文本、存储数据等几个重要的内容入…

springboot基于Web前端技术的java养老院管理系统_utbl7

3.普通用户模块包括:普通会员的注册、养老院客房查询、养老院留言查询、预约老人基本信息登记、选择房间、用户缴费的功能。 4.数据信息能够及时进行动态更新,增删,用户搜素方便,使用户可以直接浏览相关信息,要考虑便于…

Unity Render Streaming 云渲染 外网访问

初版: 日期:2024.5.20 前言:临时思路整理,后期会详细补充 环境: 1. 阿里云服务器 需要安装好nodejs 、npm 2. windows电脑,需安装好 nodejs 、npm 3.Unity 2021.3.15f1 4.Unity Render Streaming …

SpringBoot 实现私钥解密 前端的公钥加密内容

目录 一、前端公钥加密 二、后端私钥解密 一、前端公钥加密 Nextjs 前端实现RSA公钥加密 JSEncrypt加载问题解决-CSDN博客 二、后端私钥解密 import javax.crypto.Cipher; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.…

SQLiteOpenHelper数据库帮助器

SQLiteOpenHelper数据库帮助器是Android提供的数据库辅助工具。 1、继承SQLiteOpenHelper类,需要重写onCreate和onUpgrade两个方法 案例:实现增删改查 package com.example.databases_text;import android.app.PictureInPictureParams; import androi…

第九节 设计 Starter 不能忽视的细节

我们要定义一个生产可用的 Starter ,还有几个细节,我们必须要关注。这些细节可以很好的帮助我们写出更优秀的 Starter 一、maven 包依赖 每一个 Starter,可以理解为一个 Jar,这个 Jar 包,如果被其他应用引用&#xf…

go-zero 实战(5)

引入Prometheus 用 Prometheus 监控应用 1. 用 docker 启动 Prometheus 编辑配置位置,我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下 prometheus.yaml global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估…

HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI

🎬️create Component export default struct TitleBar {build(){Row(){Text(transition).fontSize(30fp).fontColor(Color.White)}.width(100%).height(8%).backgroundColor(#4169E1).padding({left:10})}}🎞️interface export interface IList{ti…

大数据学习之安装并配置maven环境

什么是Maven Maven字面意:专家、内行Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。依赖管理:jar之间的依赖关系,jar包管理问题统称为依赖管理项目构建:项目构建不等同于项目创建 项目构建是一…