• m基于matlab的无线光通信CDMA闭环链路功率控制算法仿真,对比了OOK,2PPM,4PPM,8PPM,16PPM


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB部分代码预览

    4.完整MATLAB程序


    1.算法描述

            在光通信领域,多址技术主要有WDM(波分复用)、TDM(时分复用)及OCDMA(光码分多址)三种方式。OCDMA技术从70年代中期开始出现,现在引起了人们的广泛重视。将CDMA(码分多址)技术用于光通信中,不仅保持了CDMA技术在无线电中的抗干扰、保密、软容量及网络协议简单等特性,而且可以利用光载体的巨大带宽。

           因此,CDMA技术和光通信的结合存在着优势互补。 本文围绕OCDMA系统及其关键技术展开研究工作。在本文中,我们对OCDMA的关键技术进行了理论分析,提出了几种新的地址码,提出了一些新方案来改善系统性能。同时,开展了时域非相干OCDMA的实验工作。

           编写无线光通信-CDMA中闭环链路的功率控制误差(Power control error)程序,其定义参考文献An Analytical Approach for Closed-Loop Power Control Error Estimations in CDMA Cellular Systems中详细说明了。仿真出功率控制误差(Power control error)在OOK 2PPM 4PPM 8PPM 16PPM的不同调制方式下;以及功率控制误差(Power control error)在1/4code rate, 1/2 code rate, 3/4 code rate不同码率下与BER的关系。通过给每个用户指定互相关为0的两个地址码分别发送1和0信号以及在接收端采用差分检测技术,避免了OOK(开关键控)光通信系统中0不发送光脉冲和OOK常规检测方式下最佳判决门限必须根椐用户数等外界环境而改变,从而提高了系统性能和降低了系统的复杂度。通过引入OPPM(重叠脉冲脉位调制)方式,进一步提高了系统的传输效率。 

            这里我们首先建立一个cdma小区通信环境,然后根据光通信代码在CDMA的基础上,使用光通信进行通信,然后在此基础上加入功率工作,不同的调制方式以及不同的码率等进行仿真。

           加入功率控制PCE模块,其基本结构如下所示:

     对OOK,2PPM,4PPM,8PPM,16PPM五种方法进行仿真。

            光CDMA方式是基于OTDM和WDM之上的一种多路存取方式,它可以使相同带宽和比特率的光信号携带更多的信息。在光纤CDMA(OCDMA)中,每一位数据都被一个序列编码,每个用户都有一个单独的序列,在发送端,对要传输的数据的序列码进行光正交编码,然后实现多个用户共享同一光纤信道;在接收端,用与发送端相同的地址码进行光正交解码,恢复原用户数据。
            CDMA技术的原理是基于扩频技术,即将需传送的具有一定信号带宽信息数据,用一个带宽远大于信号带宽的高速伪随机码进行调制,使原数据信号的带宽被扩展,再经载波调制并发送出去。CDMA使用带扩频技术的模数转换(ADC).输入音频首先数字化为二进制元。传输信号频率按指定类型编码,因此只有频率响应编码一致的接收机才能拦截信号。

    2.仿真效果预览

    matlab2022a仿真结果如下:

     

     

    3.MATLAB部分代码预览

    1. PACKET_LENGTH = 1000; %Packet size
    2. PEEK_POWER = 1;
    3. SYMBOL_LENGTH = 36; %here symbol length= packet length
    4. SLOT_LENGTH = 4;
    5. TRANS_LENGTH = 9*SLOT_LENGTH*PACKET_LENGTH;
    6. pulse_drtn = 4;
    7. CHANNELS = 3;
    8. ELECTRON = 1.6e-19;
    9. INTERFERENCE = 1e-3;
    10. RECEIVER_RES = 0.53;
    11. COEF_RED = 0.1550;
    12. COEF_GREEN = 1.7309;
    13. COEF_BLUE = 1.1142;
    14. RES_RED = 0.5200;
    15. RES_GREEN = 0.4800;
    16. RES_BLUE = 0.4000;
    17. %Derived parameters
    18. bit_rate = 16e8; % bit rate [100Mbps]
    19. rms_delay = 2e-9; % delay spread (1 ns)
    20. multipath = 3; % multi-path dispersion
    21. sample_rate = bit_rate / 3.0 * SLOT_LENGTH;
    22. %struct built
    23. for i=1:CHANNELS
    24. sentbit(i,:) = zeros(1,3*PACKET_LENGTH);
    25. signal(i,:) = zeros(1,12*PACKET_LENGTH);
    26. recivbit(i,:) = zeros(1,3*PACKET_LENGTH);
    27. end
    28. dwTransmitPower = 7; % 发送功率
    29. dShadowFadingStd = 4; % 阴影衰落标准差BS2UE dB
    30. dUserVelocity = 0; % 用户移动速度0km/h,这里假设是静止的
    31. MAX_Dis = 7;
    32. STEP = 0.2;
    33. MIN_Dis = 1;
    34. DIS = [MIN_Dis:STEP:MAX_Dis];%定义用户和基站之间的距离
    35. MTKL = 20;%多次仿真,计算平均值
    36. Avgtime = 200;
    37. Delay = 5;
    38. startpow = -70;
    39. endpow = -40;
    40. powstep = 5;
    41. %**************************************************************************
    42. %%
    43. %主题函数,通过for循环,仿真不同距离下的误码率曲线
    44. %为了对比,我们设置三组不同的SNR下的AWGN进行仿真
    45. %由于原先的程序是基于数据组进行仿真,而基于PCE估计的算法,需要基于时间流模型,所以必须将
    46. %仿真的方法修改下,即对每一个数据位单独的循环仿真,从而模拟出实时的效果
    47. E1 = zeros(PACKET_LENGTH,1);
    48. E2 = zeros(PACKET_LENGTH,1);
    49. E3 = zeros(PACKET_LENGTH,1);
    50. cnt = 0;
    51. for jj = 0.1:0.05:0.5
    52. cnt = cnt + 1;
    53. for mm = 1:MTKL
    54. jj
    55. mm
    56. %根据路径距离计算路径损耗
    57. PASS_LOSS = -25;
    58. %计算光三组元色对应的SNR值
    59. snr_red = 10*log10(power((power(10,PASS_LOSS/10)*1e-3)*(COEF_RED /(COEF_RED+COEF_GREEN+COEF_BLUE)),2)/((ELECTRON*INTERFERENCE/RES_RED) *(bit_rate*(SLOT_LENGTH/pulse_drtn)/3.0)));
    60. snr_green = 10*log10(power((power(10,PASS_LOSS/10)*1e-3)*(COEF_GREEN/(COEF_RED+COEF_GREEN+COEF_BLUE)),2)/((ELECTRON*INTERFERENCE/RES_GREEN)*(bit_rate*(SLOT_LENGTH/pulse_drtn)/3.0)));
    61. snr_blue = 10*log10(power((power(10,PASS_LOSS/10)*1e-3)*(COEF_BLUE /(COEF_RED+COEF_GREEN+COEF_BLUE)),2)/((ELECTRON*INTERFERENCE/RES_BLUE) *(bit_rate*(SLOT_LENGTH/pulse_drtn)/3.0)));
    62. VarR = calc_snr(snr_red);
    63. VarG = calc_snr(snr_green);
    64. VarB = calc_snr(snr_blue);
    65. %产生随机数作为发送数据
    66. for i=1:CHANNELS
    67. sentbit(i,:) = round(rand(1,3*PACKET_LENGTH));
    68. end
    69. for times = 1:3*PACKET_LENGTH%每一时刻,发送一个数据包
    70. S1 = 1*(times-1) + 1;
    71. F1 = 1*times;
    72. S2 = 4*(times-1) + 1;
    73. F2 = 4*(times);
    74. %**********************************************************************
    75. %根据上一次反馈得到的E进行功率的调整
    76. %**********************************************************************
    77. %对E取倒数
    78. %对应公式Pt(t) = Pt(t-D)/E(t-D) = 1/r(t-D)
    79. Coff(1,times) = 1/jj;% 之后,根据前一次的E进行调整发送功率
    80. Coff(2,times) = 1/jj;% 之后,根据前一次的E进行调整发送功率
    81. Coff(3,times) = 1/jj;% 之后,根据前一次的E进行调整发送功率
    82. %调制,OOK
    83. for i=1:CHANNELS
    84. signal(i,S2:F2) = func_1in4(sentbit(i,S1:F1),Coff(i,times));
    85. end
    86. %加多径
    87. if multipath~=1
    88. for i=1:CHANNELS
    89. signa2(i,S2:F2) = add_multipath_dispersion1(signal(i,S2:F2),4,sample_rate,rms_delay);
    90. end
    91. end
    92. %加噪声
    93. signal(1,S2:F2)=add_gauss_noise(signal(1,S2:F2),length(S2:F2), VarR);
    94. signal(2,S2:F2)=add_gauss_noise(signal(2,S2:F2),length(S2:F2), VarG);
    95. signal(3,S2:F2)=add_gauss_noise(signal(3,S2:F2),length(S2:F2), VarB);
    96. %解调
    97. for i=1:CHANNELS
    98. recivbit(i,S1:F1) = func_de1in4(signal(i,S2:F2),Coff(i,times));
    99. end
    100. end
    101. for i=1:CHANNELS
    102. error(i,:) = size(find(recivbit(i,:)~=sentbit(i,:)),2);
    103. end
    104. ERR(mm) = (error(1,:)+error(2,:)+error(3,:))/(CHANNELS*3*PACKET_LENGTH);
    105. end
    106. ber(cnt) = mean(ERR);
    107. end
    108. 01_057_m

    4.完整MATLAB程序

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

    V

  • 相关阅读:
    docker实战学习2022版本(七)之docker网络学习
    SPDK中常用的性能测试工具
    Linux常用命令
    为什么现在写论文都需要查重?
    SpringBoot学习笔记-创建个人中心页面(下)
    12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917
    Fabric.js+vue 实现鼠标滚轮缩放画布+移动画布
    神经网络需要的数学知识,神经网络的数学表达式
    算法——回溯法(1)
    解决kafka启动成功后然后又关闭了的问题
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128019751