【MATLAB源码-第213期】基于matlab的16QAM调制解调系统软硬判决对比仿真,输出误码率曲线对比图。

操作环境:

MATLAB 2022a

1、算法描述

一、16QAM调制原理

在16QAM(16 Quadrature Amplitude Modulation)调制中,一个符号表示4个比特的数据。这种调制方式结合了幅度调制和相位调制,能够在相同的频谱资源下传输更多的数据。具体来说,16QAM星座图通常为4x4矩阵,每个信号点的实部和虚部的值分别取自集合{-3, -1, 1, 3},从而形成16个不同的信号点,每个点对应一个唯一的4比特二进制序列。

二、信号的生成与调制

在我们的系统中,首先生成一个长度为100000比特的随机二进制数据序列。然后,这个序列被分割成每组4个比特的数据块,每个数据块将映射到一个16QAM符号。具体的映射方式如下:

  1. 前两个比特决定符号的实部:如果前两个比特是11,则实部为+1;如果是10,则实部为+3;如果是01,则实部为-1;如果是00,则实部为-3。
  2. 后两个比特决定符号的虚部:如果后两个比特是11,则虚部为+1;如果是10,则虚部为+3;如果是01,则虚部为-1;如果是00,则虚部为-3。

通过这种方式,我们可以将二进制数据映射到16QAM符号上。

三、加入噪声

信号在实际传输中会受到噪声的影响。为了模拟这种情况,我们引入了AWGN(加性高斯白噪声)信道。在每个信噪比(SNR)水平下,我们将16QAM符号加上对应的高斯噪声,生成接收的符号。

四、软判决与硬判决

在接收到带有噪声的符号后,需要进行解调,将符号还原成二进制数据。解调方式主要有两种:软判决和硬判决。

软判决

软判决通过计算接收符号与星座图中各个信号点的欧氏距离,选择距离最近的信号点来确定原始数据。具体的步骤如下:

  1. 对于每个接收符号,分别计算其与星座图中所有信号点的距离。
  2. 根据距离选择最接近的信号点。
  3. 根据选择的信号点确定二进制数据。

这种方法利用了信号点之间的距离信息,可以更好地抵抗噪声,通常能获得较低的误码率。

硬判决

硬判决则是根据接收符号的实部和虚部分别进行直接判决,不考虑距离信息。具体的步骤如下:

  1. 对于每个接收符号,直接判断其实部和虚部的值。
  2. 根据实部和虚部的范围,确定对应的二进制数据。例如,实部大于等于0且小于2,则前两个比特为11;实部大于等于2,则前两个比特为10,等等。

这种方法简单直接,但在噪声较大时,误码率可能较高。

五、误码率比较

为了比较软判决和硬判决的性能,我们计算了不同信噪比(SNR)水平下的比特误码率(BER)。具体步骤如下:

  1. 对于每个SNR值,加入对应强度的噪声,生成接收符号。
  2. 分别使用软判决和硬判决进行解调,得到解调后的二进制数据。
  3. 将解调后的数据与原始数据进行比较,计算误码率。

实验结果表明,软判决在各个SNR水平下的误码率均低于硬判决,尤其在较低的SNR下,软判决的优势更加明显。

结论

通过以上描述,我们可以看到,16QAM调制方式通过结合幅度和相位调制,在同样的频谱资源下传输更多的数据。加入噪声后,通过软判决和硬判决两种方式进行解调。软判决利用了符号点之间的距离信息,能够更好地抵抗噪声,通常能获得较低的误码率;而硬判决则简单直接,但在噪声较大时,误码率较高。总体而言,软判决在抗噪声性能上优于硬判决。

2、仿真结果演示

3、关键代码展示

4、MATLAB 源码获取

      V

点击下方名片

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
16QAM调制解调MATLAB代码如下: 调制: ```matlab % 设置参数 M = 16; % 星座点数 fc = 5000; % 载波频率 fs = 100000; % 采样频率 T = 1/fs; % 采样时间间隔 numBits = 1000; % 待调制的比特数 nSamp = 4; % 每个符号的采样数 EbNo = 10; % 信噪比(dB) EsNo = 10*log10(M) + EbNo; % 符号噪声比(dB) sigma = 1/sqrt(2*EsNo); % 噪声标准差 % 生成随机比特流 bitsIn = randi([0 1],1,numBits); % 将比特流分组成符号 M = 16; k = log2(M); symbolsIn = bi2de(reshape(bitsIn,length(bitsIn)/k,k),'left-msb'); % 生成16QAM星座 constellation = qammod(0:M-1,M); % 16QAM调制 txSig = qammod(symbolsIn,M,'gray'); % 将符号映射到星座上 txSigMapped = constellation(txSig+1); % 为星座添加噪声 noise = sigma*randn(size(txSigMapped)); rxSig = txSigMapped + noise; % 绘制星座 scatterplot(constellation); hold on; plot(real(txSigMapped),imag(txSigMapped),'ko'); plot(real(rxSig),imag(rxSig),'r.'); title('16QAM Constellation'); xlabel('In-Phase'); ylabel('Quadrature'); grid on; ``` 解调: ```matlab % 16QAM解调 rxSigMapped = rxSig ./ constellation; % 将解调后的符号映射到星座上 [~,rxSymbols] = min(abs(rxSigMapped.' - constellation),[],2); rxBits = de2bi(rxSymbols-1,k,'left-msb').'; rxBits = rxBits(:).'; % 统计误码率 numErrs = sum(rxBits ~= bitsIn); ber = numErrs / length(bitsIn); % 绘制误码率曲线 EbN0 = 0:2:20; theoryBer = berawgn(EbN0,'qam',M); semilogy(EbN0,theoryBer,'b-','LineWidth',2); hold on; semilogy(EbNo,ber,'ro','LineWidth',2); title('16QAM BER'); xlabel('Eb/No (dB)'); ylabel('Bit Error Rate'); legend('Theory','Simulation'); grid on; % 绘制眼 eyediagram(rxSigMapped,nSamp*2); title('16QAM Eye Diagram'); xlabel('Time'); ylabel('Amplitude'); grid on; ``` 注意,在以上代码中,`qammod`和`qamdemod`函数可以分别用于16QAM调制和解调。眼可以使用`eyediagram`函数来绘制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值