(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. 仿真结果
总结
暂无。