当前位置: 首页 > article >正文

(72)采用格雷(Gray)编码的8-PSK调制解调通信系统的MATLAB仿真

文章目录

  • 前言
  • 一、格雷码
  • 二、仿真说明
  • 三、MATLAB仿真
    • 1. 仿真代码
    • 2. 代码说明
    • 3. 仿真结果
  • 总结


前言

本文给出一个使用通信系统对象的具有Gray编码的8进制相移键控(8-PSK)调制通信系统的MATLAB仿真。最后给出了仿真结果。


一、格雷码

Gray编码是一种多级调制方案经常使用的技术,用于最小化比特错误率。
它包括对调制符号进行排序,使得相邻符号的二进制表示仅相差一个比特。

二、仿真说明

本示例使用8-PSK方法对数据进行调制。数据通过一个加性高斯白噪声(AWGN)通道,并使用8-PSK解调器进行解调。仿真测量了不同Eb/No下的符号和比特错误率。

三、MATLAB仿真

1. 仿真代码

%% 初始化 
M = 8;                    % 调制阶数
SamplesPerFrame = 10000;  % 为流处理循环的每次迭代处理的调制符号数

% 仿真停止条件
maxNumErrs=100;           % 最大比特错误数
maxNumBits=1e8;           % 最大比特数

% 由于AWGN通道以及RANDI函数使用默认的随机数流,执行以下命令以确保结果可重复,即每次运行示例都会获得相同的结果。
s = RandStream.create('mt19937ar', 'seed',529558);
prevStream = RandStream.setGlobalStream(s);
%% 创建一个整数到比特转换器(hInt2Bit)和一个比特到整数转换器(hBit2Int)系统对象。
hInt2Bit = comm.IntegerToBit('BitsPerInteger',log2(M), ...
                             'OutputDataType','uint8');
hBit2Int = comm.BitToInteger('BitsPerInteger',log2(M), ...
                             'OutputDataType','uint8');
%% 创建并配置8PSK调制器和解调器系统对象
% 创建并配置一个PSK调制器(hMod)系统对象,以将二进制输入数据映射到8-PSK gray编码星座。
hMod = comm.PSKModulator('ModulationOrder',M, ...
                         'SymbolMapping','gray', ...
                         'PhaseOffset',0, ...
                         'BitInput',true);
                     
% 创建并配置一个相匹配的PSK解调器(hDemod)系统对象。
hDemod = comm.PSKDemodulator('ModulationOrder',M, ...
                         'SymbolMapping','gray', ...
                         'PhaseOffset',0, ...
                         'BitOutput',true, ...
                         'OutputDataType','uint8', ...
                         'DecisionMethod','Hard decision');
%% 创建AWGN信道系统对象
hChan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
                         'BitsPerSymbol',log2(M), ...
                         'SignalPower',1);

%% 创建一个符号错误率计算器(hSymError)和一个比特错误率计算器(hBitError)系统对象
hSymError = comm.ErrorRate;    % 符号错误率计算器系统对象
hBitError = comm.ErrorRate;    % 比特错误率计算器系统对象
% 错误率计算器系统对象的输出是一个包含三个元素的向量,其中包含计算出的错误率、观察到的错误数量以及处理的数据量。

%% 处理循环 
EbNoVec = 0:2:12;                             % 仿真所用Eb/No值
SERVec = zeros(size(EbNoVec));                % 初始化SER
BERVec = zeros(size(EbNoVec));                % 初始化BER
for p = 1:length(EbNoVec)
  % 复位系统对象
  reset(hSymError);
  reset(hBitError);
  hChan.EbNo = EbNoVec(p);
  % 在当前Eb/No条件下,重置SER和BER
  SER = zeros(3,1);
  BER = zeros(3,1);
  while (BER(2)<maxNumErrs) && (BER(3)<maxNumBits)
    % 生成随机符号
    txSym = randi([0 M-1], SamplesPerFrame, 1, 'uint8');  
    txBits = step(hInt2Bit, txSym);           % 符号转比特
    tx = step(hMod, txBits);                  % 调制
    rx = step(hChan, tx);                     % 叠加高斯白噪声
    rxBits = step(hDemod, rx);                % 解调
    rxSym = step(hBit2Int, rxBits);           % 比特转符号

    % 统计错误率
    SER = step(hSymError, txSym, rxSym);      % 误符号率
    BER = step(hBitError, txBits, rxBits);    % 误比特率
  end
  % 存储SER和BER
  SERVec(p) = SER(1);
  BERVec(p) = BER(1);
end

%% 恢复默认数据流
RandStream.setGlobalStream(prevStream);

%% 绘制仿真的符号错误率和比特错误率,以及理论的误符号率和误比特率性能曲线
% 计算理论错误率
[theorBER, theorSER] = berawgn(EbNoVec, 'psk', M, 'nondiff');

% 画图
figure();
semilogy(EbNoVec,SERVec,'o', ...
         EbNoVec,BERVec,'*', ...
         EbNoVec,theorSER,'-', ...
         EbNoVec,theorBER,'-', ...
         'LineWidth',1);
legend('Symbol error rate', ...
       'Bit error rate', ...
       'Theoretical Symbol error rate', ...
       'Theoretical Bit error rate', ...
       'Location','SouthWest');
xlabel('Eb/No (dB)'); ylabel('Error Probability');
title('Symbol and Bit Error Probability');
grid on;

2. 代码说明

主处理循环执行以下步骤:

(1)生成随机符号。
(2)将符号转比特。
(3)数据使用格雷编码进行8-PSK调制。
(4)将调制信号通过AWGN信道。
(5)8-PSK解调。
(6)比特转符号。
(7)计算比特错误率。 当达到100个错误或者传输了1e8比特时,退出当前信噪比的while循环,继续处理下一信噪比的数据。

3. 仿真结果

在这里插入图片描述

总结

暂无。




http://www.kler.cn/a/410277.html

相关文章:

  • Easyexcel(6-单元格合并)
  • Scala—Collections集合概述
  • ArcGIS应用指南:ArcGIS制作局部放大地图
  • Ray 和 PyTorch
  • Linux的开发工具(三)
  • 短信发送业务
  • Solon 拉取 maven 包很慢或拉不了,怎么办?
  • javaEE初阶——多线程(1)
  • GitLab|应用部署
  • 【强化学习的数学原理】第05课-蒙特卡洛方法-笔记
  • 24 年第十四届APMCM亚太数模竞赛浅析
  • JVM-类文件结构
  • vue 预览pdf 【@sunsetglow/vue-pdf-viewer】开箱即用,无需开发
  • 基于Matlab SIR模型的传染病动态模拟与扩展研究
  • Django 自定义路由转换器
  • 以科学计算为切入点:剖析英伟达服务器过热难题
  • 函数和数组
  • SAP 零售方案 CAR 系统的介绍与研究
  • 2024年11月25日Github流行趋势
  • 李宏毅机器学习课程知识点摘要(1-5集)
  • 深度解析:Nginx模块架构与工作机制的奥秘
  • FPGA经验谈系列文章——9、块储存器的高效使用
  • Enhancing K8s Gateway API with Easegress Without Changing a Single Line of Code
  • 【数据结构】通过对比二叉查找树、平衡二叉树和B树,对MySQL中的B+树讲解
  • 企业OA管理系统:Spring Boot技术架构与应用
  • Spring Boot英语知识网站:开发与优化