(6)MATLAB加性高斯白噪声信道QPSK通信系统仿真


前言

本例对QPSK通信系统进行建模仿真,使用awgn信道,通过设置不同的SNR得到误码率和误比特率性能曲线。

由于QPSK通信系统属于数字通信系统,所以噪声功率一般使用Eb/No进行衡量,但awgn函数只能使用SNR设置噪声功率,所以仿真中需要将将Eb/No转换成了SNR。

最后给出了仿真性能和理论性能曲线的对比。


一、仿真代码

代码如下:

clc
close all
clear all

%% 初始化
M = 4;                    % 调制阶数,QPSK调制阶数=4
k = log2(M);              % 每个QPSK符号包含的比特数,也称调制率
SamplesPerFrame = 10000;  % 每次迭代处理的符号数

% 仿真停止条件
maxNumErrs = 100;
maxNumBits = 1e8;

graycode = [0 1 3 2];      % Gray编码映射关系

% 为了使仿真结果具有可重复性,设置随机数
s = RandStream.create('mt19937ar', 'seed',26854);
prevStream = RandStream.setGlobalStream(s);

%% 仿真循环
EbNodBVec = 0:2:12;                             % Eb/No ,单位dB
SERVec = zeros(size(EbNodBVec));                % 初始化误码率SER向量,向量中的每个值对应一个EbNo
BERVec = zeros(size(EbNodBVec));                % 初始化误比特率BER向量,向量中的每个值对应一个EbNo

for p = 1:length(EbNodBVec)
    awgnChannel.EbNo = EbNodBVec(p);
    snr = EbNodBVec(p) + 10*log10(k);
    
    % 清零SER / BER,用于当前Eb/No值
    SER = zeros(3,1);                           % Symbol Error Rate 三个值分别为:错误率,错误数,总数
    BER = zeros(3,1);                           % Bit Error Rate

    bit_err = 0;
    bit_num = 0;
    sym_err = 0;
    sym_num = 0;
    while (bit_err<maxNumErrs) && (bit_num<maxNumBits)
        % 生成随机符号
        dataIn = randi([0 3],SamplesPerFrame,1);

        dataIngray = graycode(dataIn+1)';                 %进行Gray编码影射

        % QPSK调制
        txSig = pskmod(dataIngray,4,0);
        % txSig = pskmod(dataIngray,4,0,'gray');           % 这行代码与上面两行等效


        % 调制信号经过awgn信道(加高斯白噪声)
        rxSig = awgn(txSig,snr,'measured');


        % 对接收信号进行解调
        dataOutgray = pskdemod(rxSig,4,0);                 % QPSK解调
        dataOut = graycode(dataOutgray+1)';                % 进行Gray解码影射
        % dataOut = pskdemod(rxSig,4,0, 'gray');           % 这行代码与上面两行等效

        % 统计错误比特数
        [number, BER_w] = biterr(dataIn, dataOut, log2(M)); % 计算BER
        bit_err = bit_err + number;
        bit_num = bit_num + SamplesPerFrame*k;

        % 统计错误符号数
        [nSymbol, SER_w] = symerr(dataIn, dataOut);          % 计算SER
        sym_err = sym_err + nSymbol;
        sym_num = sym_num + SamplesPerFrame;
    end
    
    % 保存历史SER和BER
    SERVec(p) = sym_err / sym_num;
    BERVec(p) = bit_err / bit_num;

end

%% Cleanup
% 恢复默认流
RandStream.setGlobalStream(prevStream);
%% 误码率和误比特率的理论值
theorBER = berawgn(EbNodBVec,'psk',M,'nondiff');
theorSER = 2 .* theorBER;                      % 基于Gray码

%% 结果画图
figure();
semilogy(EbNodBVec,SERVec,'o',    EbNodBVec,BERVec,'*', ...
         EbNodBVec,theorSER,'b-', EbNodBVec,theorBER,'r-');
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('QPSK:误码率和误比特率');
grid on;

二、Eb/N0和SNR关系

MATLAB中EsN0、EbN0与SNR的关系

SNR和 Eb/N0分别应用在什么场合

三、仿真结果

QPSK性能仿真曲线如下:
在这里插入图片描述


后续

关于QPSK的理论BER和理论SER的实现,将在下一篇文章中给出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值