m基于自适应门限软切换的3G和Wifi垂直切换算法的matlab仿真

news2025/7/21 4:18:50

目录

1.算法概述

2.仿真效果预览

3.核心MATLAB预览

4.完整MATLAB程序


1.算法概述

         这里还是考虑位置信息和强度联合切换判决的方法,如果你的设备没法提供具体的位置信息的话,那么就把位置信息的权值设置为0。强度判决的权值设置为1即可。

        需要传输的数据格式如下:

一个字节为8个bit,

因此,一个传输帧,基本格式为:

S   |  16bit长度的节点需要   |  8bit长度的数据类型   |  64bit长度的数据内容   |  #

其中“S”对应的ASCII码为01010011

“#”对应的ASCII码为0010 0011

这里,我们将数据帧结构的产生做如下的设置,

即每次发送一帧数据,然后每过N帧,发送一帧带有位置信号作为数据的帧数据。

目前的算法流程如下:

        第1,预先设置切换处理延迟时间t和能量强度门限值T;

        第2,分别对3G网络和WIFI网络的信号能量进行计算;

        第3,根据传输得到的数据帧中提取对应的位置信号;

        第4,判决:

        如果计算能量均小于T,那么不进行切换,保持原来的状态;

        如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;

        如果两个能量值均大于门限值,那么再做如下的判决:

------------------------------------------------------------------------------------------------

       如果3G网络的信号强度大于WIFI网络的信号强度,系统首先接入到3G网络,然后在时间t之后,即完成3G的连接之后,断开与WIFI的连接,完成从WIFI到3G网络的切换。 

        同样道理,如果WIFI网络的信号强度大于3G网络的信号强度,系统首先接入到WIFI网络,然后在时间t之后,即完成WIFI的连接之后,断开与3G的连接,完成从3G到WIFI网络的切换。当3G网络和WIFI信号强度接近的时候,则维持在原先的网络进行数据的传输,并进行切换处理。由于信号能量强度会出现各种变化的情况,比如当3G信号强度突然大于WIFI的信号强度(假设网络的信号强度是不变,而外部的干扰发生突然改变),并持续一段时间,然后此时,设置距离3G网络更近些,因此当出现这种情况的时候,设备不应该发生突然的切换。

         根据这个问题,本算法加入了位置信号的判决:

 

2.仿真效果预览

MATLAB2022A仿真结果:

 

 

 

3.核心MATLAB预览

....................................................
 
%产生信号
%S   |  16bit长度的节点需要   |  8bit长度的数据类型   |  64bit长度的数据内容   |  #
%其中“S”对应的ASCII码为: 01010011
%“#”对应的ASCII码为    : 0010 0011
X     = 0;
Y     = 0;
FRAME = [];
%切换处理延迟时间t
t     = 20;
%能量强度门限值T
T     = 8;
PER   = 10;%每10帧加入I个位置信息
 
 
for i = 1:N
    figure(1);
    plot(X3g,Y3g,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',10);
    text(X3g+2,Y3g+2,'3G Device');
    hold on
    plot(Xwf,Ywf,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',10);
    text(Xwf+2,Ywf+2,'WIFI Device');
    %S | 16bit长度的节点需要 | 8bit长度的数据类型 | 64bit长度的数据内容 | #
    %S
    S     = [0,1,0,1,0,0,1,1];
    %16bit长度的节点需要
    Index = func_dec2bin(i,16);
    %8bit长度的数据类型
    Type  = [0,0,1,1,0,0,1,1];
    %字节数
    Nums  = [0,0,0,0,1,1,1,1];
    
    %64bit长度的数据内容
    if mod(i,10) == 2
       i
       %模拟简单的运动 
       X    = X + (7 +   rand(1,1))/10;
       Y    = Y + (4 + 6*rand(1,1))/10;
       Xbin = func_dec2bin(X,32);
       Ybin = func_dec2bin(Y,32);
       Data = [Xbin,Ybin];
    else
       Data = (rand(1,64)>=0.5); 
    end
    %#
    J     = [0,0,1,0,0,0,1,1];
    %产生最后发送的帧格式数据
    tmps = [S,Index,Type,Nums,Data,J];
    FRAME= [FRAME,tmps];
    
    plot(X,Y,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','y','MarkerSize',10);
    text(X+2,Y+2,'User Device');
    axis([0,120,0,120]);
    drawnow;
    hold off
end
 
X0 =[];
Y0 =[];
X  =[];
Y  =[];
%%
%开始切换算法
f1       = zeros(1,N);
f2       = zeros(1,N);
f        = zeros(1,N);
f0       = zeros(1,N);
CUT      = zeros(1,N);
lemda1   = 0.6;
lemda2   = 1 - lemda1;
%初始状态假设为3G网络
STATE    = zeros(1,N);%1:3G;2:WIFI
STATE(1) = 2;  
count    = 0;
for i = 1:N
    i
    %模拟环境影响损耗,用随机的方式产生
    EnvLoss3g = 15 + randn;
    EnvLosswf = 12 + 4*randn;
    %将接收到的数据保存到寄存器中
    Reg = FRAME(length(tmps)*(i-1)+1:length(tmps)*i);
    %检测S,来识别是否是帧的起始位
    for j = 1:length(Reg)
        if Reg(1) == S(1) && Reg(2) == S(2) && Reg(3) == S(3) && Reg(4) == S(4) &&...
           Reg(5) == S(5) && Reg(6) == S(6) && Reg(7) == S(7) && Reg(8) == S(8)     
           flag = 1;%说明检测到帧了
        else
           flag = 0;%说明没有检测到帧
        end
    end
    %如果检测帧头了,则开始位置信息的计算
    if i > 1
        if flag == 1
            %获得序列序号 
            INDEXbin = Reg(9:9+15);
            INDEXdec = func_bin2dec2(INDEXbin);
            if  mod(INDEXdec,10) == 2
                %转换为十进制
                X0 = Reg(33+8:33+31+8);
                Y0 = Reg(65+8:65+31+8);
                X  = func_bin2dec(X0);
                Y  = func_bin2dec(Y0);
            else
                %转换为十进制
                X0 = X0;
                Y0 = Y0;
                X  = func_bin2dec(X0);
                Y  = func_bin2dec(Y0);
            end
            
            %*****************************************************************************
            %计算3G距离
            L3g= sqrt((X - X3g)^2 + (Y - Y3g)^2);
            %计算WIFI距离
            Lwf= sqrt((X - Xwf)^2 + (Y - Ywf)^2);
            %距离切换
            if Lwf >= L3g & STATE(i-1) == 1
               f2(i) = 0;%3G -> WIFI 
            end
            if Lwf >= L3g & STATE(i-1) == 2
               f2(i) = 1;%WIFI -> WIFI 
            end       
            if Lwf < L3g  & STATE(i-1) == 1
               f2(i) = 1;%3G -> 3G 
            end
            if Lwf < L3g  & STATE(i-1) == 2
               f2(i) = 0;%WIFI -> 3G 
            end      
            %计算3G能量
            %计算当前位置3G信号能量的衰减,慢衰减
            %快衰减,这里暂时不考虑快衰减
            Loss3g = func_Power_Attenuation_3G(Fre_wf,Lwf,EnvLoss3g);
            %计算信号能量
            POWER_3G = Power_3g - Loss3g;
            
            %计算WIFI能量
            %计算当前位置WIFI信号能量的衰减,慢衰减
            %快衰减,这里暂时不考虑快衰减
            Losswf = func_Power_Attenuation_WIFI(Fre_3g,L3g,EnvLosswf);
            %计算信号能量
            POWER_WIFI = Power_wf - Losswf;
 
            %*****************************************************************************
            %切换判决
            %如果计算能量均小于T,那么不进行切换,保持原来的状态;
            if (POWER_3G < T & POWER_WIFI < T)
                f1(i) = 1;%3G->WIFI
            end   
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G < T & POWER_WIFI >= T) & STATE(i-1) == 2 
                f1(i) = 0;%WIFI->WIFI
            end 
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G < T & POWER_WIFI >= T) & STATE(i-1) == 1 
                f1(i) = 1;%3G->WIFI
            end                 
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G >= T & POWER_WIFI < T) & STATE(i-1) == 2 
                f1(i) = 1;%WIFI->3G
            end 
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G >= T & POWER_WIFI < T) & STATE(i-1) == 1 
                f1(i) = 0;%3G->3G
            end            
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G > POWER_WIFI) & STATE(i-1) == 1 
                f1(i) = 0;%3G->3G
            end                 
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G > POWER_WIFI) & STATE(i-1) == 2 
                f1(i) = 1;%WIFI->3G
            end               
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G <= POWER_WIFI) & STATE(i-1) == 1 
                f1(i) = 1;%3G->WIFI
            end                 
            %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;    
            if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G <= POWER_WIFI) & STATE(i-1) == 2 
                f1(i) = 0;%WIFI->WIFI
            end              
            %计算最后的切换值
            f(i) = lemda1*f1(i) + lemda2*f2(i);
            %引入软切换判决
            if i > t
               Check(i) = mean(f(i-t+1:i)); 
               Check2   = mean(Check(i-t+1:i)); 
               f0(i)    =(sign(Check2-0.3)+1)/2;
            else
               Check(i) = mean(f(1:i));  
               Check2   = mean(Check(1:i));
               f0(i)    =(sign(Check2-0.3)+1)/2;
            end
        else
            %如果没有检测当前的帧头信息,则保持原切换状态 
            f(i)  = f(i-1);  
            f0(i) = f(i);  
        end
        %计算累计切换次数
        if f0(i) ~= f0(i-1)
           count = count + 1;
        end
        Ttmps(i) = 0.5*max(POWER_3G,POWER_WIFI);
        if i > t
           T = mean(Ttmps(i-t+1:i)); 
        else
           T = mean(Ttmps(1:i));  
        end
    end
    %统计累积切换次数
    CUT(i) = count;
end
01_087_m

4.完整MATLAB程序

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

V

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

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

相关文章

外业精灵,在水土流失监测野外调查工作中的应用

常规的水土流失野外调查技术已难以满足现阶段区域水土流失监测工作的需求。 为探索高效、精准、高质量的水土流失数据采集技术&#xff0c;作者以山东沂蒙山泰山国家级重点治理区蒙阴县为例&#xff0c;以小流域或公里网格为调查单元&#xff0c;通过分析外业精灵的技术优势&a…

webpack高级配置

摇树&#xff08;tree shaking&#xff09; 我主要是想说摇树失败的原因&#xff08;tree shaking 失败的原因&#xff09;&#xff0c;先讲下摇树本身效果 什么是摇树&#xff1f; 举个例子 首先 webpack.config.js配置 const webpack require("webpack");/**…

Educational Codeforces Round 138 (Rated for Div. 2)

A&#xff1a;思维 题意&#xff1a;给一定的N*N的板子&#xff0c;里面放有一些乌鸦&#xff0c;这些乌鸦会攻击自己的所在行与所在列&#xff0c;问给定一个数量的乌鸦&#xff0c;问是否能够移动某只乌鸦&#xff0c;使得形成和平局面&#xff1f; 方法&#xff1a;我们发现…

股票涨跌量化怎样进行策略分析?

股票涨跌量化其实是通过Python调用Tushare库计算深证成指实时&#xff0c;对股票的成交量涨跌幅&#xff0c;主要是通过相关分析选择合适的成交量涨跌幅来计算的一种量化策略分析方法&#xff0c;也可以根据绘制股票的成交量涨跌幅度与当日股价的涨跌幅描绘出来。如果我们想快速…

目标检测论文解读复现之八:基于YOLOv5s的滑雪人员检测研究

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Unity使用NaveMesh实现第一人称视角移动

系列文章目录 Navemesh寻路系列文章 文章目录 目录 系列文章目录 文章目录 前言 一、NavMeshPath是什么&#xff1f; 二、使用步骤 1.引入库 2.读入数据 总结 前言 navemesh已经大量使用到游戏中&#xff0c;但大部分寻路都是使用SetDestination函数&#xff0c;给予一个目标…

SpringBoot+Vue项目大学校园防疫与服务系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JDK版…

C++初阶 Vector模拟实现

q. > 作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客介绍&#xff1a;本篇博客会模拟Vector实现 学习目标 模拟默认函数实现模拟迭代器实现模拟容器大小相关函数模拟修改内容相关函数模拟访问容器相关函数 我…

xss挑战之旅11-19关

文章目录前言第11关&#xff1a;referer第12关&#xff1a;User-Agent第13关&#xff1a;cookie第14关&#xff1a;exif xss第15关&#xff1a;ng-include第16关第17关第18关第19关&#xff1a;flash xss前言 靶场&#xff1a;XSS挑战之旅 1-10关 11-20关 第11关&#xff1a;r…

『LeetCode|每日一题』---->颜色填充

目录 1.每日一句 2.作者简介 『LeetCode|每日一题』颜色填充 1.每日一题 2.解题思路 2.1 思路分析&#xff08;DFS&#xff09; 2.2 核心代码 2.3 完整代码 2.4 运行结果 1.每日一句 我的宇宙为你藏着无数个星球 2.作者简介 &#x1f3e1;个人主页&#xff1a;XiaoXiaoChe…

Git之路

文章目录指南介绍实战任务一&#xff1a;sb项目任务二&#xff1a;idea实战任务三&#xff1a;分支实战(待续)指南 如果你想在简历上写“会常用的Git的命令“&#xff0c;那么这篇文章值得你要看&#xff0c;那我们需要掌握什么呢&#xff1f;其实会简单的操作就行&#xff0c…

Matplotlib绘图-快速上手可视化工具

Matplotlib快速上手一、初识Matplotlib1.1 认识Matplotlib的图像结构1.2 绘制一个折线图二、给图像添加修饰2.1 自定义x的刻度2.2一图多线2.3一图绘制多个坐标系子图三、主流图形的绘制3.1绘制柱状图一、初识Matplotlib 是Python最常见的可视化工具之一 1.1 认识Matplotlib的…

csrf跨站请求伪造

文章目录csrf跨站请求伪造1、前戏2、csrf校验2.1、from表单如何符合校验2.2、ajax如何符合校验3、csrf相关装饰器FBVCBVcsrf跨站请求伪造 1、前戏 """ 钓鱼网站搭建一个跟正规网站一摸一样的界面&#xff08;中国银行&#xff09;用户进入到我们的网站&#x…

HyperLynx(三十)高速串行总线仿真(二)

高速串行总线仿真&#xff08;二&#xff09; 仿真实例 1.探索多层板中的PCI-E串行通道 2.设置叠层以减小损耗 3.分析通道的不同配置对损耗的影响 4.检测驱动端规范 5.检查接收器规范 6.通过仿真得出整个通道的驱动约束限制 1.探索多层板中的PCI-E串行通道 在本节练习中&…

人工智能学习:Microsoft COCO数据集读取(7)

Microsoft COCO&#xff08;Common Objects in Context&#xff09;是微软研发维护的一个大型的数据集。包含了30多万张图片和91个目标分类。可用于目标识别&#xff08;Object Detection&#xff09;、场景感知&#xff08;Penoptic Segmentation&#xff09;、语义分割&#…

【数据结构】——单链表

目录 1.链表 1.1 链表的概念及结构 1.2 链表的分类 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 1.3实现一个单链表&#xff08;无头单项非循环链表增删查改的实现&#xff09; 1.链表结构的创建 2.创建一个节点 3.创建一个链表 4.打印链表 5…

解读JVM级别本地缓存Caffeine青出于蓝的要诀 —— 缘何会更强、如何去上手

大家好&#xff0c;又见面了。 在前面的几篇文章中&#xff0c;我们一起聊了下本地缓存的动手实现、本地缓存相关的规范等&#xff0c;也聊了下Google的Guava Cache的相关原理与使用方式。比较心急的小伙伴已经坐不住了&#xff0c;提到本地缓存&#xff0c;怎么能不提一下“地…

软考 - 程序语言设计

程序设计语言基本概述 程序设计语言是为了书写计算机程序而人为设计的符号语言&#xff0c;用于对计算过程进行 描述、组织和推导。 低级语言&#xff1a;机器语言&#xff08;计算机硬件只能识别0和1的指令序列&#xff09;&#xff0c;汇编语言。 高级语言&#xff1a;功能…

从http请求过程分析为何不同业务的http请求都可以使用默认的缺省端口80,8080等

问题: http上传请求时url地址中一般无显示指定端口号&#xff0c;这时会使用默认的80端口&#xff1b;但是可能不止一个业务需要用到http请求&#xff0c;技术上web服务端那边肯定无法根据业务逻辑的数据格式去分别解析区分它们&#xff1b;因为业务是事先无法预知的&#xff…

【Spring Cloud实战】Consul服务注册与发现

个人博客上有很多干货&#xff0c;欢迎访问&#xff1a;https://javaxiaobear.gitee.io/ 1、简介 https://www.consul.io/docs/intro Consul is a service mesh solution providing a full featured control plane with service discovery, configuration, and segmentation f…