【数字调制】ASK、BPSK、QPSK、MSK调制误码率【附MATLAB代码】

2024-03-20 23:52

本文主要是介绍【数字调制】ASK、BPSK、QPSK、MSK调制误码率【附MATLAB代码】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章来源:微信公众号:EW Frontier

MATLAB代码

clc;
clear all;
close all;
​
%1 参数设置
Tm=1; %符号周期
fm=1/Tm;
fc=10; %载波频率
N_sample=200; %每个符号的采样点
N_num=1000; %符号个数
dt=Tm/N_sample; %采样时间间隔
N=N_sample*N_num; %采样点数
NFFT=2.^16; %FFT点数
t=0:dt:N_num*Tm-dt; %信号时间轴
j=1;
​
%2. BASK
s_source1=rand(1,N_num);
for i=1:N_numif s_source1(1,i)>=0.5 s_source1(1,i)=1;else s_source1(1,i)=0;end
end
s_source1=rectpulse(s_source1,N_sample); %整形成矩形脉冲
s_bask=s_source1.*sin(2*pi*fc*t); %BASK调制
for r=-10:1:40
s_bask_wgn=awgn(s_bask,r,'measured'); %信道信噪比20dB
s_dbask=s_bask_wgn.*sin(2*pi*fc*t);%DBASK解调
%通入低通滤波器
wc=1.5*2*pi*fm/N_sample;
B=fir1(16,wc/pi);
s_out1=filter(B,1,s_dbask);
%采样判决
for n=1:200000if s_out1(n)>=0.25s_out1(n)=1;else s_out1(n)=0;end
end
[Num,Ratio]=biterr(s_out1,s_source1);
Ratio1(j)=Ratio;
j=j+1;
end
figure(1)
r=-10:1:40;
plot(r,Ratio1,'r')
xlabel('信噪比');ylabel('误码率')
axis([-10 40 0 1])
title('BASK调制方式误码率随信噪比变化曲线')
​
j=1;
​
%3. BPSK
s_source2=rand(1,N_num);
for i=1:N_numif s_source2(1,i)>=0.5 s_source2(1,i)=1;else s_source2(1,i)=0;end
end
s_source2=rectpulse(s_source2,N_sample); %整形成矩形脉冲
s_source2=2*s_source2-1;%单极性码变双极性码
s_bpsk=s_source2.*sin(2*pi*fc*t); %BPSK调制
for r=-10:1:40
s_bpsk_wgn=awgn(s_bpsk,r,'measured'); %信道信噪比20dB
s_dbpsk=s_bpsk_wgn.*sin(2*pi*fc*t);%DBPSK解调
%通入低通滤波器
wc=1.5*2*pi*fm/N_sample;
B=fir1(16,wc/pi);
s_out2=2*filter(B,1,s_dbpsk);
%采样判决
for n=1:200000if s_out2(n)>=0.00s_out2(n)=1;else s_out2(n)=-1;end
end
[Num,Ratio]=symerr(s_out2,s_source2);
Ratio2(j)=Ratio;
j=j+1;
end
figure(2)
r=-10:1:40;
plot(r,Ratio2,'y')
xlabel('信噪比');ylabel('误码率')
axis([-10 40 0 1])
title('BPSK调制方式误码率随信噪比变化曲线')
​
j=1;
​
%4. QPSK
s_source31=rand(1,N_num);
for i=1:N_numif s_source31(1,i)>=0.5 s_source31(1,i)=1;else s_source31(1,i)=0;end
end
s_source31=rectpulse(s_source31,N_sample); %整形成矩形脉冲
s_source31=2*s_source31-1;%单极性码变双极性码
s_source32=rand(1,N_num);
for i=1:N_numif s_source32(1,i)>=0.5 s_source32(1,i)=1;else s_source32(1,i)=0;end
end
s_source32=rectpulse(s_source32,N_sample); %整形成矩形脉冲
s_source32=2*s_source32-1;%单极性码变双极性码
s_source3=0.5*s_source31-0.5*s_source32; %1-1/-1-(-1)=0;1-(-1)=2;-1-1=-2
%QPSK调制
s_qpsk=s_source31.*cos(2*pi*fc*t)-s_source32.*sin(2*pi*fc*t);
%经过高斯信道  
for r=-10:1:40
s_qpsk_wgn=awgn(s_qpsk,r,'measured');
%相干解调
%IQ分路
s_dqpsk1=s_qpsk_wgn.*cos(2*pi*fc*t);
s_dqpsk2=s_qpsk_wgn.*sin(2*pi*fc*t);
wc=1.5*2*pi*fm/N_sample;
%分别通过低通滤波器
B=fir1(16,wc/pi);
s_out31=filter(B,1,s_dqpsk1);
s_out32=filter(B,1,s_dqpsk2);
%采样判决 
for n=1:200000if s_out31(n)>=0s_out31(n)=1;else s_out31(n)=-1;end
end
for n=1:200000if s_out32(n)>=0s_out32(n)=1;else s_out32(n)=-1;end
end
s_out3=0.5*s_out31+0.5*s_out32;%归一化
[Num,Ratio]=symerr(s_out3,s_source3);
Ratio3(j)=Ratio;
j=j+1;
end
figure(3)
r=-10:1:40;
plot(r,Ratio3,'g')
xlabel('信噪比');ylabel('误码率')
axis([-10 40 0 1])
title('QPSK调制方式误码率随信噪比变化曲线')
​
j=1;
​
%5. MSK
%产生信源信号
s_source41=rand(1,N_num);
for i=1:N_numif s_source41(1,i)>=0.5 s_source41(1,i)=1;else s_source41(1,i)=0;end
end
s_source41=rectpulse(s_source41,N_sample); %整形成矩形脉冲
s_source41=2*s_source41-1;%单极性码变双极性码
s_source42=rand(1,N_num);
for i=1:N_numif s_source42(1,i)>=0.5 s_source42(1,i)=1;else s_source42(1,i)=0;end
end
s_source42=rectpulse(s_source42,N_sample); %整形成矩形脉冲
s_source42=2*s_source42-1;%单极性码变双极性码
s_source4=0.5*s_source41-0.5*s_source42; %1-1/-1-(-1)=0;1-(-1)=2;-1-1=-2
%MSK调制
s_msk=s_source41.*cos(0.5*pi*fc*t).*cos(2*pi*fc*t)-s_source42.*sin(0.5*pi*fc*t).*sin(2*pi*fc*t);
%经过高斯信道  
for r=-10:1:40
s_msk_wgn=awgn(s_msk,r,'measured');
%相干解调
%IQ分路
s_dmsk1=s_msk_wgn.*cos(0.5*pi*fc*t).*cos(2*pi*fc*t);
s_dmsk2=s_msk_wgn.*sin(0.5*pi*fc*t).*sin(2*pi*fc*t);
%分别通过低通滤波器
wc=1.5*2*pi*fm/N_sample;
B=fir1(32,wc/pi);
s_out41=filter(B,1,s_dmsk1);
s_out42=filter(B,1,s_dmsk2);
%采样判决 
for n=1:200000if s_out41(n)>=0s_out41(n)=1;else s_out41(n)=-1;end
end
for n=1:200000if s_out42(n)>=0s_out42(n)=1;else s_out42(n)=-1;end
end
s_out4=0.5*s_out41+0.5*s_out42;%归一化
[Num,Ratio]=symerr(s_out4,s_source4);
Ratio4(j)=Ratio;
j=j+1;
end
figure(4)
r=-10:1:40;
plot(r,Ratio4,'b')
xlabel('信噪比');ylabel('误码率')
axis([-10 40 0 1])
title('MSK调制方式误码率随信噪比变化曲线')
​
figure(5)
r=-10:1:40;
plot(r,Ratio1,'r',r,Ratio2,'y',r,Ratio3,'g',r,Ratio4,'b')
xlabel('信噪比');ylabel('误码率')
axis([-10 40 0 1])
title('四种调制方式误码率随信噪比变化曲线比较')
​
% 6.与理论值进行比较
r=0:1:40;
Pe_BASK=0.5.*erfc(sqrt(0.25*r));
Pe_BPSK=0.5.*erfc(sqrt(r));
Pe_QPSK=1-((1-0.5.*erfc(sqrt(0.5.*r))).^2);
Pe_MSK=2.*Pe_BPSK;
figure(6)
plot(r,Pe_BASK,'r',r,Pe_BPSK,'y',r,Pe_QPSK,'g',r,Pe_MSK,'b')
xlabel('信噪比');ylabel('误码率')
axis([0 40 0 1])
title('四种调制方式误码率随信噪比变化理论曲线')

仿真结果

添加图片注释,不超过 140 字(可选)

这篇关于【数字调制】ASK、BPSK、QPSK、MSK调制误码率【附MATLAB代码】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/831145

相关文章

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机