• m认知无线电网络中频谱感知的按需路由算法matlab仿真


    目录

    1.算法概述

    2.仿真效果预览

    3.MATLAB部分代码预览

    4.完整MATLAB程序


    1.算法概述

         使用无线电用户的频率范围在 9kHz 到 275GHz[3],由于无线通信环境中的干扰、信道衰落和无线电收发设备自身属性等的影响,大部分无线电设备只能工作在 50GHz 以下。在 3GHz 以上无线频谱资源利用率较低,3GHz 以下的利用率低于30%[4]。因此,频谱资源缺乏的主要原因为不合理的频谱资源管理政策。

          在低频段的频谱利用率较高,但在中频段和高频段利用率极低,固定的频谱管理政策是导致无线频谱资源短缺的真正原因,不是频谱资源不能满足用户需求。

           认知无线电让无线通信设备能够主动寻找可用信道,将未被使用的频谱资源进行再次利用,具体可通过认知无线电的智能化特性实现频率、时间和空间域不同频谱环境的信号感知,来充分满足用户使用需求。认知无线电本身存在学习能力,能够对通信环境中的变化做出分析和判断,然后能寻找到“频谱空穴”。

           当一个节点需要给网络中的其他节点传送信息时,如果没有到达目标节点的路由,则必须先以多播的形式发出RREQ(路由请求)报文。RREQ报文中记录着发起节点和目标节点的网络层地址,邻近节点收到RREQ,首先判断目标节点是否为自己。如果是,则向发起节点发送RREP(路由回应);如果不是,则首先在路由表中查找是否有到达目标节点的路由,如果有,则向源节点单播RREP,否则继续转发RREQ进行查找。
           按需路由选择(ODR)。ODR使用Cisco发现协议(CDP)来在分支(末节)路由器和中央路由器之间传输网络信息。与动态路由选择协议相比,ODR提供IP路由选择信息的开销非常小;而与静态路由相比,ODR的手工配置量更少。

           在大规模的路由网络中,例如在一个由省-地市-县-营业点组成的四级远程互连的路由网络中,如何维护大量的营业点路由器的直连子网路由和配置营业点的静态路由成为一个巨大的负担.此案例中说明了如何利用cisco On-Demand Routing (ODR)技术来优化这种大规模路由网络的一个设想.

    算法A文献:

     算法B:

          基础算法B是基础算法A的简化,路径的退避时延只是节点退避时延的累加。算法的具体解释,参考文献’基础算法B’。

    2.仿真效果预览

    matlab2013b仿真

     

    3.MATLAB部分代码预览

    1. SOP_fre = zeros(NUM_SOP,1);
    2. for i = 1:NUM_SOP
    3. SOP_fre(i) = 10*round(MAX_Fre/10*rand(1,1)) + MIN_Fre;%设置总共的频段情况20M~2400M,频段变换步进为10M
    4. end
    5. k = 0.01;%调整10M的频率段,需要时间10ms。
    6. Infor = cell(sqrt(Num_node),sqrt(Num_node));
    7. NUM_SOUR = 1;%源节点个数
    8. NUM_DENT = 1;%目标节点个数
    9. if sel_sna == 1
    10. Band_W = 2;%带宽统一为2M
    11. end
    12. if sel_sna == 2
    13. Band_Ws = cell(sqrt(Num_node),sqrt(Num_node));%定义每个节点的带宽
    14. SNRi = cell(sqrt(Num_node),sqrt(Num_node));%定义每个节点之间的信噪比
    15. Pi = cell(sqrt(Num_node),sqrt(Num_node));%定义每个节点之间数据传输的不成果概率
    16. end
    17. S_data = 0.3;%定义每个数据包的大小,通常,这个数据包的大小是相同的。
    18. P0 = 0.7;%表示节点P观察到某个频段可用同时Q也观察到这个频段可用的概率;
    19. qc = 0.8;%在Q没有观察到频段可用而P观察到频段可用的概率
    20. Pc = 0.1;%每个节点的冲突概率
    21. W0 = cell(sqrt(Num_node),sqrt(Num_node));%表示IEEE 802.11指数退避流程中退避窗口的最小值
    22. Stime = 100;%利用蒙特卡罗的仿真思想,对结果进行多次仿真,求平均
    23. for pp = 1:Stime
    24. pp
    25. %%
    26. %-----START:初始化产生节点,注意,这里,节点的显示用方格坐标显示,但是实际的位置信息均存储在每个节点的信息cell中
    27. %-----START:初始化产生节点,注意,这里,节点的显示用方格坐标显示,但是实际的位置信息均存储在每个节点的信息cell中
    28. %-----START:初始化产生节点,注意,这里,节点的显示用方格坐标显示,但是实际的位置信息均存储在每个节点的信息cell中
    29. %-----START:初始化产生节点,注意,这里,节点的显示用方格坐标显示,但是实际的位置信息均存储在每个节点的信息cell中
    30. %以下的代码仅仅为显示节点
    31. [X_view,Y_view,Index] = func_postion(Num_node);
    32. % figure(1);
    33. % for i = 1:sqrt(Num_node)
    34. % for j = 1:sqrt(Num_node)
    35. % plot(X_view(i,j),Y_view(i,j),'b.');hold on
    36. % end
    37. % end
    38. %下面的是产生的每个节点的基本信息
    39. %以下的信息是基于AOVD协议产生每个节点的基本信息
    40. %产生坐标信息
    41. POS = cell(sqrt(Num_node),sqrt(Num_node));
    42. X = zeros(sqrt(Num_node),sqrt(Num_node));
    43. Y = zeros(sqrt(Num_node),sqrt(Num_node));
    44. for i = 1:sqrt(Num_node)
    45. for j = 1:sqrt(Num_node)
    46. X(i,j) = RR*rand(1,1);Y(i,j) = RR*rand(1,1);
    47. POS{i,j} = [X(i,j),Y(i,j)];
    48. end
    49. end
    50. %产生每个节点的附近的所有的频段,每个节点附近的频段的个数是随机的1~NUM_SOP
    51. FRE = cell(sqrt(Num_node),sqrt(Num_node));
    52. for i = 1:sqrt(Num_node)
    53. for j = 1:sqrt(Num_node)
    54. tmp = randint(1,1,[1,NUM_SOP/2]); %产生该节点的频段数的个数
    55. Ind_sop = unique(randint(1,tmp,[1,NUM_SOP]));%产生对应个数的随机频段的编号
    56. FRE{i,j}= unique(SOP_fre(Ind_sop)); %每个节点附近的随机频点,构成SOP集合来模拟频谱分布的非均匀性
    57. end
    58. end
    59. %产生每个节点的数据流
    60. %分别定义单数据流;
    61. %-------多数据流:并行的数据流,交叉的数据流以及随机的数据流;
    62. [Data_flow,Starts,Ends] = func_data_flow(Num_node,sel_type);
    63. %产生每个节点的退避最大窗口
    64. for i = 1:sqrt(Num_node)
    65. for j = 1:sqrt(Num_node)
    66. W0{i,j} = 8-0.5*length(FRE{i,j});
    67. end
    68. end
    69. %定义每个节点的带宽
    70. for i = 1:sqrt(Num_node)
    71. for j = 1:sqrt(Num_node)
    72. Band_Ws{i,j} = 2 + (1-2*rand(1,1));%通常情况下节点的带宽都是相同的
    73. end
    74. end
    75. %定义每个节点之间的信噪比
    76. for i = 1:sqrt(Num_node)
    77. for j = 1:sqrt(Num_node)
    78. SNRi{i,j} = 5 + 2*rand(1,1);%每个路径的SNR包括固有的5db以及随机性差异
    79. end
    80. end
    81. %定义每个节点之间数据传输的不成概率
    82. for i = 1:sqrt(Num_node)
    83. for j = 1:sqrt(Num_node)
    84. Pi{i,j} = 0.5 + 0.5*rand(1,1);%满足高斯分布
    85. end
    86. end
    87. %-----OVER:节点的初始化信息结束,通过循环可知,每次的参数是时变的,符合实际情况
    88. %-----OVER:节点的初始化信息结束,通过循环可知,每次的参数是时变的,符合实际情况
    89. %-----OVER:节点的初始化信息结束,通过循环可知,每次的参数是时变的,符合实际情况
    90. %-----OVER:节点的初始化信息结束,通过循环可知,每次的参数是时变的,符合实际情况
    91. %%
    92. %%
    93. %%
    94. %%
    95. %%
    96. %-----START:通过基础算法A的相关方法计算目标路径的延迟
    97. %-----START:通过基础算法A的相关方法计算目标路径的延迟
    98. %-----START:通过基础算法A的相关方法计算目标路径的延迟
    99. %-----START:通过基础算法A的相关方法计算目标路径的延迟
    100. %根据之前定义的数据流,找到数据流的源节点和目标节点,并根据最小延迟算法确定实际的路径
    101. %[Data_flow,Starts,Ends]
    102. %根据已知的路径和SOP集合,计算每个交叉节点的冲突数
    103. %通过计算延迟,使每个节点的频谱进行重新分配,从而使延迟达到最小值,频谱从初始化产生的SOP集合中选择
    104. %计算初始的冲突数量,后面在动态分配频段的时候,进行实时的更新
    105. Num = zeros(sqrt(Num_node),sqrt(Num_node));
    106. Num = func_find_Num(Data_flow,FRE,Num_node);
    107. for i = 1:length(Starts)
    108. for j = 1:length(Data_flow{i})
    109. %首先计算节点延迟
    110. %首先计算节点延迟
    111. %不是目标节点,是中间节点
    112. %不是目标节点,是中间节点
    113. %不是目标节点,是中间节点
    114. if j < length(Data_flow{i})
    115. tmp1 = Data_flow{i}(:,j);
    116. tmp2 = Data_flow{i}(:,j+1);
    117. %首先判断当前节点下有误存在交集,如果没有频段的交集则丢去该帧
    118. if FRE{tmp1(1),tmp1(2)}(1) == FRE{tmp2(1),tmp2(2)}(1)
    119. Dswitching(j) = 0;
    120. if Num(tmp1(1),tmp1(2)) > 0
    121. Dbackoff(j) = W0{tmp1(1),tmp1(2)}/((1-Pc) * (1-(1-Pc)^(1/(Num(tmp1(1),tmp1(2))-1))));
    122. else
    123. Dbackoff(j) = 0;
    124. end
    125. else
    126. Dswitching(j) = 2*k*abs(FRE{tmp1(1),tmp1(2)}(1) - FRE{tmp2(1),tmp2(2)}(1));
    127. if Num(tmp1(1),tmp1(2)) > 0
    128. Dbackoff(j) = W0{tmp1(1),tmp1(2)}/((1-Pc) * (1-(1-Pc)^(1/(Num(tmp1(1),tmp1(2))-1))));
    129. else
    130. Dbackoff(j) = 0;
    131. end
    132. end
    133. %计算传输延迟
    134. Dtrans(j) = (1/(1-Pi{tmp1(1),tmp1(2)}))*S_data/( Band_Ws{tmp1(1),tmp1(2)}*log2(1 + SNRi{tmp1(1),tmp1(2)}) );
    135. %进行延迟信息反馈RREQ反馈
    136. DN(j) = Dswitching(j) + Dbackoff(j) + Dtrans(j) ;
    137. else%如果是目标节点
    138. %如果是目标节点
    139. %如果是目标节点
    140. tmp1 = Data_flow{i}(:,j);
    141. tmp2 = Data_flow{i}(:,j);
    142. indss1 = 1;
    143. %搜索最小DN值
    144. for hh1 = 1:length(FRE{tmp1(1),tmp1(2)})
    145. for hh2 = 1:length(FRE{tmp2(1),tmp2(2)})
    146. indss1 = indss1 + 1;
    147. %更新频段
    148. Fre_now = FRE{tmp1(1),tmp1(2)}(hh1);
    149. %更新冲突数
    150. Fre_nows = FRE;
    151. Fre_nows{tmp1(1),tmp1(2)} = Fre_now;
    152. Num = func_find_Num(Data_flow,FRE,Num_node);
    153. Dswitching(indss1) = 2*k*abs(FRE{tmp1(1),tmp1(2)}(hh1) - FRE{tmp2(1),tmp2(2)}(hh2));
    154. if Num(tmp1(1),tmp1(2)) > 0
    155. Dbackoff(indss1) = W0{tmp1(1),tmp1(2)}/((1-Pc) * (1-(1-Pc)^(1/(Num(tmp1(1),tmp1(2))-1))));
    156. else
    157. Dbackoff(indss1) = 0;
    158. end
    159. %计算传输延迟
    160. Dtrans(indss1) = (1/(1-Pi{tmp1(1),tmp1(2)}))*S_data/( Band_Ws{tmp1(1),tmp1(2)}*log2(1 + SNRi{tmp1(1),tmp1(2)}) );
    161. %进行延迟信息反馈RREQ反馈
    162. DNss(indss1) = Dswitching(indss1) + Dbackoff(indss1) + Dtrans(indss1) ;
    163. end
    164. end
    165. %找到最小值,给出最小值对应的频段及相关参数
    166. DN(j) = min(DNss);
    167. end
    168. Num = func_find_Num(Data_flow,FRE,Num_node);
    169. %计算路径延迟
    170. %计算路径延迟
    171. indss = 0;
    172. for pp1 = 1:length(FRE{tmp1(1),tmp1(2)})
    173. for pp2 = 1:length(FRE{tmp2(1),tmp2(2)})
    174. indss = indss + 1;
    175. H = length(Data_flow{i})-j+1;%多跳跳数
    176. for j2 = 1:H
    177. Dswitchingi_tmp(j2) = k*abs(FRE{tmp1(1),tmp1(2)}(pp1) - FRE{tmp2(1),tmp2(2)}(pp2));
    178. end
    179. Dswitchingi(indss) = sum(Dswitchingi_tmp);
    180. if mod(H,2) == 0%偶数
    181. for j2 = 1:H
    182. Uhx_tmp(j2) = (1-P0)*qc^((1-Pc^j2)/(1-Pc^2));
    183. end
    184. Uhx = sum(Uhx_tmp);
    185. end
    186. if mod(H,2) == 1%奇数
    187. for j2 = 1:H
    188. Uhx_tmp(j2) = (1-P0)*qc^((1-Pc^j2)/(1-Pc^2)) + P0*Pc^(j2-1);
    189. end
    190. Uhx = sum(Uhx_tmp);
    191. end
    192. Dbackoffi(indss) = (S_data/Band_Ws{tmp1(1),tmp1(2)}) * (floor((H+1)/2) - Uhx)/Uhx;
    193. DPss(indss) = Dswitchingi(indss) + Dbackoffi(indss);
    194. end
    195. end
    196. DP(j) = min(DPss);
    197. Droutej(j) = DP(j) + DN(j);
    198. end
    199. Droutej_i(:,i) = Droutej;
    200. end
    201. F_Droutej_i(:,:,pp) = Droutej_i;
    202. end
    203. %-----OVER:通过基础算法A的相关方法计算目标路径的延迟
    204. %-----OVER:通过基础算法A的相关方法计算目标路径的延迟
    205. %-----OVER:通过基础算法A的相关方法计算目标路径的延迟
    206. %-----OVER:通过基础算法A的相关方法计算目标路径的延迟
    207. %最后的延迟为F_Droutej_i进行求平均
    208. for i = 1:size(Droutej_i,1)
    209. for j = 1:size(Droutej_i,2)
    210. Droutej_i_average(i,j) = mean(F_Droutej_i(i,j,:));
    211. end
    212. end
    213. Droutess = mean(mean(Droutej_i_average));
    214. 01_044_m

    4.完整MATLAB程序

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

    V

  • 相关阅读:
    C语言学习之路(基础篇)—— 数组和字符串 02
    Diffusion模型
    了解网上展馆的特点和优势,网上展馆带来展示新方式
    2022-06-27 网工进阶(十二)IS-IS-开销类型、开销计算、LSP的处理机制、路由撤销、路由渗透
    C++ 性能优化指南 KurtGuntheroth 第5章 优化算法 摘录
    微信小程序获取openid流程
    linux性能诊断神器pstat
    oracle学习16-命令学习4
    Guitar Pro8最新2023中文免费吉他乐谱作曲练习工具
    web网页设计期末课程大作业:水果网站设计——HTML+CSS+JavaScript水果超市(带论文)
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/127969771