matlab常用语法、无线通信建模常用语法、函数

本文详细介绍MATLAB在无线通信领域的应用,包括软件基础操作、常用代码片段、数学及矩阵运算等。涵盖mmWave信道建模、噪声设计、SNR处理及绘图技巧等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一) 软件使用

1、恢复默认窗口布局

主页—布局—默认

2、快捷键

(1)将光标快速移动到代码最上端

Ctrl + Home

(2)将光标快速移动到代码最底部

Ctrl + End

(二)常用代码

1、常用语句

1、开头必备代码

clear all     % 清除工作区缓存数据  
clc
rng(2)   % 固定随机值

2、Hybrid mmWave信道建模常用参数,导频,噪声的生成

注:(1)(2)(3)(4)例程出自IEEE的论文“ 论文网址Channel Estimation for Reconfigurable Intelligent Surface Aided Multi-User mmWave MIMO Systems”

(1) 复路径增益服从高斯分布
alpha_l = sqrt(0.5)*(normrnd(0,1,1,1) + 1j*normrnd(0,1,1,1));%均值为0,方差为1,维度是1*1

在这里插入图片描述

(2) 信道噪声设计
U=sqrt(0.5)*(normrnd(0,1,N,M) + 1j*normrnd(0,1,N,M));%均值为0,方差为1,维度是N*M

在这里插入图片描述
在这里插入图片描述

(3) 关于SNR的使用

我们的目的是从接收信号中恢复信道矩阵,所以必须先消掉发射信号导频s,这篇文章PT设置的是10dBw。
在这里插入图片描述

(4) 生成正交导频序列
Userpilot=dftmtx(System.K);  % The pilot sequence of all users,文中设置时隙个数等于用户数量

在这里插入图片描述

(5) 产生服从单位圆的预编码和解码矩阵

例程论文链接为例程论文
论文对应代码为论文对应github代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Q=exp(1j*2*pi*rand(M1,N1))/sqrt(N1);  %M1是解码向量的个数每一行的norm(Q(1,:),'fro') = 1
P=exp(1j*2*pi*rand(M2,N2))/sqrt(N2);
(6) 生成服从单位圆的预编码和解码矩阵
F=exp(1j*2*pi*rand(Ns,M))/sqrt(M);
E=exp(1j*2*pi*rand(Ns,P))/sqrt(P);

3、保存和调用变量

(1) 保存变量

Q_sample是定义的矩阵,Q是给它取的名字

clear all
clc
N1 = 128;  %基站天线数量
M1 =  128;  %RIS元件数量
save M M1
save N N1
(2)调用变量

变量名字和保存的时候一样

load M M1
M = M1;
load N N1
N = N1;

2、常用函数

1、dBm和dBw换算成w的函数
function  dBm_W = dBm_W(dbm,Pt)    
    dBm_W = 10^(dbm/10)/1000;  % dbm换算成w的单位
end
function  dBw_W = dBw_W(dbw)    
    dBw_W = 10^(dbw/10);  % dbw换算成w的单位
end
2、khatri_rao积函数
function   kr=khatri_rao(F,G)
    nR_F=size(F,1);        %F的行数
    nR_G=size(G,1);      %G的行数
    mul=ones(nR_G,1);
    FF=kron(F,mul);     %通过kron函数实现对F矩阵的扩充,得到FF矩阵
    GG=repmat(G,nR_F,1);%通过repmat函数实现对G矩阵的扩充,得到GG矩阵
    kr=FF.*GG;
end
3、大尺度衰落系数函数
function  alpha_ss = large_scale(d_br,path_loss_br)    
    % 路径增益 大尺度衰落
    % d_br BS-RIS的距离
    % path_loss_bu = 3;  % BS-User 路径损耗指数,正数
    % pathloss_ref = 30; % 单位是dB,,,,, 正数,,,,,  the pathloss at the distance of 1 meter,
    alpha_ss = 10^(-pathloss_ref/10)*d_br^(-path_loss); % BS-RIS 路径增益
end
3、steer vector导航向量函数
function  u_sv = steer_vector(theta,N)
% theta的取值范围是[-pi/2,-pi/2]
% 导航向量的维度是   N*1  的列向量
for j = 1:N
    u_sv(j,1) = exp(-1i*pi*(j-1)*sin(theta)); %BS-RIS接收端得导航向量,列向量
end
end

3、画图

1、基本的画图代码

clear all
clc
f2=figure(2);  %给每一幅图命名,不命名的话如果运行多幅图就共用一个窗口,会覆盖,命名之后产生新的窗口
plot(t,t-1,'-o','linewidth',1)%1
hold on;
plot(t,SNR11_db,'g','linewidth',1)%2
hold on;
plot(t,SNR_ran11_db,'--b','linewidth',1)%3
hold on;
plot(t,SNR_with1,'-.^r','linewidth',1)%4
hold on;
plot(t,SNR_with2,'-.vc','linewidth',1)%5
hold on;
plot(t,t,'s:k')%6
grid on;
xlabel('Number of transmitting antennas','FontSize',14, 'FontName', 'Times New Roman');   %横坐轴标签,可以调整大小
ylabel('Receive Sum_Rate (dB)','FontSize',14, 'FontName', 'Times New Roman');  %纵坐轴标签
legend('L-RES','ITER-DIS','LS');    %根据plot的先后顺序,命名每一条线
hold off;
(1) plot 的颜色以及线型 (顺序是线形,颜色,标记类型)

在这里插入图片描述

(2) plot 的标记类型定义符

在这里插入图片描述

2、自定义的RGB画图代码

注:色卡网址色卡

(1) 一个X轴对应一个Y轴
clear all
clc
f9 = figure(9); % 命名窗口
LW = 1.5; % 线的粗细 
MS = 6; % 图线上符号的大小
FS = 12;  % x轴y轴符号的大小(是标在刻度上的符号)

% 示例数据
x = [40,50,60,70,80];  % x轴数据
y_left_1 = [1,2,3,4,5];  % 以左边y轴为y轴的第1条线
y_left_2 = [5,4,3,2,1];  % 以左边y轴为y轴的第2条线
y_left_3 = [5,6,7,8,9];  % 以左边y轴为y轴的第3条线

% 左边坐标轴画图
plot(x,y_left_1,'s-.','color',rgb('light blue'),'LineWidth',LW,'MarkerSize',MS) 
hold on;
plot(x,y_left_3,'o--','color',rgb('lightish blue'),'LineWidth',LW,'MarkerSize',MS)  
hold on;
plot(x,y_left_2,'x:','color',rgb('blue'),'LineWidth',LW,'MarkerSize',MS,'MarkerFaceColor',rgb('baby blue'))
ylabel('Sum-Rate bits/s/Hz','FontSize',14, 'FontName', 'Times New Roman');      % 左侧纵坐标标签
ylim([0, 10]);    % 设置左侧纵坐标范围

% 添加通用的横坐标标签和标题
xlabel('title of x','FontSize',14, 'FontName', 'Times New Roman');   % 横坐轴标签,可以调整大小,字号,字体
legend('Y_left_1','Y_left_2', 'Y_left_3', 'Location', 'best'); % 添加图例
set(gca,'linewidth',1.5);  % 网格线的粗细

grid on; % 添加网格
ax = gca; % 获取当前坐标轴
% ax.XColor = 'black'; % 设置x轴颜色,不设置的话根据画出线的颜色自动设定
% ax.YColor = 'black'; % 设置y轴颜色,不设置的话根据画出线的颜色自动设定
ax.GridColor = 'black'; % 设置网格线的颜色
(2) 两个Y轴共用一个X轴
clear all
clc
f8 = figure(8); % 命名窗口
LW = 1.5; % 线的粗细 
MS = 6; % 图线上符号的大小
FS = 12;  % x轴y轴符号的大小(是标在刻度上的符号)

% 示例数据
x = [40,50,60,70,80];  % x轴数据
y_left_1 = [1,2,3,4,5];  % 以左边y轴为y轴的第1条线
y_left_2 = [5,4,3,2,1];  % 以左边y轴为y轴的第2条线
y_left_3 = [5,6,7,8,9];  % 以左边y轴为y轴的第3条线

y_right_1 = [3,4,5,6,7];  % 以右边y轴为y轴的第1条线
y_right_2 = [5,5.6,6,7,8];  % 以右边y轴为y轴的第2条线
y_right_3 = [7,8,9,10,11];  % 以右边y轴为y轴的第3条线

% 左边坐标轴画图
yyaxis left
plot(x,y_left_1,'s-.','color',rgb('light blue'),'LineWidth',LW,'MarkerSize',MS) 
hold on;
plot(x,y_left_3,'o--','color',rgb('lightish blue'),'LineWidth',LW,'MarkerSize',MS)  
hold on;
plot(x,y_left_2,'x:','color',rgb('blue'),'LineWidth',LW,'MarkerSize',MS,'MarkerFaceColor',rgb('baby blue'))
ylabel('Sum-Rate bits/s/Hz','FontSize',14, 'FontName', 'Times New Roman');      % 左侧纵坐标标签
ylim([0, 10]);    % 设置左侧纵坐标范围


% 右边的能效图
yyaxis right
plot(x,y_right_1,'s-.','color',rgb('light red'),'LineWidth',LW,'MarkerSize',MS) 
hold on;
plot(x,y_right_3,'o--','color',rgb('pale red'),'LineWidth',LW,'MarkerSize',MS)  
hold on;
plot(x,y_right_2,'x:','color',rgb('red'),'LineWidth',LW,'MarkerSize',MS,'MarkerFaceColor',rgb('baby blue'))
ylabel('Energy Efficiency (EE)','FontSize',14, 'FontName', 'Times New Roman');        % 右侧纵坐标标签
ylim([1, 11]);                   % 设置右侧纵坐标范围


% 添加通用的横坐标标签和标题
xlabel('title of x','FontSize',14, 'FontName', 'Times New Roman');   % 横坐轴标签,可以调整大小,字号,字体
legend('Y_left_1','Y_left_2', 'Y_left_3','Y_right_1','Y_right_1', 'Y_right_1', 'Location', 'best'); % 添加图例
set(gca,'linewidth',1.5);  % 网格线的粗细

grid on; % 添加网格
ax = gca; % 获取当前坐标轴
% ax.XColor = 'black'; % 设置x轴颜色,不设置的话根据画出线的颜色自动设定
% ax.YColor = 'black'; % 设置y轴颜色,不设置的话根据画出线的颜色自动设定
ax.GridColor = 'black'; % 设置网格线的颜色

(三)基本运算符号和函数

1、基本数学符号

(1) 对数 log2(16); (2为底数也可以换成10,或者需要的数字)
(2) 根号 sqrt(9);
(3) 除法 1/2=0.5 1\2=2
(4) 取余 mod(10,3) (10除3的余数)
(5) 平方 a^2 (a)的平方

2、复数运算和取值

(1) 取复数实部和虚部 S = real(z); C = imag(z);
(2) 求复数的角度
      ` b_1 = angle(b);`     (b为弧度)
      `b_2 = angle(b)*180/pi; `     (b为角度)    

3、一些特殊值

(1) π pi
(2) 取光速
c1 = physconst('lightspeed');

4、常用函数

(1) e 指数函数 exp() (括号存放e的指数)
 ``exp(1i*2*pi)``   (不要用exp(1*i*2*pi),如果一旦加乘号,那么程序里面一旦有已经赋值的i,计算的时候会直接把i的值代入。)

5、基本关系符

(1) 不等于 ~=

(四)矩阵及其运算

1、特殊矩阵

(1) 零矩阵 A=zeros(m,n);
(2) 全1矩阵 A=ones(m,n);
(3) 产生m*n矩阵,这个矩阵的元素都是处于imin和imax之间的整数
p = randi([imin,imax],[m n]);
(4) 返回一个主对角线元素为 1 且其他位置元素为 0 的 n×m 矩阵,即单位阵 I = eye(n,m)
(5) 对角矩阵,关于diag的使用
d = [1,0,0;0,5,0;0,0,9];
d1 = diag(d);        %%d1 =[1;5;9]   d1是列向量
d2 = diag(d1);       %%d2 = [1,0,0;0,5,0;0,0,9]

2、矩阵基本数学运算

(1) 转置 A = B.’
(2) 共轭转置 A = B’
(3) 按元素相除 ./
(4) 按元素相乘: .*
(5) 共轭 conj(A)
(6) 数组求和
   `  S = sum(A,"all")  `    数组所有元素求和
   `  sum(A,2)  `     返回包含每一行总和的列向量。
(7) Kronecker product
K = kron(A,B);

2、矩阵基本操作,行列式

(1) 从矩阵取某几行某几列元素
 `a(1:2,3);`  获取矩阵第三列第一行和第二行的元素
 `a([1 3],3) ;`   获取矩阵第三列第一行和第三行的元素
 `a(2:end,3) ;`   获取矩阵第三列第一行和第三行的元素
 `a= A(:,[1 3]) ;`  取矩阵的第一列和第三列
(2) 从0到10,每隔2数取一个值
   ` A = [0:2:10];` 
(3) 求一维矩阵长度
A = [1, 2, 3, 4, 5];
len = length(A);  % 返回数组A的长度,即5
(4) 对矩阵元素进行升序或者降序排序
  ` [c index] = sort(A,'descend'); `  降序       `[c index] = sort(A,'ascend');`   升序
(5) 返回矩阵的元素最大值 M = max(A)
     如果 A 是向量,则 max(A) 返回 A 的最大值。
     如果 A 为矩阵,则 max(A) 是包含每一列的最大值的行向量。  
(6) 矩阵元素的排列组合

从1-5里面选3个数的所有可能组合,每个组合数字不重复 nchoosek([1:5],3);
向量内所有元素可能得排列方式 a1 = perms(a);

(7) 重复拼接矩阵

在这里插入图片描述

3、行列式运算

(1) 生成特征值和特征向量 [V D] = eig(A);
   D是由特征值组成的对角阵,V的每一列是A的一个特征向量
(2) 对矩阵A求逆 Y = inv(A);
(3) 矩阵的迹 trace(A) 主对角线元素之和
(4) 矩阵的逆矩阵 inv(A) A必须是方阵
4、关于矩阵范数
(1) 矩阵列范数 norm(a,1) % (每列的所有元素绝对值之和的最大值)
(2) 矩阵行范数 norm(a,inf); % (每行的所有元素绝对值之和的最大值)
(3) 矩阵的二范数也叫矩阵的欧几里得范数(A的转置乘以A矩阵的结果的特征根最大值的开根号)

b = norm(a); b1 = norm(a,2);

(4) 矩阵的Frobenius范数 norm(a,'fro'); % (矩阵元素绝对值平方的和的平方根)
5、关于张量分解的仿真
(1)、自己写的函数和tensor工具中自带的函数结果是一样的
clc;
clear;
A = [3+2i,2+1i,-2+2i,1+5i;   1+2i,3+1i,-3+2i,2+5i;   3+5i,1+3i,1+2i,-4+1i];
B = [1+2i,2+2i,-1+5i,-2+5i;  1+2i,-2+3i,1+2i,2+3i;];
C = [2+1i,3+2i,-2+3i,-2+6i;  -1+2i,-1+3i,3+2i,-2+3i;];
alpha = [2+6i; 1 + 3i; -9+5i; 2+1i];
ceshi = khatri_rao(khatri_rao(A,B),C);  %在函数章节自己写的函数
ceshi1 = khatrirao(A,B,C);   %tensor工具自带的函数
ceshi - ceshi1
(2)、A ⊕ \oplus B ≠ \ne = B ⊕ \oplus A
clc;
clear;
A = [3+2i,2+1i,-2+2i,1+5i;   1+2i,3+1i,-3+2i,2+5i;   3+5i,1+3i,1+2i,-4+1i];
B = [1+2i,2+2i,-1+5i,-2+5i;  1+2i,-2+3i,1+2i,2+3i;];
ceshi1 = khatrirao(A,B);   %tensor工具自带的函数
ceshi2 = khatrirao(B,A);   %tensor工具自带的函数
ceshi1 - ceshi2
(3)、A ⊕ \oplus B就等于A和B的第一列的kron积
ceshi1 = khatrirao(A,B);   %tensor工具自带的函数
ceshi2 = kron(A(:,1),B(:,1));   %tensor工具自带的函数
ceshi1(:,1) - ceshi2
(4)、关于ktensor(alpha,A,B,C)的用法

注释:alpha是每列的权重,必须放在第一个,ABC的列数相同

clc; clear;
alpha = [2+6i; 1+3i; -9+5i; 2+1i];
A = [3+2i,  2+1i,  -2+2i,  1+5i;   
     1+2i,  3+1i,  -3+2i,  2+5i;   
     3+5i,  1+3i,  1+2i,   -4+1i];
B = [1+2i,  2+2i,  -1+5i,  -2+5i;  
     1+2i,  -2+3i, 1+2i,   2+3i;];
C = [2+1i,  3+2i,  -2+3i, -2+6i;  
    -1+2i, -1+3i,  3+2i,  -2+3i;];
ceshi1_tem = ktensor(alpha,A,B,C);  %tensor工具自带的函数

在这里插入图片描述

(5)tensor的用法
clc; clear;
alpha = [2+6i; 1+3i; -9+5i; 2+1i];
A = [3+2i,  2+1i,  -2+2i,  1+5i;   
     1+2i,  3+1i,  -3+2i,  2+5i;   
     3+5i,  1+3i,  1+2i,   -4+1i];
B = [1+2i,  2+2i,  -1+5i,  -2+5i;  
     1+2i,  -2+3i, 1+2i,   2+3i;];
C = [2+1i,  3+2i,  -2+3i, -2+6i;  
    -1+2i, -1+3i,  3+2i,  -2+3i;];
ceshi1_tem = ktensor(alpha,A,B,C);  
ceshi1=tensor(ceshi1_tem);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值