目录
注意,以下代码块代码,直接在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)