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


    目录

    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预览

    1. ....................................................
    2. %产生信号
    3. %S | 16bit长度的节点需要 | 8bit长度的数据类型 | 64bit长度的数据内容 | #
    4. %其中“S”对应的ASCII码为: 01010011
    5. %“#”对应的ASCII码为 : 0010 0011
    6. X = 0;
    7. Y = 0;
    8. FRAME = [];
    9. %切换处理延迟时间t
    10. t = 20;
    11. %能量强度门限值T
    12. T = 8;
    13. PER = 10;%每10帧加入I个位置信息
    14. for i = 1:N
    15. figure(1);
    16. plot(X3g,Y3g,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',10);
    17. text(X3g+2,Y3g+2,'3G Device');
    18. hold on
    19. plot(Xwf,Ywf,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',10);
    20. text(Xwf+2,Ywf+2,'WIFI Device');
    21. %S | 16bit长度的节点需要 | 8bit长度的数据类型 | 64bit长度的数据内容 | #
    22. %S
    23. S = [0,1,0,1,0,0,1,1];
    24. %16bit长度的节点需要
    25. Index = func_dec2bin(i,16);
    26. %8bit长度的数据类型
    27. Type = [0,0,1,1,0,0,1,1];
    28. %字节数
    29. Nums = [0,0,0,0,1,1,1,1];
    30. %64bit长度的数据内容
    31. if mod(i,10) == 2
    32. i
    33. %模拟简单的运动
    34. X = X + (7 + rand(1,1))/10;
    35. Y = Y + (4 + 6*rand(1,1))/10;
    36. Xbin = func_dec2bin(X,32);
    37. Ybin = func_dec2bin(Y,32);
    38. Data = [Xbin,Ybin];
    39. else
    40. Data = (rand(1,64)>=0.5);
    41. end
    42. %#
    43. J = [0,0,1,0,0,0,1,1];
    44. %产生最后发送的帧格式数据
    45. tmps = [S,Index,Type,Nums,Data,J];
    46. FRAME= [FRAME,tmps];
    47. plot(X,Y,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','y','MarkerSize',10);
    48. text(X+2,Y+2,'User Device');
    49. axis([0,120,0,120]);
    50. drawnow;
    51. hold off
    52. end
    53. X0 =[];
    54. Y0 =[];
    55. X =[];
    56. Y =[];
    57. %%
    58. %开始切换算法
    59. f1 = zeros(1,N);
    60. f2 = zeros(1,N);
    61. f = zeros(1,N);
    62. f0 = zeros(1,N);
    63. CUT = zeros(1,N);
    64. lemda1 = 0.6;
    65. lemda2 = 1 - lemda1;
    66. %初始状态假设为3G网络
    67. STATE = zeros(1,N);%13G;2:WIFI
    68. STATE(1) = 2;
    69. count = 0;
    70. for i = 1:N
    71. i
    72. %模拟环境影响损耗,用随机的方式产生
    73. EnvLoss3g = 15 + randn;
    74. EnvLosswf = 12 + 4*randn;
    75. %将接收到的数据保存到寄存器中
    76. Reg = FRAME(length(tmps)*(i-1)+1:length(tmps)*i);
    77. %检测S,来识别是否是帧的起始位
    78. for j = 1:length(Reg)
    79. if Reg(1) == S(1) && Reg(2) == S(2) && Reg(3) == S(3) && Reg(4) == S(4) &&...
    80. Reg(5) == S(5) && Reg(6) == S(6) && Reg(7) == S(7) && Reg(8) == S(8)
    81. flag = 1;%说明检测到帧了
    82. else
    83. flag = 0;%说明没有检测到帧
    84. end
    85. end
    86. %如果检测帧头了,则开始位置信息的计算
    87. if i > 1
    88. if flag == 1
    89. %获得序列序号
    90. INDEXbin = Reg(9:9+15);
    91. INDEXdec = func_bin2dec2(INDEXbin);
    92. if mod(INDEXdec,10) == 2
    93. %转换为十进制
    94. X0 = Reg(33+8:33+31+8);
    95. Y0 = Reg(65+8:65+31+8);
    96. X = func_bin2dec(X0);
    97. Y = func_bin2dec(Y0);
    98. else
    99. %转换为十进制
    100. X0 = X0;
    101. Y0 = Y0;
    102. X = func_bin2dec(X0);
    103. Y = func_bin2dec(Y0);
    104. end
    105. %*****************************************************************************
    106. %计算3G距离
    107. L3g= sqrt((X - X3g)^2 + (Y - Y3g)^2);
    108. %计算WIFI距离
    109. Lwf= sqrt((X - Xwf)^2 + (Y - Ywf)^2);
    110. %距离切换
    111. if Lwf >= L3g & STATE(i-1) == 1
    112. f2(i) = 0;%3G -> WIFI
    113. end
    114. if Lwf >= L3g & STATE(i-1) == 2
    115. f2(i) = 1;%WIFI -> WIFI
    116. end
    117. if Lwf < L3g & STATE(i-1) == 1
    118. f2(i) = 1;%3G -> 3G
    119. end
    120. if Lwf < L3g & STATE(i-1) == 2
    121. f2(i) = 0;%WIFI -> 3G
    122. end
    123. %计算3G能量
    124. %计算当前位置3G信号能量的衰减,慢衰减
    125. %快衰减,这里暂时不考虑快衰减
    126. Loss3g = func_Power_Attenuation_3G(Fre_wf,Lwf,EnvLoss3g);
    127. %计算信号能量
    128. POWER_3G = Power_3g - Loss3g;
    129. %计算WIFI能量
    130. %计算当前位置WIFI信号能量的衰减,慢衰减
    131. %快衰减,这里暂时不考虑快衰减
    132. Losswf = func_Power_Attenuation_WIFI(Fre_3g,L3g,EnvLosswf);
    133. %计算信号能量
    134. POWER_WIFI = Power_wf - Losswf;
    135. %*****************************************************************************
    136. %切换判决
    137. %如果计算能量均小于T,那么不进行切换,保持原来的状态;
    138. if (POWER_3G < T & POWER_WIFI < T)
    139. f1(i) = 1;%3G->WIFI
    140. end
    141. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    142. if (POWER_3G < T & POWER_WIFI >= T) & STATE(i-1) == 2
    143. f1(i) = 0;%WIFI->WIFI
    144. end
    145. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    146. if (POWER_3G < T & POWER_WIFI >= T) & STATE(i-1) == 1
    147. f1(i) = 1;%3G->WIFI
    148. end
    149. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    150. if (POWER_3G >= T & POWER_WIFI < T) & STATE(i-1) == 2
    151. f1(i) = 1;%WIFI->3G
    152. end
    153. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    154. if (POWER_3G >= T & POWER_WIFI < T) & STATE(i-1) == 1
    155. f1(i) = 0;%3G->3G
    156. end
    157. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    158. if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G > POWER_WIFI) & STATE(i-1) == 1
    159. f1(i) = 0;%3G->3G
    160. end
    161. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    162. if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G > POWER_WIFI) & STATE(i-1) == 2
    163. f1(i) = 1;%WIFI->3G
    164. end
    165. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    166. if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G <= POWER_WIFI) & STATE(i-1) == 1
    167. f1(i) = 1;%3G->WIFI
    168. end
    169. %如果其中一个超过门限值,一个没有超过没限制,那么切换到对应能量大的网络上;
    170. if (POWER_3G >= T & POWER_WIFI >= T) & (POWER_3G <= POWER_WIFI) & STATE(i-1) == 2
    171. f1(i) = 0;%WIFI->WIFI
    172. end
    173. %计算最后的切换值
    174. f(i) = lemda1*f1(i) + lemda2*f2(i);
    175. %引入软切换判决
    176. if i > t
    177. Check(i) = mean(f(i-t+1:i));
    178. Check2 = mean(Check(i-t+1:i));
    179. f0(i) =(sign(Check2-0.3)+1)/2;
    180. else
    181. Check(i) = mean(f(1:i));
    182. Check2 = mean(Check(1:i));
    183. f0(i) =(sign(Check2-0.3)+1)/2;
    184. end
    185. else
    186. %如果没有检测当前的帧头信息,则保持原切换状态
    187. f(i) = f(i-1);
    188. f0(i) = f(i);
    189. end
    190. %计算累计切换次数
    191. if f0(i) ~= f0(i-1)
    192. count = count + 1;
    193. end
    194. Ttmps(i) = 0.5*max(POWER_3G,POWER_WIFI);
    195. if i > t
    196. T = mean(Ttmps(i-t+1:i));
    197. else
    198. T = mean(Ttmps(1:i));
    199. end
    200. end
    201. %统计累积切换次数
    202. CUT(i) = count;
    203. end
    204. 01_087_m

    4.完整MATLAB程序

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

    V

  • 相关阅读:
    十二月第一场雪
    内存函数
    Linux下安装Redis
    c strtok和strtok_s
    数据结构-红黑树
    【MineCraft】-- Mod制作物品与方块
    【Vue + Koa 前后端分离项目实战】使用开源框架==>快速搭建后台管理系统 -- part2 后端新增期刊功能实现
    【Vue3响应式原理#02】Proxy and Reflect
    Stable Diffusion代码简介
    Linux Vim编辑器的基本使用
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/127870097