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


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB部分代码预览

    4.完整MATLAB程序


    1.算法描述

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

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

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

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

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

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

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

    接收部分:

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

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

    2.仿真效果预览

    matlab2022a仿真结果如下:

     

    3.MATLAB部分代码预览

    1. for jj1 = 1:length(EbN0)
    2. jj1
    3. Ind = Ind + 1;
    4. Err_Rate2 = zeros(1,TIMES);
    5. for jj2 = 1:TIMES
    6. jj2
    7. Num_NET = 5;%模拟子网的个数
    8. Lens = 500;%传感器采集数据长度
    9. %传感信息的净荷值相关参数
    10. A = -40;
    11. B = 120;
    12. Delta = 0.2;
    13. Ld = (ceil(log2((B-A)/Delta)));
    14. %传感子网数据帧的封装
    15. Preamble=[0,1,1,1,1,1,1,0];%帧前导码取特殊字符串01111110,表示帧同步,便于传感监控中心判断出帧的起始位置,
    16. %子网ID号,本案为5个子网,所以ID为三bit数据,但是为了具有扩展性,ID用四个bit表示
    17. ID =[0,0,0,0;
    18. 0,0,0,1;
    19. 0,0,1,0;
    20. 0,0,1,1;
    21. 0,1,0,0];
    22. %HEC为帧头校验码
    23. HEC = [0,1,0,1];
    24. %包头
    25. Head = [0,0,1,1,0,0,1,1];
    26. %address,地址,随着采集数据,地址逐渐加1
    27. %传感器类型,假设五个子网,每个子网就一种类型
    28. type1 = [0,0,0,1;
    29. 0,0,1,0;
    30. 0,0,1,1;
    31. 0,1,0,0;
    32. 0,1,0,1];
    33. %包尾
    34. Trail = [1,1,0,0,1,1,0,0];
    35. Bao_Size= 10;
    36. %最后的复用帧的相关参数
    37. 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];
    38. Separator = [0,1,0,1];
    39. FCS = [1,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1];
    40. N = 5;
    41. M = 5;
    42. %第一部分,系统发送部分
    43. %第一部分,系统发送部分
    44. %本案共有五个子网,所以模拟五组数据
    45. for nn = 1:Num_NET
    46. %模拟产生传感器采集到的数据,这里,为了模拟不同的码率,将采集的数据长度设置为不同
    47. y = func_sensor_samples(Lens,A,B);
    48. YY{nn} = y;
    49. if is_show(1) == 1
    50. figure(1);
    51. plot(y,'b');
    52. xlabel('times');
    53. ylabel('amplitude')
    54. title('模拟传感器采集到的数据');
    55. pause(0.1);
    56. end
    57. %光纤光栅传感信号的净荷值的二进制转换
    58. Lp = func_value2realvalue(y,A,B,Delta);
    59. if is_show(2) == 1
    60. figure(2);
    61. plot(Lp,'b');
    62. xlabel('times');
    63. ylabel('amplitude')
    64. title('模拟传感器采集到的数据的净荷值');
    65. pause(0.1);
    66. end
    67. %计算转换为二进制
    68. V2 = func_dec2bin(Lp,Ld);
    69. %将二进制转换为串行流
    70. Signal{nn} = (reshape(V2',size(V2,1)*size(V2,2),1))';%通过上面的步骤,我们模拟了实际要发送的二进制码流
    71. end
    72. ...................................................
    73. %对五个子网的数据进行时分复接
    74. %码率调整
    75. Out1 = func_Rate_sync(Signal3{1});
    76. Out2 = func_Rate_sync(Signal3{2});
    77. Out3 = func_Rate_sync(Signal3{3});
    78. Out4 = func_Rate_sync(Signal3{4});
    79. Out5 = func_Rate_sync(Signal3{5});
    80. %时分复接
    81. Out = func_tdma(Out1,Out2,Out3,Out4,Out5,Len_zhen);
    82. %传感复用帧
    83. tmps2 = [];
    84. tmps = [];
    85. for i = 1:length(Out)/(M*Len_zhen)
    86. tmps = [Sync,Separator,Out((i-1)*M*Len_zhen+1:i*M*Len_zhen),Separator,FCS];
    87. Len_zhen2 = length(tmps);
    88. tmps2 = [tmps2 tmps];
    89. end
    90. Signal4 = tmps2;
    91. %进行编码,编码矩阵为96*192,每次取80,并补充160作为虚拟填充符进行编码,共96个数据进行编码
    92. load H;
    93. load G;
    94. Trans_Signal = [];
    95. for i = 1:length(Signal4)/80
    96. Trans_data = [zeros(1,16),Signal4((i-1)*80+1:(i)*80)];
    97. %编码
    98. data_code = mod(Trans_data*G,2);
    99. %BPSK
    100. Trans_BPSK = 2*data_code-1;
    101. Len_code = length(Trans_BPSK);
    102. Trans_Signal = [Trans_Signal,Trans_BPSK];
    103. end
    104. %第二部分,信道,信道部分,由于是光纤传输,且您论文中没有详细说明这个部分内容,所以这里暂时仅考虑高斯白噪声
    105. %第二部分,信道,信道部分,由于是光纤传输,且您论文中没有详细说明这个部分内容,所以这里暂时仅考虑高斯白噪声
    106. sigma = sqrt(1./(10^(EbN0(Ind)/10)*0.5));
    107. Rec_Signal = Trans_Signal + sigma*randn(1,length(Trans_Signal));
    108. %第三部分,监控中心——接收端
    109. %第三部分,监控中心——接收端
    110. %译码
    111. R_Signal = [];
    112. for i = 1:length(Signal4)/80
    113. z_hat = func_Dec(Rec_Signal((i-1)*Len_code+1:i*Len_code),sigma,H,50);
    114. x_hat = z_hat(size(G,2)+1-size(G,1):size(G,2));
    115. R_Signal = [R_Signal,x_hat(17:end)'];%去掉16个填充符
    116. end
    117. if is_show(5) == 1
    118. st = func_eye(Trans_Signal);
    119. eyediagram(st,40)
    120. ylabel('信号幅度');
    121. title('原始信号眼图');
    122. pause(0.1);
    123. end
    124. if is_show(6) == 1
    125. st = func_eye(Rec_Signal);
    126. eyediagram(st,40)
    127. ylabel('信号幅度');
    128. title('接收带噪声干扰信号眼图');
    129. pause(0.1);
    130. end
    131. if is_show(7) == 1
    132. st = func_eye(R_Signal*2-1);
    133. eyediagram(st,40)
    134. ylabel('信号幅度');
    135. title('译码之后信号眼图');
    136. pause(0.1);
    137. end
    138. %解封装
    139. %通过搜索sync来确定每帧的帧头
    140. [R_Signal,Sync_pos] = func_find_sync(R_Signal,Sync);
    141. if is_show(4) == 1
    142. figure(4);
    143. plot(Sync_pos,'b');
    144. hold on;
    145. plot(find(Sync_pos>=40),Sync_pos(find(Sync_pos>=40)),'r*');
    146. hold off;
    147. xlabel('times');
    148. ylabel('amplitude')
    149. title('解封装sync位置');
    150. pause(0.1);
    151. end
    152. %判断当前帧位置能否检测到帧头
    153. if_sync = zeros(1,length(Out)/(M*Len_zhen));%这个变量用来存放是否检测到当前帧,如果为0,则该帧未检测到,直接丢弃,检测下一帧
    154. for i = 1:length(Out)/(M*Len_zhen)
    155. if Sync_pos(1+(i-1)*Len_zhen2) > 40
    156. if_sync(i)=1;
    157. end
    158. end
    159. %解封装
    160. tmps3 = [];
    161. tmps2 = [];
    162. tmps = [];
    163. for i = 1:length(Out)/(M*Len_zhen)
    164. if if_sync(i) == 1
    165. tmps = R_Signal((i-1)*Len_zhen2+1:(i)*Len_zhen2);
    166. else
    167. tmps = zeros(1,Len_zhen2);% 如果该帧没有检测到,那么直接赋值0
    168. end
    169. %解封装
    170. tmps2 = tmps(length(Sync)+length(Separator)+1:M*Len_zhen+length(Sync)+length(Separator));
    171. tmps3 = [tmps3 tmps2];
    172. end
    173. Outs = tmps3;
    174. %数字分接单元
    175. [I1,I2,I3,I4,I5] = func_tdma2(Outs,Len_zhen,M);
    176. %对五个子网的数据进行时分复接
    177. %码率调整
    178. Outr{1} = func_Rate_sync(I1);
    179. Outr{2} = func_Rate_sync(I2);
    180. Outr{3} = func_Rate_sync(I3);
    181. Outr{4} = func_Rate_sync(I4);
    182. Outr{5} = func_Rate_sync(I5);
    183. %将5路传感帧转换为数据帧,进一步拆封
    184. %由数据帧转换为传感帧
    185. for nn = 1:Num_NET
    186. tmps2 = [];
    187. tmps = [];
    188. LL = length(Preamble)+length(ID(nn,:))+length(HEC);
    189. for i = 1:length(Signal2{nn})/(N*Len_bao)
    190. tmps = Outr{nn}((i-1)*Len_zhen+1:i*Len_zhen);
    191. tmps2 = [tmps2 tmps(LL+1:end)];
    192. end
    193. Outr2{nn} = tmps2;
    194. end
    195. %将数据包中数据提取
    196. %Signal即为实际要发送的二进制码流
    197. %产生数据包数据包,这里,我们假设每个数据包中为10个采样数据,即100bit数据
    198. address = 0;
    199. for nn = 1:Num_NET
    200. tmps2 = [];
    201. tmps = [];
    202. LL = length(Head)+length(address2)+length(type1(nn,:));
    203. for i = 1:length(Signal{nn})/(Bao_Size*Ld)
    204. tmps = [Outr2{nn}((i-1)*Len_bao+1:i*Len_bao)];
    205. tmps2 = [tmps2 tmps(LL+1:end-length(Trail))];
    206. end
    207. Outr3{nn} = tmps2;
    208. end
    209. %误码率统计在转换为十进制之前计算
    210. [nberr1,rat1] = biterr(Outr3{1},Signal{1});
    211. [nberr1,rat2] = biterr(Outr3{2},Signal{2});
    212. [nberr1,rat3] = biterr(Outr3{3},Signal{3});
    213. [nberr1,rat4] = biterr(Outr3{4},Signal{4});
    214. [nberr1,rat5] = biterr(Outr3{5},Signal{5});
    215. Err_Rate0(jj2) = (rat1+rat2+rat3+rat4+rat5)/5;
    216. Err_Rate1(jj2) = rat1;
    217. Err_Rate2(jj2) = rat2;
    218. Err_Rate3(jj2) = rat3;
    219. Err_Rate4(jj2) = rat4;
    220. Err_Rate5(jj2) = rat5;
    221. end
    222. Err_Rate0s(Ind) = mean(Err_Rate0);
    223. Err_Rate1s(Ind) = mean(Err_Rate1);
    224. Err_Rate2s(Ind) = mean(Err_Rate2);
    225. Err_Rate3s(Ind) = mean(Err_Rate3);
    226. Err_Rate4s(Ind) = mean(Err_Rate4);
    227. Err_Rate5s(Ind) = mean(Err_Rate5);
    228. Q0(Ind) = sqrt(2)*erfcinv(2*Err_Rate0s(Ind)/10);
    229. Q1(Ind) = sqrt(2)*erfcinv(2*Err_Rate1s(Ind)/10);
    230. Q2(Ind) = sqrt(2)*erfcinv(2*Err_Rate2s(Ind)/10);
    231. Q3(Ind) = sqrt(2)*erfcinv(2*Err_Rate3s(Ind)/10);
    232. Q4(Ind) = sqrt(2)*erfcinv(2*Err_Rate4s(Ind)/10);
    233. Q5(Ind) = sqrt(2)*erfcinv(2*Err_Rate5s(Ind)/10);
    234. disp('over a cycle');
    235. end
    236. 01_068_m

    4.完整MATLAB程序

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

    V

  • 相关阅读:
    [Python] 面向对象(一)
    python---装饰器
    git冲突解决
    Redis的高可用
    Linux系统OpenSSH_9.7p1升级详细步骤
    一文弄懂Hive中谓词下推(on与where的区别)
    猿创征文|Python-sklearn机器学习快速入门:你的第一个机器学习实战项目
    Java全栈工程师:技术与视野的双重拓展
    day03_pandas_demo
    深入了解ECharts
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128024051