16QAM调制与解调-MATLAB基带仿真
16QAM调制与解调-MATLAB基带仿真
---------------------------- 2020.05.14更新:----------------------------------
有几位小伙伴在评论区与私信想要高维M-QAM的代码,更新文章供大家参考:
高维M-QAM调制与解调-MATLAB基带仿真
仿真步骤
- 产生一定长度的值为0或1的随机序列 s ( t ) s(t) s(t)。
- 将 s ( t ) s(t) s(t)映射到16QAM星座图上的星座点。
- 产生高斯白噪声,将调制后的信号通过AWGN信道,得到输出信号 r ( t ) r(t) r(t)。
- 利用最小距离判决准则实现检测,统计误比特数。
- 绘制仿真误符号率与理论误符号率曲线,进行对比分析。
16QAM发送端星座图:
注意:
在仿真中,需要考虑发送信号能量的归一化。
这里提供一种思路
EbN0_dB = 0:14; % Eb/N0 dB形式
EbN0 = 10.^(EbN0_dB/10); % 每比特能量/噪声
EsN0 = log2(M) * EbN0; % 每符号能量/噪声
send_set = [-3+3j,-1+3j,1+3j,3+3j,...-3+1j,-1+1j,1+1j,3+1j,...-3-1j,-1-1j,1-1j,3-1j,...-3-3j,-1-3j,1-3j,3-3j]; % 发射端星座点
Es_avg = sum(abs(send_set).^2) / length(send_set);
N0 = Es_avg ./ EsN0;
也就是这里面的Es_avg,计算了发送信号的平均能量。
16QAM相干解调:
最小距离判决准则:
s ^ ( t ) = arg min 1 ≤ m ≤ M ∥ r ( t ) − s m ( t ) ∥ 2 2 \hat{s}(t)=\underset{1 \leq m \leq M}{\arg \min}{\|r(t)-s_m(t)\|_2^{2}} s^(t)=1≤m≤Margmin∥r(t)−sm(t)∥22
理论误符号率:
P e = 3 Q ( 4 5 E b N 0 ) [ 1 − 3 4 Q ( 4 5 E b N 0 ) ] P_e=3 Q(\sqrt{\frac{4}{5} \frac{\mathcal{E}_{\mathrm{b}}}{N_{0}}})\left[1-\frac{3}{4} Q(\sqrt{\frac{4}{5} \frac{\mathcal{E}_{\mathrm{b}}}{N_{0}}})\right] Pe=3Q(54N0Eb )[1−43Q(54N0Eb )]
仿真结果:
MATLAB基带仿真程序:
clc
clear
close all
% Title: 16QAM调制与解调 %
% Data: 2020.01.22 %
% Author: K.X.Song %
M = 16; % 调制阶数
L_data = 1000000; % 数据长度
L_symbol = L_data/log2(M); % 符号长度
data = round(rand(1,L_data)); % 原始数据
EbN0_dB = 0:14; % Eb/N0 dB形式
EbN0 = 10.^(EbN0_dB/10); % 每比特能量/噪声
EsN0 = log2(M) * EbN0; % 每符号能量/噪声
error = zeros(1,length(EbN0_dB)); % 预置错误符号个数
ser = zeros(1,length(EbN0_dB)); % 预置仿真误符号率
tser_BPSK = zeros(1,length(EbN0_dB)); % 预置BPSK理论误符号率
tser_QPSK = zeros(1,length(EbN0_dB)); % 预置QPSK理论误符号率
tser_16QAM = zeros(1,length(EbN0_dB)); % 预置16QAM理论误符号率
% 16QAM调制
send = zeros(1,L_symbol); % 预设发送信号
send_set = [-3+3j,-1+3j,1+3j,3+3j,...-3+1j,-1+1j,1+1j,3+1j,...-3-1j,-1-1j,1-1j,3-1j,...-3-3j,-1-3j,1-3j,3-3j]; % 发射端星座点
Es_avg = sum(abs(send_set).^2) / length(send_set);
N0 = Es_avg ./ EsN0;
for q = 1:L_symbolif (data(4*q-3:4*q) == [1,0,1,1])send(q) = send_set(1); % 1001 => -3+3jelseif (data(4*q-3:4*q) == [1,0,0,1])send(q) = send_set(2); % 1001 => -1+3jelseif (data(4*q-3:4*q) == [1,1,1,0])send(q) = send_set(3); % 1110 => +1+3jelseif (data(4*q-3:4*q) == [1,1,1,1])send(q) = send_set(4); % 1111 => +3+3jelseif (data(4*q-3:4*q) == [1,0,1,0])send(q) = send_set(5); % 1010 => -3+1jelseif (data(4*q-3:4*q) == [1,0,0,0])send(q) = send_set(6); % 1000 => -1+1jelseif (data(4*q-3:4*q) == [1,1,0,0])send(q) = send_set(7); % 1100 => +1+1jelseif (data(4*q-3:4*q) == [1,1,0,1])send(q) = send_set(8); % 1101 => +3+1jelseif (data(4*q-3:4*q) == [0,0,0,1])send(q) = send_set(9); % 0001 => -3-1jelseif (data(4*q-3:4*q) == [0,0,0,0])send(q) = send_set(10); % 0000 => -1-1jelseif (data(4*q-3:4*q) == [0,1,0,0])send(q) = send_set(11); % 0100 => +1-1jelseif (data(4*q-3:4*q) == [0,1,1,0])send(q) = send_set(12); % 0110 => +3-1jelseif (data(4*q-3:4*q) == [0,0,1,1])send(q) = send_set(13); % 0011 => -3-3jelseif (data(4*q-3:4*q) == [0,0,1,0])send(q) = send_set(14); % 0010 => -1-3jelseif (data(4*q-3:4*q) == [0,1,0,1])send(q) = send_set(15); % 0101 => +1-3jelsesend(q) = send_set(16); % 0111 => +3-3jend
end
for q = 1:length(EbN0_dB)noise = sqrt(N0(q)/2)*randn(1,L_symbol) + 1j*sqrt(N0(q)/2)*randn(1,L_symbol); % AWGNreceive = (send + noise); % 接收信号detect = zeros(1,L_symbol); % 预置检测信号distance = zeros(1,M); % 解调:距离检测 for t = 1:L_symbolfor w = 1:Mdistance(w) = norm(receive(t) - send_set(w))^2; % 接收信号到所有星座点的距离endpos = find(distance == min(distance)); % 最小距离星座点的位置detect(t) = send_set(pos); % 解调后的符号if (detect(t) ~= send(t)) error(q) = error(q) + 1; % 统计错误符号数endendser(q) = error(q)/L_symbol; % 16QAM仿真误符号率tser_BPSK(q) = qfunc(sqrt(2*EbN0(q))); % BPSK理论误比特率tser_QPSK(q) = 2*qfunc(sqrt(2*EbN0(q)))*(1-qfunc(sqrt(2*EbN0(q)))/2); % QPSK理论误符号率tser_16QAM(q) = 3*qfunc(sqrt(4/5*EbN0(q)))*(1-3/4*qfunc(sqrt(4/5*EbN0(q)))); % 16QAM理论误符号率
end
figure
semilogy(EbN0_dB,ser,'o',EbN0_dB,tser_BPSK,'k',EbN0_dB,tser_QPSK,'r',EbN0_dB,tser_16QAM,'b'); % 画图
grid on; % 坐标轴开启
axis([0 14 10^-5 10^-1]) % 限制作图范围
xlabel('Eb/N0 (dB)'); % 横坐标
ylabel('SER'); % 纵坐标
legend('16QAM仿真误符号率','BPSK理论误符号率','QPSK理论误符号率','16QAM理论误符号率'); % 图例
16QAM调制与解调-MATLAB基带仿真相关推荐
- QPSK调制与解调-MATLAB基带仿真
QPSK调制与解调-MATLAB基带仿真 仿真步骤 产生一定长度的值为0或1的随机序列 s ( t ) s(t) s(t). 将 s ( t ) s(t) s(t)映射到QPSK星座图上的星座点. 产 ...
- MFSK调制与相干解调-MATLAB基带仿真
MFSK调制与相干解调-MATLAB基带仿真 MFSK调制原理 发送信号形式:(等概) s 1 = ( E , 0 , - , 0 ) s_{1}=(\sqrt{\mathcal{E}}, 0, \l ...
- (7,4)汉明码在BPSK系统下的性能-MATLAB基带仿真
(7,4)汉明码在BPSK系统下的性能-MATLAB基带仿真 仿真步骤 产生一定长度的值为0或1的随机序列 d ( t ) d(t) d(t). 根据监督矩阵,将初始数据序列映射为编码后的二元序列 s ...
- 复信号的调制与解调(基带)
Digital modulation methods can be considered as digital-to-analog conversion and the corresponding d ...
- matlab dpsk,2DPSK调制与解调matlab(最新整理)
<2DPSK调制与解调matlab(最新整理)>由会员分享,可在线阅读,更多相关<2DPSK调制与解调matlab(最新整理)(5页珍藏版)>请在人人文库网上搜索. 1.- 2 ...
- 2DPSK调制解调matlab,2DPSK调制与解调-matlab
<2DPSK调制与解调-matlab>由会员分享,可在线阅读,更多相关<2DPSK调制与解调-matlab(4页珍藏版)>请在人人文库网上搜索. 1.- 2DPSK 调制与解调 ...
- 4QAM、16QAM 调制与解调仿真电路,观察并分析QAM星座图和误码率曲线【matlab代码】
源码: https://download.csdn.net/download/qq_44394952/86236776 要求 完成两种调制方式的调制解调:4QAM.16QAM (1)画出系统框图,搞清 ...
- FPGA 数字信号处理之 FSK 调制、解调的实现与仿真基于 verilog + ise + modelsim + matlab (保姆级)
试验说明: 笔者复现FSK调制.解调的过程中,在网上查了很多很多相关文章,至少在本文之前,没发现能在参考一篇博文的情况下能完整复现实验结果的.总之,全乎的基本没有. 本笔记(文)的目标是让入门者或者说 ...
- 信号的调制与解调matlab仿真,基于MATLAB对信号调制与解调的仿真
基于MATLAB对信号调制与解调的仿真 2.3 2PSK的基本原理和调制解调实现 数字相移键控,记作PSK(Phase shift-keying ),二进制相位键控记作2PSK. 2PSK就是根据基带 ...
最新文章
- 推荐一套开源通用后台管理系统(附源码)
- flex页面中嵌入html页面
- 读书笔记-你不知道的JS上-混入与原型
- [css] 当使用opacity时会使得元素的子元素也透明,此时不想要子元素也跟着透明怎么办?
- 一个人的旅行(HDU-2066)
- Labview对mysql查询的数据进行展示
- 基于WebSocket实现的前端实时声音告警提醒功能
- 前端学习(基础介绍)
- 极大似然估计法(Maximum likelihood estimation, MLE)
- codeforces 69A. Young Physicist
- 简单合并word文档(转)
- 比赛报名 | 2019AIIA杯电梯调度算法大赛正式启动
- 评点SAP HR功能及人力资源管理软件
- Ubuntu防火墙ufw规则配置
- PPT设计思维干货分享(一)
- 红帽linux改root密码,Redhat 7.6 主机强制修改root密码及配置网关
- 【078期】java.util.* 并发包下 LongAdder 和 AtomicLong 哪个性能更好,为什么?
- 【ClickHouse SQL 极简教程】ClickHouse SQL之数据定义语言 DDL
- 上穷碧落下黄泉,源码追踪经验谈——侯捷
- Java读取和写入配置文件Properties