BPSK相干解调和DBPSK非相干解调误码率仿真
BPSK相干解调和DBPSK非相干解调误码率仿真
本脚本完成了BPSK和DBPSK两种不同调制方式下的误码率(DBPSK差分相干)仿真, 并和理论曲线进行了对比。
撰写人:***
最后修改日期:2015-03-18
软件版本:MATLAB(R) 2014a
程序添加和修改包括
- BPSK未作修改
- DPSK添加了成型部分,同时从《高等数字通信》中看到了DPSK最佳接收机的结构
待改进
- 怎样选择仿真点数才能保证结果可信,可信程度是多少?如何衡量?
Contents
初始设置
清空工作区,数据,关闭所有窗口
clc;clear all;close all;
仿真参数设置
EbN0_dB = 1:8; % EbN0_dB 误码率范围,向量;
FRAMES_NUM = 100; % FRAMES_NUM 最大仿真帧数目;
FRAMES_LENGTH = 1000; % FRAMES_LENGTH 每帧长度;
UPSAMPLE_RATE = 8; % UPSAMPLE_RATE 过采样率;
berBpsk = zeros(1,length(EbN0_dB)); % berBpsk BPSK误码率统计,向量;
berDbpsk = zeros(1,length(EbN0_dB)); % berDbpsk DBPSK误码率统计,向量;
sqrtRaisedfilter = rcosfir(0.3,[-3,3],UPSAMPLE_RATE,1,'sqrt');
误码率仿真
针对不同EbN0先仿真BPSK和DBPSK误码率曲线
在不同EbN0下,对误码率进行仿真
for nEbN0 = 1:length(EbN0_dB);
多帧取统计平均
bpskErrorNum = 0;
dbpskErrorNum = 0;
for nFrame = 1:FRAMES_NUM
数据生成和基带映射
data = randi([0 1],1,FRAMES_LENGTH);
bpskBaseband = 1 - 2*data; % 映射 0—+1;1—-1,已归一化
data_extend = [1 data]; % 差分编码,假设第一个数据为1
for num = 2:FRAMES_LENGTH+1
data_extend(num) = xor(data_extend(num),data_extend(num-1));
end
% 注意此时DBPSK多传了一个1
dbpskBaseband = 1 - 2*data_extend; % 映射 0—+1;1—-1,已归一化
% 方波成型
%dbpskBaseband = reshape(repmat(dbpskBaseband,UPSAMPLE_RATE,1),1,[]);
% 匹配滤波
dbpskBaseband = upsample(dbpskBaseband,UPSAMPLE_RATE);
dbpskBaseband = conv(dbpskBaseband,sqrtRaisedfilter,'same');
bpskTransmitSignal = bpskBaseband; % 不加载波
dbpskTransmitSignal = dbpskBaseband/sqrt(var(dbpskBaseband));
AWGN 信道,SNR和EbN0换算关系
SNR_dB = EbN0_dB(nEbN0) + 10*log10(2) - 10*log10(1);
SNR = 10^(SNR_dB/10);
接收信号的矢量等效
bpsknoise = 1/sqrt(SNR)*randn(1,length(bpskTransmitSignal));
bpskReceiveSignal = bpskTransmitSignal + bpsknoise;
SNR_dB = EbN0_dB(nEbN0) + 10*log10(2) - 10*log10(UPSAMPLE_RATE);
SNR = 10^(SNR_dB/10);
dbpsknoise = 1/sqrt(SNR)*randn(1,length(dbpskTransmitSignal)) + ...
1i*1/sqrt(SNR)*randn(1,length(dbpskTransmitSignal));
dbpskReceiveSignal = dbpskTransmitSignal + dbpsknoise;
BPSK误比特数统计
bpskErrorNum = bpskErrorNum + sum(bpskBaseband.*bpskReceiveSignal DBPSK解调(通信原理P209) 误比特数统计,不是最佳接收 方波成型解调如果UPSAMPLE_RATE为1,此时能使用sum函数%dbpskReceiveSignal = sum(reshape(dbpskReceiveSignal,UPSAMPLE_RATE,[]));
% 匹配滤波解调
dbpskReceiveSignal = conv(dbpskReceiveSignal,sqrtRaisedfilter,'same');
dbpskReceiveSignal = downsample(dbpskReceiveSignal,UPSAMPLE_RATE);
dbpskDelay = dbpskReceiveSignal(2:end);
dbpskJudgment = dbpskReceiveSignal(1:end-1).*dbpskDelay;
dbpskDecodeData = zeros(1,length(data));
dbpskDecodeData(dbpskJudgment%gt compares only the real part
dbpskErrorNum = dbpskErrorNum + sum(abs(dbpskDecodeData-data));end误码率统计
berBpsk(nEbN0) = bpskErrorNum/FRAMES_NUM/FRAMES_LENGTH;
berDbpsk(nEbN0) = dbpskErrorNum/FRAMES_NUM/FRAMES_LENGTH;end绘图和数据输出
绘制BPSK和DBPSK的仿真和理论误码率曲线
berBpskTheory = berawgn(EbN0_dB,'psk',2,'nondiff');
berDbpskTheory = berawgn(EbN0_dB,'dpsk',2,'nondiff');
fprintf('总帧数 = %d,帧长 = %d\n',FRAMES_NUM,FRAMES_LENGTH);
table(EbN0_dB',berBpskTheory',berBpsk',berDbpskTheory',berDbpsk',...
'VariableNames', {'EbN0_dB','BpskTheory','BpskSim','DbpskTheory','DbpskSim'}) figure;
semilogy(EbN0_dB,berDbpsk,'bd');hold on;
semilogy(EbN0_dB,berDbpskTheory,'b-');
semilogy(EbN0_dB,berBpsk,'rs');
semilogy(EbN0_dB,berBpskTheory,'r-');hold off;
legend('差分DPSK仿真','DPSK理论','相干BPSK仿真','相干BPSK理论');
xlabel('EbN0');
ylabel('BER');
grid on;总帧数 = 100,帧长 = 1000 ans = EbN0_dB BpskTheory BpskSim DbpskTheory DbpskSim
_______ __________ _______ ___________ ________ 1 0.056282 0.05494 0.14198 0.14132
2 0.037506 0.03737 0.10248 0.10291
3 0.022878 0.02259 0.067989 0.06888
4 0.012501 0.01247 0.040558 0.03912
5 0.0059539 0.0061 0.021165 0.02151
6 0.0023883 0.0024 0.0093328 0.00937
7 0.00077267 0.00079 0.0033292 0.00334
8 0.00019091 0.00022 0.0009094 0.00076
BPSK相干解调和DBPSK非相干解调误码率仿真的更多相关文章
- Ngnix服务器详解(Windows版本)(非原创)
文章大纲 一.Ngnix简介二.Ngnix安装三.Ngnix之静态资源访问四.Ngnix正向代理与反向代理五.Ngnix之虚拟主机配置六.Ngnix之负载均衡七.Ngnix之访问控制八.Ngnix日志 ...
- apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)(非HA和HA)
不多说,直接上干货! Storm的版本选取 我这里,是选用apache-storm-1.0.2.tar.gz apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解) 为什么 ...
- SQL查询优化:详解SQL Server非聚集索引(转载)
本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...
- (淘宝无限适配)手机端rem布局详解(转载非原创)
从网易与淘宝的font-size思考前端设计稿与工作流 本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问 ...
- storm的3节点集群详细启动步骤(非HA和HA)(图文详解)
前期博客 apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)(非HA和HA) 启动storm集群(HA) 本博文情况是 master(主) nimbus slave1( ...
- .NET DLL 保护措施详解(非混淆加密加壳)
为什么要保护DLL,我就不多说了,各人有各人的理由.总的来说,就是不想核心逻辑泄露及授权验证被破解两大方面的因素.市面上的混淆加密工具对.NET源码保护的效果天差地别,很多网上下到的混淆工具破解版对. ...
- 【Matlab】BFSK的调制与解调仿真
写在前面 本篇是[Matlab]BASK的调制与解调仿真的下篇,考虑到阅读体验,故另开一篇分享将BFSK的调制与解调仿真. 索引 写在前面 一.BFSK的调制 1.1 异频载波生成 1.2 信号合并 ...
- ES6笔记(3)-- 解构赋值
系列文章 -- ES6笔记系列 解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组.对象.字符串的解构赋值等 一.数组的解构赋值 function ids() { ret ...
- .NET DLL 保护措施详解(二)关于性能的测试
先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...
随机推荐
- 20155233刘高乐 第二周课堂实践以及MyOD
1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so? 2. 提交共 ...
- 20155235 《Java程序设计》 实验四 Android开发基础
20155235 <Java程序设计> 实验四 Android开发基础 实验要求 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理 ...
- 如何指定rman下的备份路径
如果不想使用缺省路径,可以以如下方式来指定: RMAN> configure channel 1 device type disk format '/rman/bak/%F';RMAN> ...
- Excel小技巧整理(持续更新)
合并某列中相同单元格 参考https://jingyan.baidu.com/article/9158e00006db70a25512286f.html 使用方法 先给需要合并的列排序,这样相同数据会 ...
- youtube视频下载和搬运的方法
youtube全球最大的视频网站, 全世界每天有三分之一的网民在youtube上观看视频, 可是大部分人不知道, 在这些网民有一小部分人是依靠youtube生存的, 他们上传视频到youtube, y ...
- centos 7 install gnome etc
centos yum 有grouplist子命令,可以查看当前系统有多少软件组件,里面就有gnome:"GNOME Desktop" sudo yum groupinstall G ...
- ES数据备份到HDFS
1.准备好HDFS(这里我是本机测试) 2.es 安装repository-hdfs插件 (如es为多节点需在每个节点都安装插件) elasticsearch-plugin install repos ...
- 音频分析框架pyAudioAnalysis文档
“ pyAudioAnalysis是一个非常好用且强大的音频分析开源工具,能实现音频的特征提取.分类和回归模型的训练和执行,以及其他一些实用的功能.此外,本文档并非直译,也有部分比较简略,可以结合源码 ...
- Halcon如何保存仿射变换矩阵
这里我们通过序列化来实现的,如下图,写到硬盘的HomMat2D_1内容和从硬盘里HomMat2D_2读出的内容一致,源代码在图片下方. Halcon源代码: hom_mat2d_identity (H ...
- [转]C#学习笔记15——C#多线程编程
一.基本概念进程:当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的.线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存 ...