【数字调制】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

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计