Matlab 信号处理常用方法记录(星座图/EVM计算) 持续更新

目录

1.Matlab星座图绘制

2.EVM计算


注意,以下代码块代码,直接在matlab控制台输入后,按回车即可

1.Matlab星座图绘制

官方demo如下:

% 官方demo
web(fullfile(docroot, 'comm/ref/comm.constellationdiagram-system-object.html'))

自己常用的16QAM代码:

1.创建参考星座图
2.1.创建星座图显示'对象'(这个对象可能刚接触matlab觉得不适应,但其实就是类似java或者C++面向对象) 中的一个对象,利用这个对象的方法,可以简化代码
2.2.可以通过X,Y调整参考星座图坐标
3. 创建模拟数据
4. 创建通过的信道
5. 利用星座图显示对象,显示经过信道后的信号


% 1.创建参考星座图
M = 16;
refC = qammod(0:M-1,M,'UnitAveragePower',true,'PlotConstellation',true);


% 2.1创建星座图显示'对象'(这个对象可能新接触matlab觉得不适应,但其实就是java或者C++面向对象)
% 中的一个对象,利用这个对象的方法,可以简化代码

% 2.2 可以通过X,Y调整参考星座图坐标
constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refC, ...
    'XLimits',[-1 1],'YLimits',[-1 1]);

% 3.创建模拟数据
data = randi([0 M-1],1000,1);
sym = qammod(data,M,'UnitAveragePower',true);
% 4.创建通过的信道
rcv = awgn(sym,15);

% 5.利用星座图显示对象,显示经过信道后的信号
constDiagram(rcv)

qammod和demod中,这两个参数比较有用。这是让星座图上的复数点归一化。
'UnitAveragePower',true,'PlotConstellation',true

自己常用的代码块:

M = 16;
refC = qammod(0:M-1,M,'UnitAveragePower',true,'PlotConstellation',true);
constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refC, ...
    'XLimits',[-1 1],'YLimits',[-1 1]);
...
...
...
...

constDiagram('your signal after transmission')

如果Rxsignal的功率太小或者太大,也会导致EVM或者星座图画出来很奇怪。可以进行归一化。

% 设置 QAM 调制阶数为 16
M = 16;
% 设置单个OFDM符号的子载波个数为 64
nfft = 64;
% 设置循环前缀长度为 16
cplen = 16;
% 设置符号数为 100
nSym = 100;
% 生成随机的输入数据符号,范围是 0 到 M-1,大小为 nfft×nSym
dataSym = randi([0 M-1],nfft,nSym);
% 对输入数据进行 QAM 调制,设置平均功率为单位 1
qamSig = qammod(dataSym,M,UnitAveragePower=true);
% 对 QAM 调制后的信号进行 OFDM 调制
ofdmTxSig = ofdmmod(qamSig,nfft,cplen);

% Channel : MISO LOS only awgn affect signal 
% 设置信噪比为 40
SNR = 40;
% 在 OFDM 发送信号上添加高斯白噪声,模拟经过信道后的接收信号
receiveAfterCh = awgn(ofdmTxSig,SNR);

% demode OFDM and QAM
% 对接收信号进行 OFDM 解调,然后再进行 QAM 解调
rxQAMSig = ofdmdemod(receiveAfterCh,nfft,cplen);

% plot constellation
% 生成参考信号用于星座图绘制,不进行星座图绘制,设置平均功率为单位 1
refC = qammod(0:M-1,M,'PlotConstellation',false,UnitAveragePower=true);

% measure EVM
% 创建用于测量误差向量幅度(EVM)的对象
evm = comm.EVM;

% make the constellation and EVM measure under the value 1
% key of this code wanna to presentation
% 将解调后的信号进行幅度归一化,使其幅度在 1 以内
normalizedSignal = rxQAMSig(:)/max(abs(rxQAMSig(:)));

% measure EVM
% 测量发送信号和接收解调后的信号之间的误差向量幅度(EVM)
rmsEVM = evm(qamSig,rxQAMSig);
% 设置绘制点的颜色
color = [216/255, 83/255, 25/255];

% 创建图形窗口 2
figure(2);
% 绘制归一化后的信号星座图,使用指定颜色和点大小
scatter(real(normalizedSignal(:)),imag(normalizedSignal(:)),[],color,'filled','SizeData',5);
% 设置图形标题为 EVM 的值
title("EVM="+rmsEVM(1)+"%");

% scatterplot(normalizedSignal);
% 显示图形边框
box on
% 设置坐标轴线条宽度为 1,删除当前坐标轴标题,设置 x 和 y 轴的范围
% set(gca,'linewidth',1);delete(get(gca,'title'));xlim([-2.1 2.1]);ylim([-2.1 2.1]);  
% 设置坐标轴线条宽度为 1,删除当前坐标轴标题,设置 x 和 y 轴的范围
% set(gca,'linewidth',1);delete(get(gca,'title'));xlim([-1.1 1.1]);ylim([-1.1 1.1]);
% 采用相对值设置图形的纸张单位并设置图形位置
set(gcf,'PaperUnits','normalized','Position',[300 500 250 250])
% 去掉坐标值
% % set(gca,'xticklabel','','yticklabel','','zticklabel',''); 

2.EVM计算

web(fullfile(docroot, 'comm/ref/comm.evm-system-object.html'))

常用的代码块:

1.利用发送信号接收信号计算EVM

2.利用参考星座图计算

d = randi([0 7],2000,1);
txSig = pskmod(d,8,pi/8);  %发送信号

rxSig = awgn(txSig,30); %经过高斯白噪声信道后的 接收信号

evm = comm.EVM; %创建evm对象 

% 1.通过收发信号计算EVM
rmsEVM1 = evm(txSig,rxSig);  %通过evm对象计算 均方根误差EVM
  

release(evm)

% 2. 通过参考星座图计算EVM
evm.ReferenceSignalSource = "Estimated from reference constellation";
evm.ReferenceConstellation = pskmod(0:7,8,pi/8);

rmsEVM2 = evm(rxSig);
isequal(rmsEVM1,rmsEVM2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值