Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系

本文为学习所用,严禁转载。

本文参考链接
https://zhuanlan.zhihu.com/p/667382398 QPSK代码及高斯白噪声如何产生
https://ww2.mathworks.cn/help/signal/ref/butter.html 滤波器
https://www.python100.com/html/4LEF79KQK398.html 低通滤波器

本实验使用matlab仿真了五种数字调制方式(OOK、2FSK、2PSK、QPSK、4QAM)在加性高斯白噪声信道中的误码率,与归一化信噪比的关系。其中码元速率为100bps,码元个数为6666,OOK、BPSK载波频率为1KHz,2FSK两个载波频率分别为1KHz,500Hz。OOK、2FSK、2PSK均采用相干解调的方式。下面是各种调制解调方式下的误码率曲线。


clear all; 
close all; 
clc;
M = 6666; % 产生码元数
L = 100; % 每码元复制L次,方便观察
Ts = 0.01; % 每个码元的宽度,即码元的持续时间
Rb = 1/Ts; % 码元速率
dt = Ts/L; % 采样间隔
Fs = 1/dt; % 采样率
TotalT = M*Ts; % 总时间
t = 0:dt:TotalT-dt; % 时间
fc1 = 10*Rb; % 载波频率是码元速率的10倍,即载波的周期是码元周期的1/10
fc2 =  4*Rb; % 2fsk另一个载波的频率
SNR = -10:0.5:10; % 信噪比范围BER_ask2 = zeros(1,length(SNR)); % 2ASK误码率
BER_psk2 = zeros(1,length(SNR)); % BPSK误码率
BER_fsk2 = zeros(1,length(SNR)); % 2FSK误码率
BER_qpsk = zeros(1,length(SNR)); % QPSK误码率
BER_qam4 = zeros(1,length(SNR)); % 4QAM误码率% 产生二进制随机数据data_ask2 = randi([0,1],1,M);%产生0和1的二进制随机数data_fsk2 = randi([0,1],1,M);%产生0和1的二进制随机数data_psk2 = data_ask2*2 -1  ;%借助2ASK的随机数产生-1和1的二进制随机数data_qpsk = randi([0 3],M,1);%qpsk的码元范围是0~3data_qam4 = randi([0 3],M,1);%qam的码元范围是0~3% 产生单极性不归零矩形脉冲波形data_sample_ask2 = repmat(data_ask2,L,1); % 每个码元复制L次data_sample_ask2 = reshape(data_sample_ask2,1,M*L); % 产生单极性不归零矩形脉冲波形data_sample_psk2 = repmat(data_psk2,L,1); % 每个码元复制L次data_sample_psk2 = reshape(data_sample_psk2,1,M*L); % 产生双极性不归零矩形脉冲波形data_sample_fsk2 = repmat(data_fsk2,L,1); % 每个码元复制L次data_sample_fsk2 = reshape(data_sample_fsk2,1,M*L); % 产生单极性不归零矩形脉冲波形% 产生2ASK已调信号
carrier1 = cos(2*pi*fc1*t); % 载波1的正弦波
carrier2 = cos(2*pi*fc2*t); % 载波2的正弦波mod_ask2 = data_sample_ask2.*carrier1; % 2ASK的调制mod_psk2 = data_sample_psk2.*carrier1; % 2PSK的调制mod_fsk2 = data_sample_fsk2.*carrier1 + (1-data_sample_fsk2).*carrier2;% 2FSK的调制mod_qpsk = pskmod(data_qpsk,4,pi/4);% QPSK的调制mod_qam4 = qammod(data_qam4,4);% 4QAM的调制for i = 1:length(SNR)% 通过实时测量已调信号的功率,对已调信号加入高斯白噪声noise_ask2 = awgn (mod_ask2,SNR(i),'measured');noise_psk2 = awgn (mod_psk2,SNR(i),'measured');noise_fsk2 = awgn (mod_fsk2,SNR(i),'measured');noise_qpsk = awgn (mod_qpsk,SNR(i),'measured');noise_qam4 = awgn (mod_qam4,SNR(i),'measured');% 对接受信号进行带通滤波,滤除通频带外的噪声[b1,a1] = butter(4,[0.8*fc1 1.2*fc1]/(Fs/2),'bandpass'); % 设计带通滤波器[b2,a2] = butter(4,[0.8*fc2 1.2*fc2]/(Fs/2),'bandpass'); % 设计带通滤波器r_ask2 = filter(b1,a1,noise_ask2); % 对接收的已调信号进行带通滤波,,滤除带外噪声r_psk2 = filter(b1,a1,noise_psk2); % 对接收的已调信号进行带通滤波,,滤除带外噪声r_fsk2_fc1 =  filter(b1,a1,noise_fsk2); % 对接收的已调信号进行带通滤波,,滤除带外噪声r_fsk2_fc2 =  filter(b2,a2,noise_fsk2); % 对接收的已调信号进行带通滤波,,滤除带外噪声% 对接收信号进行相干解调dem_ask2 = r_ask2.*carrier1;dem_psk2 = r_psk2.*carrier1;dem_fsk2_fc1 = 2*r_fsk2_fc1.*carrier1;dem_fsk2_fc2 = 2*r_fsk2_fc2.*carrier2;% 对解调信号进行低通滤波,滤除载波倍频分量,以获得码元coe_lowpass = fir1(6,2*fc1/Fs); % 低通滤波,将两倍的载波频率分量滤除lowpass_ask2 = filter(coe_lowpass,1,dem_ask2); lowpass_psk2 = filter(coe_lowpass,1,dem_psk2);lowpass_fsk2_fc1 = filter(coe_lowpass,1,dem_fsk2_fc1);lowpass_fsk2_fc2 = filter(coe_lowpass,1,dem_fsk2_fc2); % 对解调信号进行抽样判决sample_ask2 = lowpass_ask2(L/2:L:end); % 码元中点时间抽样sample_psk2 = lowpass_psk2(L/2:L:end); % 码元中点时间抽样sample_fsk2_fc1 = lowpass_fsk2_fc1(L/2:L:end); % 码元中点时间抽样sample_fsk2_fc2 = lowpass_fsk2_fc2(L/2:L:end); % 码元中点时间抽样decision_ask2 = (sample_ask2>0.5);decision_psk2 = (sample_psk2>0);decision_fsk2 = (sample_fsk2_fc1>sample_fsk2_fc2); decision_qpsk = pskdemod(noise_qpsk,4,pi/4);decision_qam4 = qamdemod(noise_qam4,4);% 计算误码个数和误码率error_ask2 = sum(xor(data_ask2,decision_ask2));error_psk2 = sum(xor(data_ask2,decision_psk2)); %这里因为PSK是ASK的随机序列产生的,所以和ASK比较error_fsk2 = sum(xor(data_fsk2,decision_fsk2)); error_qpsk = sum(xor(data_qpsk,decision_qpsk)); error_qam4 = sum(xor(data_qam4,decision_qam4)); BER_ask2(i) = error_ask2/M; % 2ASK误码率BER_psk2(i) = error_psk2/M; % 2PSK误码率BER_fsk2(i) = error_fsk2/M; % 2FSK误码率BER_qpsk(i) = error_qpsk/M; % QPSK误码率BER_qam4(i) = error_qam4/M; % 4QAM误码率
end
% 计算理论误码率
% Pe = zeros(1,length(SNR));
% for i = 1:length(SNR)
% r = 10^(SNR(i)/10);
% Pe(i) = qfunc(sqrt(r)); % 2ASK理论误码率公式
% end
% 绘制误码率曲线% semilogy横轴是线性,纵轴10倍一格
semilogy(SNR,BER_ask2,'b-d','LineWidth',2); % 2ASK仿真曲线
hold on;
semilogy(SNR,BER_psk2,'y-h','LineWidth',2); % BPSK仿真曲线
hold on;
semilogy(SNR,BER_fsk2,'g-o','LineWidth',2); % 2FSK仿真曲线
hold on;
semilogy(SNR,BER_qpsk,'k-*','LineWidth',2); % QPSK仿真曲线
hold on;
semilogy(SNR,BER_qam4,'r-s','LineWidth',2); % 4QAM仿真曲线
hold on;
% semilogy(SNR,Pe,'m-+'); % 理论曲线
% grid on;xlabel('归一化信噪比Eb/N0 (dB)');
ylabel('误码率BER');
legend('OOK','BPSK','2FSK','QPSK','4QAM');
title('误码率曲线');

经过上述仿真得到误码率曲线如下。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224469.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js(二)-模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化,就是遵守固定的规则&…

解决log4j多个日志都写到一个文件

之前客户端程序由于Websockt包依赖的log4j,就用log4j写日志了,Web用的log4j2没毛病。用log4j的多个logger的日志都写到一个文件里了,查了很多资料都没解决。今天闲了解决一下。 最后好使的配置 # 设置日志根 log4j.rootLogger INFO,Except…

谷歌Gemini造假始末

💡大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、读书和自媒体。 在过去一年中,OpenAI ChatGPT引发了一股AI新浪潮,而谷歌则一直处于被压制的状态,迫切需要一款现象级的AI产品来…

Mysql(2)

目录 一.外键约束属性 创建主键表: ​编辑 创建外键表: 插入数据,先插入主表在插入外表: 删数数据记录时,要先从表再主表: 删除外键属性: 二.数据库的用户权限管理 看数据库中的用户&a…

Flutter详解及案例代码

概念 Flutter是由Google开发的开源UI框架,旨在快速构建高质量的移动应用程序。与传统的移动应用开发方式不同,Flutter使用单一代码库构建应用程序,可以同时在iOS和Android上运行。 Flutter的核心是使用Dart语言编写的,并且具有自…

C语言操作符if语句好习惯 详解分析操作符(详解4)

各位少年: 前言 还记得我们上一章讲过一个比较抽象的代码,它要比较两次都是真的情况下才能打印,那么很显然这样写代码是有弊端的?哪我们C语言之父丹尼斯.里奇,先介绍一下上次拉掉了if语句的好习惯 好再分享一些操作符…

大数据Doris(三十九):Duplicate 模型中的 ROLLUP

文章目录 Duplicate 模型中的 ROLLUP 一、前缀索引

SPFA算法总结

知识概览 SPFA算法是Bellman_Ford算法的优化。时间复杂度一般是O(m),最坏时间复杂度是O(nm)(遇到网格图、菊花图),其中n是点数,m是边数。SPFA算法其实是单源最短路限制最小的算法,只要图中没有负环&#xf…

C++ Qt开发:Charts绘制各类图表详解

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWidget与QCharts的常用方法及灵活运用。 …

Java之Synchronized与锁升级

Synchronized与锁升级 一、概述 在多线程并发编程中 synchronized 一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着 Java SE 1.6 对 synchronized 进行了各种优化之后,有些情况下它就并不那么重了。 本文详细介绍 Java SE 1.6 中为…

《运维人员的未来:IT界的“万金油“如何继续闪耀光芒》

文章目录 每日一句正能量前言35岁被称为运维半衰期,究竟为何?如何顺利过渡半衰期运维的职业发展路径后记 每日一句正能量 凡事顺其自然,遇事处于泰然,得意之时淡然,失意之时坦然,艰辛曲折必然,历…

详解Java反射机制reflect(一学就会,通俗易懂)

1.定义 #2. 获取Class对象的三种方式 sout(c1)结果为class com.itheima.d2_reflect.TestClass 获取到了Class对象就相当于获取到了该类 2.获取类的构造器 3.获取全部构造器对象 2.根据参数类型获取构造器对象 类型后必须加.class 3.构造器对象调用构造器方法 4.暴力访问 4.获…

Maven私服

1 Maven私服简介 Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 1.1 下载构件顺序 建立私服后,当局域网内的用户需要某个构件时&a…

图灵日记之java奇妙历险记--输入输出方法数组

目录 输入输出输出到控制台从键盘输入使用 Scanner 读取字符串/整数/浮点数使用 Scanner 循环读取 猜数字方法方法定义方法调用的执行过程实参和形参的关系(重要)方法重载 数组数组的创建数组的初始化动态初始化静态初始化 数组的使用元素访问遍历数组 数组是引用类型null数组应…

esp32-s3训练自己的数据进行目标检测、图像分类

esp32-s3训练自己的数据进行目标检测、图像分类 一、下载项目二、环境三、训练和导出模型四、部署模型五、存在的问题 esp-idf的安装参考我前面的文章: esp32cam和esp32-s3烧录human_face_detect实现人脸识别 一、下载项目 训练、转换模型:ModelAssist…

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

sql_lab之sqli注入中的cookie注入

Cookei注入(gxa的从cookei注入) 1.打开控制台 2.验证id2时的值 document.cookie"id2" 3.判断是上面闭合方式 document.cookie"id2 -- s" 有回显 说明是’单引号闭合 4.用order by 判断字段数 5.用联合查询判断回显点 接下来的…

复分析——第1章——复分析准备知识(E.M. Stein R. Shakarchi)

第一章 复分析准备知识 (Preliminaries to Complex Analysis) The sweeping development of mathematics during the last two centuries is due in large part to the introduction of complex numbers; paradoxically, this is based on the seemingly absurd no…

python三大开发框架django、 flask 和 fastapi 对比

本文讲述了什么启发了 FastAPI 的诞生,它与其他替代框架的对比,以及从中汲取的经验。 如果不是基于前人的成果,FastAPI 将不会存在。在 FastAPI 之前,前人已经创建了许多工具 。 几年来,我一直在避免创建新框架。首先&…

python dash 的学习笔记1

dash 用python开发web界面 https://dash.plotly.com/ 官方上支持jula F# python一类。当然我只会python只学习python中使用dash. 要做一个APP,用php,java以及.net都可以写,只所有选择python是因为最近在用这一个。同时也发现python除了慢全是优点。 资料…