常见数字调制解调系统matlab误码率仿真,对比BPSK,QPSK,16QAM

目录

1. BPSK (Binary Phase Shift Keying)

2. QPSK (Quadrature Phase Shift Keying)

3. 16QAM (16-ary Quadrature Amplitude Modulation)

4.MATLAB实现

5.仿真对比


        在现代通信系统中,数字调制技术是实现高效、可靠数据传输的关键。几种常见的数字调制方式包括二进制相移键控(BPSK)、四相相移键控(QPSK)以及16进制正交幅度调制(16QAM)。这些调制技术各有特点,适用于不同的应用场景。

1. BPSK (Binary Phase Shift Keying)

       BPSK是一种简单的数字调制技术,它通过改变载波信号的相位来表示两个比特的状态(0和1)。具体来说,当输入比特为0时,载波相位保持不变;当输入比特为1时,载波相位翻转180度。假设输入的数据序列为b(n),其中b(n)∈{0,1}。载波信号可以表示为s(t)=Acos(2πfc​t+ϕ),其中 A 是幅度,fc​ 是载波频率,ϕ 是初始相位。

BPSK优点:简单易实现,抗噪声性能好。缺点:频谱效率较低。

2. QPSK (Quadrature Phase Shift Keying)

       QPSK是一种扩展的BPSK形式,它使用四个相位状态(0, π/2, π, 3π/2)来表示两个比特的信息。每个符号由两个比特组成,因此每秒传输的比特数是BPSK的两倍。

       假设输入的数据流为d(n),每个符号由两个比特组成,即d(n)=[b2n​,b2n+1​],其中bi​∈{0,1}。根据这两个比特的不同组合,可以选择相应的相位θk​ 来调制载波信号s(t)=Acos(2πfc​t+ϕ)。

       调制后的信号可以表示为:

QPSK优点:频谱效率高,抗噪声性能好。缺点:实现复杂度较高。

3. 16QAM (16-ary Quadrature Amplitude Modulation)

       16QAM是一种结合了振幅和相位调制的技术,它使用四个不同的幅度和四个不同的相位来表示四个比特的信息。每个符号由四个比特组成,因此每秒传输的比特数是BPSK的四倍。假设输入的数据流为d(n),每个符号由四个比特组成,即d(n)=[b4n​,b4n+1​,b4n+2​,b4n+3​],其中bi​∈{0,1}。根据这四个比特的不同组合,可以选择相应的幅度 Ax​ 和Ay​ 以及相位θk​ 来调制载波信号 s(t)=Ax​cos(2πfc​t+ϕ)+Ay​sin(2πfc​t+ϕ)。

       调制后的信号可以表示为:

解调过程

16QAM优点:极高的频谱效率,适合高速数据传输。缺点:对信道条件要求高。实现复杂度高。

4.MATLAB实现

% 首先清除所有现有的数据。
clc;  % 清除命令窗口
clear all;  % 清除工作空间
close all;  % 关闭所有其他可操作的窗口

% 生成16 QAM星座图作为复数
b = 4; % 每个符号中的比特数(它是偶数)
M = 2^b; % 星座中的点数 = 2^4 = 16
% 因为我们有一个4×4的星座图,它是对称的,我们可以简单地选择
% 点 -3, -1, 1, 3 。
x1 = -(b-1):2:(b-1); % 由于我们有b个符号,b/2位于0的左侧,b/2位于0的右侧。
constellation = x1 + 1i*x1.';  % 将实部和虚部相加
k = double(1.0)/double(sqrt(10)); % 正规化因子
constellation = k * constellation; % 正规化星座图,使其功率为单位。

% 为非格雷编码在星座图中的映射(二进制到十进制按位置映射)
% 在二进制                          在十进制
% 0011 0111 1011 1111      |    3  7  11  15
% 0010 0110 1010 1110      |    2  6  10  14
% 0001 0101 1001 1101      |    1  5  9   13
% 0000 0100 1000 1100      |    0  4  8   12

% 为格雷编码在星座图中的映射
% 在二进制                          在十进制
% 0010 0110 1110 1010      |    2  6  14  10
% 0011 0111 1111 1011      |    3  7  15  11
% 0001 0101 1101 1001      |    1  5  13  9
% 0000 0100 1100 1000      |    0  4  12  8

% 因此我们使用数组来映射它们
gre = [0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10]; % 用于映射非格雷编码和格雷编码星座点

ninputs = 10000; % 表示用于仿真使用的符号数量。
input = zeros(1, ninputs);
for k = 1:ninputs % 循环生成4比特随机输入
    input(k) = randi([0, (2^4-1)]); % 随机生成一个4比特数,范围从0到15(包括0和15)。
end
binc = constellation(input(:) + 1); % 将具有非格雷编码的星座符号
input_gray = gre(input(:) + 1); % 获取与相同星座输入相对应的格雷编码输入。

snr = 0:1:10; % 改变信噪比从0到10dB。
% 我们假设输入信号是所有输入c中的点。
decisions_bin = zeros(1, ninputs);
number_snrs = length(snr); % 需要检查的信噪比值的数量
Ber1 = zeros(number_snrs, 1); % 估计每个信噪比下的比特误码率,并将其累加到估计中
Ber2 = zeros(number_snrs, 1); % 估计每个信噪比下的比特误码率,并将其累加到估计中

% 仿真的开始。
for k = 1:number_snrs % 信噪比循环
    snr_now = snr(k); % 当前测试的信噪比。
    ebno = 10^(snr_now / 10); % 将信噪比从dB转换为十进制单位。
    sigma = sqrt(1 / ebno); % 对应的噪声方差。
    % 向我们的符号添加2D高斯噪声。
    receivedbin = binc + (sigma * randn(ninputs, 1) + 1i * sigma * randn(ninputs, 1)) / sqrt(10); % 添加复数白高斯噪声到输入信号,并适当缩放。
    decisions = zeros(ninputs, 1); % 初始化决策变量,与所有n个符号对应。
    for n = 1:ninputs
        distancesbin = abs(receivedbin(n) - constellation); % 计算每个信号点与星座图中每个点的距离。
        [min_dist_bin, decisions_bin(n)] = min(distancesbin(:)); % 最小距离的星座点即为信号。
    end
    
    decisions_gray = gre(decisions_bin); % 将解码信号映射回格雷编码输入,以比较格雷编码的错误。
    % decisions_bin是索引值,它们对应于某个
    % decisions_gray值。
    decisions_bin = decisions_bin - 1; % 使其范围从0到15。
    
    % 计算比特误码率
    num = zeros(1, ninputs); % 为了加快代码执行速度
    for s = 1:length(input)
        d_bin = de2bi(decisions_bin(s), 4); % 获取零填充的4比特二进制字符串,便于比较。
        i_bin = de2bi(input(s), 4);  % 获取零填充的4比特二进制字符串,便于比较。
        biterror = 0;   % 计数每个比特的错误
        for t = 1:4
            if d_bin(t) ~= i_bin(t)
                biterror = biterror + 1;  % 添加每个错误决定的比特。
            end
            num(s) = biterror; % 存储每个单词的总比特错误
        end
    end
    error = num; % 获取非格雷编码信号的比特错误数组。
    
    for s = 1:length(input_gray)
        d_bin = de2bi(decisions_gray(s), 4); % 获取零填充的4比特二进制字符串,便于比较。
        i_bin = de2bi(input_gray(s), 4);  % 获取零填充的4比特二进制字符串,便于比较。
        biterror = 0;   % 计数每个比特的错误
        for t = 1:4
            if d_bin(t) ~= i_bin(t)
                biterror = biterror + 1;  % 添加每个错误决定的比特。
            end
            num(s) = biterror; % 存储每个单词的总比特错误
        end
    end
    error_gray = num; % 获取格雷编码信号的比特错误数组。
    
    Ber1(k) = Ber1(k) + sum(error) / ninputs; % 给出比特误码率。
    Ber2(k) = Ber2(k) + sum(error_gray) / ninputs; % 给出比特误码率。
end

% 绘制比特误码率(BER)图。
figure;
semilogy(snr, Ber1); % 绘制信噪比与比特误码率的关系。
hold on; % 在同一图中添加更多数据
semilogy(snr, Ber2); % 绘制信噪比与比特误码率的关系。
hold on;
% 由于对于16 QAM平均邻居数量为3,我们乘以Q函数的3倍
semilogy(snr, 3 * qfunc(sqrt((10.^(snr/10))))); % 使用Q函数绘制理论比特误码率。
legend("实验比特误码率", "实验比特误码率(使用格雷编码)", "使用Q函数的理论值"); % 添加图例
xlabel("信噪比 (dB)"); % 添加信噪比标签到x轴
ylabel("比特误码率 (BER)"); % 添加比特误码率标签到y轴。这是每符号的BER。
title("16 QAM的比特误码率图");



save R_16QAM.mat snr Ber1 Ber2

up4141

5.仿真对比

对比分析

       BPSK、QPSK和16QAM都是常用的数字调制技术,它们各自具有不同的优缺点,适用于不同的应用场景。BPSK简单且抗噪性能好,但频谱效率较低;QPSK提高了频谱效率,同时保持良好的抗噪性能;而16QAM则提供了极高的频谱效率,适合高速数据传输,但对信道条件和实现复杂度有较高要求。选择合适的调制方式需要综合考虑系统的实际需求和技术条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值