m基于光纤光栅传感网接入GPON的光纤通信系统matlab性能仿真,包括解码,解封装,分接,码率恢复,解帧,拆包,译码

news2024/9/25 3:25:40

目录

1.算法描述

2.仿真效果预览

3.MATLAB部分代码预览

4.完整MATLAB程序


1.算法描述

接入处理系统模块化设计: 

 ·传感器接收到的信息转换为二进制信息(这个我们可以直接模拟出随机的二进制序列来表示传感器的数据,首先设置一组数据,然后进行量化,最后进行转换为二进制。这个部分的仿真结果对应你提供论文的3.2.1部分)

  ·封装,将编码后的数据进行封装,即将数据变为数据包,再把数据包转换为数据帧

     ·码率调整,主要将瞬时数码率不同的多个数码流调整为具有同一较高的数码率的数码流,然后再进行时分复接。

  ·最后由时分复接得到传感复用帧结构。

  ·码分编码封装发送(二进制数据编码,这里,编码方式我们选择性能非常好的LDPC编码)

在发送端,这里根据仿真要求,模拟五个子网

接收部分:

码分解码,解封装,分接,码率恢复,解帧,拆包,译码。。。。。

       最后对整个系统进行误码率的分析,对五个子网的数据进行误码率分析,眼图以及Q因子分析。

2.仿真效果预览

matlab2022a仿真结果如下:

 

3.MATLAB部分代码预览


 for jj1 = 1:length(EbN0)
    jj1
    Ind = Ind + 1;
    Err_Rate2 = zeros(1,TIMES);
    for jj2 = 1:TIMES
        jj2
        Num_NET = 5;%模拟子网的个数
        Lens    = 500;%传感器采集数据长度
        %传感信息的净荷值相关参数
        A       = -40;
        B       = 120;
        Delta   = 0.2;
        Ld      = (ceil(log2((B-A)/Delta)));
        %传感子网数据帧的封装
        Preamble=[0,1,1,1,1,1,1,0];%帧前导码取特殊字符串01111110,表示帧同步,便于传感监控中心判断出帧的起始位置,
        %子网ID号,本案为5个子网,所以ID为三bit数据,但是为了具有扩展性,ID用四个bit表示
        ID      =[0,0,0,0;
                  0,0,0,1;
                  0,0,1,0;
                  0,0,1,1;
                  0,1,0,0];
        %HEC为帧头校验码
        HEC     = [0,1,0,1]; 
        %包头
        Head    = [0,0,1,1,0,0,1,1];
        %address,地址,随着采集数据,地址逐渐加1
        %传感器类型,假设五个子网,每个子网就一种类型
        type1   = [0,0,0,1;
                   0,0,1,0;
                   0,0,1,1;
                   0,1,0,0;
                   0,1,0,1];
        %包尾
        Trail   = [1,1,0,0,1,1,0,0];
        Bao_Size= 10;
 
        %最后的复用帧的相关参数
        Sync      = [0,0,0,0,0,0,1,1,1,0,1,0,1,1,1,1,1,0,0,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,0];
        Separator = [0,1,0,1];
        FCS       = [1,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1];
        N         = 5;
        M         = 5;
 
        %第一部分,系统发送部分
        %第一部分,系统发送部分
 
        %本案共有五个子网,所以模拟五组数据
        for nn = 1:Num_NET
            %模拟产生传感器采集到的数据,这里,为了模拟不同的码率,将采集的数据长度设置为不同
            y     = func_sensor_samples(Lens,A,B);
            YY{nn} = y;
            if is_show(1) == 1
               figure(1);
               plot(y,'b');
               xlabel('times');
               ylabel('amplitude')
               title('模拟传感器采集到的数据');
               pause(0.1);
            end
            %光纤光栅传感信号的净荷值的二进制转换
            Lp = func_value2realvalue(y,A,B,Delta);
            if is_show(2) == 1
               figure(2);
               plot(Lp,'b');
               xlabel('times');
               ylabel('amplitude')
               title('模拟传感器采集到的数据的净荷值');
               pause(0.1);
            end
            %计算转换为二进制
            V2 = func_dec2bin(Lp,Ld);
            %将二进制转换为串行流
            Signal{nn} = (reshape(V2',size(V2,1)*size(V2,2),1))';%通过上面的步骤,我们模拟了实际要发送的二进制码流
        end
...................................................
        %对五个子网的数据进行时分复接
        %码率调整
        Out1 = func_Rate_sync(Signal3{1});
        Out2 = func_Rate_sync(Signal3{2});
        Out3 = func_Rate_sync(Signal3{3});
        Out4 = func_Rate_sync(Signal3{4});
        Out5 = func_Rate_sync(Signal3{5});
        %时分复接
        Out  = func_tdma(Out1,Out2,Out3,Out4,Out5,Len_zhen);
        %传感复用帧
        tmps2   = [];
        tmps    = [];
        for i = 1:length(Out)/(M*Len_zhen)
            tmps      = [Sync,Separator,Out((i-1)*M*Len_zhen+1:i*M*Len_zhen),Separator,FCS];
            Len_zhen2 = length(tmps);
            tmps2     = [tmps2 tmps];
        end
        Signal4 = tmps2;
 
        %进行编码,编码矩阵为96*192,每次取80,并补充16个0作为虚拟填充符进行编码,共96个数据进行编码
        load H;
        load G;
        Trans_Signal = [];
        for i = 1:length(Signal4)/80
            Trans_data   = [zeros(1,16),Signal4((i-1)*80+1:(i)*80)];
            %编码
            data_code    = mod(Trans_data*G,2); 
            %BPSK
            Trans_BPSK   = 2*data_code-1; 
            Len_code     = length(Trans_BPSK);
            Trans_Signal = [Trans_Signal,Trans_BPSK];
        end
 
 
 
        %第二部分,信道,信道部分,由于是光纤传输,且您论文中没有详细说明这个部分内容,所以这里暂时仅考虑高斯白噪声
        %第二部分,信道,信道部分,由于是光纤传输,且您论文中没有详细说明这个部分内容,所以这里暂时仅考虑高斯白噪声
        sigma      = sqrt(1./(10^(EbN0(Ind)/10)*0.5)); 
        Rec_Signal = Trans_Signal + sigma*randn(1,length(Trans_Signal));   
 
 
        %第三部分,监控中心——接收端
        %第三部分,监控中心——接收端
        %译码
        R_Signal = [];
        for i = 1:length(Signal4)/80
            z_hat       = func_Dec(Rec_Signal((i-1)*Len_code+1:i*Len_code),sigma,H,50);
            x_hat       = z_hat(size(G,2)+1-size(G,1):size(G,2));
            R_Signal    = [R_Signal,x_hat(17:end)'];%去掉16个填充符
        end
 
        
        if is_show(5) == 1
           st = func_eye(Trans_Signal);
           eyediagram(st,40)
           ylabel('信号幅度');
           title('原始信号眼图');     
           pause(0.1);
        end        
        if is_show(6) == 1
           st = func_eye(Rec_Signal);
           eyediagram(st,40)
           ylabel('信号幅度');
           title('接收带噪声干扰信号眼图');  
           pause(0.1);
        end          
        if is_show(7) == 1
           st = func_eye(R_Signal*2-1);
           eyediagram(st,40)
           ylabel('信号幅度');
           title('译码之后信号眼图'); 
           pause(0.1);
        end         
        
        
        %解封装
        %通过搜索sync来确定每帧的帧头
        [R_Signal,Sync_pos] = func_find_sync(R_Signal,Sync);
        if is_show(4) == 1
           figure(4);
           plot(Sync_pos,'b');
           hold on;
           plot(find(Sync_pos>=40),Sync_pos(find(Sync_pos>=40)),'r*');
           hold off;
           xlabel('times');
           ylabel('amplitude')
           title('解封装sync位置');
           pause(0.1);
        end
        %判断当前帧位置能否检测到帧头
        if_sync = zeros(1,length(Out)/(M*Len_zhen));%这个变量用来存放是否检测到当前帧,如果为0,则该帧未检测到,直接丢弃,检测下一帧
        for i = 1:length(Out)/(M*Len_zhen)
            if Sync_pos(1+(i-1)*Len_zhen2) > 40
               if_sync(i)=1;
            end
        end
 
        %解封装
        tmps3   = [];
        tmps2   = [];
        tmps    = [];
        for i = 1:length(Out)/(M*Len_zhen)
            if if_sync(i) == 1
               tmps = R_Signal((i-1)*Len_zhen2+1:(i)*Len_zhen2);
            else
               tmps = zeros(1,Len_zhen2);% 如果该帧没有检测到,那么直接赋值0
            end
            %解封装
            tmps2 = tmps(length(Sync)+length(Separator)+1:M*Len_zhen+length(Sync)+length(Separator));
            tmps3 = [tmps3 tmps2];
        end
        Outs = tmps3;
 
        %数字分接单元
        [I1,I2,I3,I4,I5] = func_tdma2(Outs,Len_zhen,M);
        %对五个子网的数据进行时分复接
        %码率调整
        Outr{1} = func_Rate_sync(I1);
        Outr{2} = func_Rate_sync(I2);
        Outr{3} = func_Rate_sync(I3);
        Outr{4} = func_Rate_sync(I4);
        Outr{5} = func_Rate_sync(I5);
 
 
 
        %将5路传感帧转换为数据帧,进一步拆封
        %由数据帧转换为传感帧
        for nn = 1:Num_NET
            tmps2   = [];
            tmps    = [];
            LL = length(Preamble)+length(ID(nn,:))+length(HEC);
            for i = 1:length(Signal2{nn})/(N*Len_bao)
                tmps     = Outr{nn}((i-1)*Len_zhen+1:i*Len_zhen);
                tmps2    = [tmps2 tmps(LL+1:end)];
            end
            Outr2{nn} = tmps2;
        end
        %将数据包中数据提取
        %Signal即为实际要发送的二进制码流
        %产生数据包数据包,这里,我们假设每个数据包中为10个采样数据,即100bit数据
        address = 0;
        for nn = 1:Num_NET
            tmps2   = [];
            tmps    = [];
            LL      = length(Head)+length(address2)+length(type1(nn,:));
            for i = 1:length(Signal{nn})/(Bao_Size*Ld)
                tmps  = [Outr2{nn}((i-1)*Len_bao+1:i*Len_bao)];
                tmps2 = [tmps2 tmps(LL+1:end-length(Trail))];
            end
            Outr3{nn} = tmps2;
        end
 
        %误码率统计在转换为十进制之前计算
        [nberr1,rat1] = biterr(Outr3{1},Signal{1});
        [nberr1,rat2] = biterr(Outr3{2},Signal{2});
        [nberr1,rat3] = biterr(Outr3{3},Signal{3});
        [nberr1,rat4] = biterr(Outr3{4},Signal{4});
        [nberr1,rat5] = biterr(Outr3{5},Signal{5});
 
        Err_Rate0(jj2) = (rat1+rat2+rat3+rat4+rat5)/5;   
        Err_Rate1(jj2) = rat1;   
        Err_Rate2(jj2) = rat2;   
        Err_Rate3(jj2) = rat3;   
        Err_Rate4(jj2) = rat4;   
        Err_Rate5(jj2) = rat5;   
    end
    Err_Rate0s(Ind) = mean(Err_Rate0);
    Err_Rate1s(Ind) = mean(Err_Rate1);
    Err_Rate2s(Ind) = mean(Err_Rate2);
    Err_Rate3s(Ind) = mean(Err_Rate3);
    Err_Rate4s(Ind) = mean(Err_Rate4);
    Err_Rate5s(Ind) = mean(Err_Rate5);
    Q0(Ind)         = sqrt(2)*erfcinv(2*Err_Rate0s(Ind)/10);
    Q1(Ind)         = sqrt(2)*erfcinv(2*Err_Rate1s(Ind)/10);
    Q2(Ind)         = sqrt(2)*erfcinv(2*Err_Rate2s(Ind)/10);
    Q3(Ind)         = sqrt(2)*erfcinv(2*Err_Rate3s(Ind)/10);
    Q4(Ind)         = sqrt(2)*erfcinv(2*Err_Rate4s(Ind)/10);
    Q5(Ind)         = sqrt(2)*erfcinv(2*Err_Rate5s(Ind)/10);
    
    disp('over a cycle');
   
end
01_068_m

4.完整MATLAB程序

matlab源码说明_我爱C编程的博客-CSDN博客

V

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maven学习: 使用Maven构建Web项目

5.1 Maven中Web项目的结构 ​ 在java的世界中,Web应用占有很大的地位,而它的标准打包方式是WAR。WAR与JAR类似,但它包含了更多内容,如JSP文件、Servlet、web.xml配置文件、静态web资源(如html,css&#xf…

Python Gui之tkinter

GUI是什么 目录 1。GUI编程的核心步骤和第一个GUI程序 2.tkinter主窗口​​​​​​​ 3.GUI的整体描述 常用组件汇总 4.简单的组件 1.Label标签 2.Options选项详解 3.Button 4.Entry单行文本框 5.Text多行文本框 1。GUI编程的核心步骤和第一个GUI程序 from tkinte…

biaffine model:Named Entity Recognition as Dependency Parsing

论文名称:Named Entity Recognition as Dependency Parsing 论文地址:https://www.aclweb.org/anthology/2020.acl-main.577/ 前提说明 本文主要参考了以下资料 nlp_paper_study_information_extraction/code_pytorch.md at main km1994/nlp_paper_s…

ASEMI肖特基二极管SBT40100VFCT规格,SBT40100VFCT封装

编辑-Z ASEMI肖特基二极管SBT40100VFCT参数: 型号:SBT40100VFCT 最大重复峰值反向电压(VRRM):100V 最大平均正向整流输出电流(IF):40A 峰值正向浪涌电流(IFSM&#…

使用kubeadm搭建高可用集群-k8s相关组件及1.16版本的安装部署

本文是向大家分享k8s相关组件及1.16版本的安装部署,它能够让大家初步了解k8s核心组件的原理及k8s的相关优势,有兴趣的同学可以部署安装下。 什么是kubernetes kubernetes是Google 开源的容器集群管理系统,是大规模容器应用编排系统&#xff…

ubuntu下jupyter notebook设置远程访问

1. 安装anaconda 推荐安装anaconda,安装后就会包含jupyter notebook 使用命令conda list或者pip list查看jupyter notebook包,这里不多介绍 2. 生成默认配置文件 在ubuntu环境下,安装jupyter notebook后,用户主目录中会有一个…

DRU-Net--一种用于医学图像分割的高效深度卷积神经网络

Title:DRU-NET: AN EFFICIENT DEEP CONVOLUTIONAL NEURAL NETWORK FOR MEDICAL IMAGE SEGMENTATION 摘要 本文的网络结构是受ResNet和DenseNet两个网络的启发而提出的。与ResNet相比本文的方法增加了额外的跳跃连接,但使用的模型参数要比DenseNet少的多。 基于先…

【创建型设计模式-单例模式】一文搞懂单例模式的使用场景及代码实现的7种方式(全)

1.什么是单例模式 在了解单例模式前,我们先来看一下它的定义: 确保一个类只有一个实例,而且自行实例化并且自行向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法, 单例模式是一种对象的创建型…

北京东物流,南顺丰速运

配图来自Canva可画 众所周知,“双11”是一年一度的物流高峰期,但2022年“双11”当日快递业务量并未达到预期水平,全年增速创下新低。据了解,“双11”当日业务量为5.52亿件,同比下滑了20.69%,而11月1日至11…

什么是CISAW认证?有什么价值?

随着信息技术的快速发展和信息化应用的不断深入,信息技术、产品及网络已经融入社会经济生活的方方面面,但同时信息安全问题也越来越突出。面对严峻的信息安全形势,我国将信息安全上升至国家战略,相继出台了一系列政策法规。那大家…

IDEA好用插件推荐

一、MavenHelper 当Maven Helper 插件安装成功后,打开项目中的pom文件,下面就会多出一个试图Dependency Analyzer 切换到此试图即可进行相应操作: Conflicts(查看冲突)All Dependencies as List(列表形式…

数据仓库规范

模型设计 模型设计概述 为什么需要模型设计? Linux 的创始人 Torvalds 有 一段关于“什么才是优秀程序员”的话:“烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系”,其阐述了数据模型的重要性。有了适合业务和基础数据存…

python 中__init__ 作用

__init__的作用: (1)声明包 (2)预加载模块内容 (1)声明包 python项目结构中,普通目录下无__init__文件;而包下是有__init__文件的。 python 项目结构是按目录来组织的…

R语言结课及Matlab开始

R语言结课 我们R语言的学习这节课下课就结束了,接下来进行Matlab的学习。下面我会说一下R的结课任务及如何考试,以及我自己整理的Matlab安装教程。 R的结课作业:周二上课时提到的两个回归模型课程总结(老师说作业总结主要是作业…

如何运用java代码操作Redis

目录 1、java如何连接Redis? 1.1.启动Redis服务 1.2.导入相关Redis依赖 1.3.java代码进行连接 2、java连接Redis 2.1.String 2.1.1.设值 2.1.2.拿值 2.1.3.删除 2.1.4.修改 2.1.5.给键值对设置过期时间 2.1.6.获取键值对剩余的存活时间 2.2.哈希(Hash&a…

jacoco单测报告怎么同步到sonarqube

sonarqube支持多种代码覆盖率的报告展示,最常用的当属jacoco报告,那么jacoco的报告怎么同步到我们的sonarqube中呢? 我们先看看jacoco的offline模式(单元测试)报告生成的流程 根据上图我们需要生成单测报告&#xff0…

Apollo 应用与源码分析:CyberRT-工具与命令

概念 cyberRT包括一个可视化工具cyber_visualizer和两个命令行工具cyber_monitor和cyber_recorder。 注意:使用这些工具需要apollo docker环境 并且Cyber RT 中提供了一些命令工具,可以方便快捷的解决上述问题,本部分内容就主要介绍这些命…

Clion学习

看看Cmake是个什么? 他是个构建管理工具 一个比较OK的图 cmake_minimum_required(VERSION 3.15)#指定了最小的Cmake版本 project(jcdd)#指定了项目名称 set(CMAKE_CXX_STANDARD 14) add_executable(jcdd main.cpp)#输出可执行文件的名称安装第三方库&#xff…

图解来啦!机器学习工业部署最佳实践!10分钟上手机器学习部署与大规模扩展 ⛵

💡 作者:韩信子ShowMeAI 📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41 📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42 📘 本文地址:https://www.sho…

【MyBatis】动态SQL

if标签 CarMapper.java /*** 多条件查询* param brand 品牌* param guidePrice 指导价* param carType 汽车类型* return*/List<Car> selectByMultiCondition(Param("brand") String brand,Param("guidePrice") Double guidePrice,Param("car…