• m在VBLAST协作MIMO系统分部使用LDPC,Turbo,卷积三种信道编译码进行误码率matlab仿真


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB部分代码预览

    4.完整MATLAB程序


    1.算法描述

     

           从上面的结构可知,整个卷积编码的结构可由CRC校验,卷积编码,打孔组成,其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。

    这里,我们采用如下的数据帧方式进行:

           首先,每次发送的数据长度为:221,进行CRC校验之后为253,然后通过卷积编码之后的长度为512,注意,这里对于213卷积编码,需要将编码前的数据自动加3个0进行补偿。

     

     里,我们使用卷积编码的参数为213系统,编码码率为1/2,所以这里就不需要打孔了。

    所以整个卷积编码的结构为校验,编码,译码,校验,四个部分构成。

    参数指标:

    2.仿真效果预览

    matlab2013B仿真结果如下:

     

     

    3.MATLAB部分代码预览

    1. ........................................................................
    2. for kk = 1:length(EbNo)
    3. disp('当前EbNo:');
    4. EbNo(kk)
    5. totalNumErr = 0;
    6. count = 0;
    7. SNR = 10^(EbNo(kk)/10);
    8. N0 = 2*10^(-EbNo(kk)/10);
    9. sigma = 1/(sqrt(SNR)/2);
    10. ii = 0;
    11. Dsd = 36; %db数
    12. Dsr = 36;
    13. Drd = 36;
    14. Qsd = sqrt(10^(Dsd/10));
    15. Qsr = sqrt(10^(Dsr/10));
    16. Qrd = sqrt(10^(Drd/10));
    17. LL = 2;
    18. while (totalNumErr < Error_Num)
    19. totalNumErr
    20. %%
    21. RandStream.setDefaultStream(RandStream('mt19937ar','seed',sum(count)));
    22. %%
    23. %发送端
    24. %发送端
    25. %产生数据
    26. data = round(rand(1,N-M));
    27. %卷积213编码
    28. u = turbo_encode(data) ;
    29. u = [u 0 0];
    30. %交织
    31. u1 = interlace(u,16,16);
    32. %BPSK
    33. tx = 2*u1 - 1;
    34. %%
    35. %编码协作协议
    36. %编码协作协议
    37. %安论文中的卷积编码协作的结构框图进行设计
    38. %首先对于 发送信息分为两路进行发送
    39. Trans_N1 = tx;
    40. Trans_N2 = tx;
    41. %ii=1的时候,发送自身的码字,而ii=2的时候发送协作的码字,从而达到时隙的效果
    42. ii = ii + 1;
    43. %将N1发送给目的地
    44. %将N1发送给目的地
    45. %作为发送信源
    46. %进行AF中继
    47. %信道增益
    48. Hsd=Qsd*(randn);
    49. Hsr=Qsr*(randn);
    50. Hrd=Qrd*(randn);
    51. %协作节点的放大增益
    52. B=sqrt(1/(abs(Qsr)^2*1));
    53. %===============================
    54. %最大合并比加权因子计算(第i个支路的可变增益加权系数为该分集之路的信号幅度与噪声功率之比)
    55. %计算增益
    56. A0=conj(Hsd)/(1/(sqrt(LL)*EbNo(kk)));
    57. A1=B*conj(Hsr)*conj(Hrd)/((B^2*(abs(Hsr))^2+1)*(1/(sqrt(LL)*EbNo(kk))));
    58. %接收
    59. MIMO_Rx = Trans_N1/max(abs(Trans_N1))+ 1/(sqrt(SNR))*randn(size(Trans_N1));
    60. Ysr = Hsr*MIMO_Rx;
    61. Yrd = Hrd*Ysr*B;
    62. Ysd = Hsd*MIMO_Rx;
    63. Y = A0*Ysd+A1*Yrd;
    64. %接收到的二进制信号
    65. MIMO_Rx1 = Y;
    66. Rec_data1= sign(MIMO_Rx1);
    67. %将N1发送给用户2
    68. %将N1发送给用户2
    69. %接收
    70. MIMO_Rx2 = Trans_N1/max(max(Trans_N1))+ 1/(sqrt(SNR))*randn(size(Trans_N1));
    71. Ysr = Hsr*MIMO_Rx2;
    72. Yrd = Hrd*Ysr*B;
    73. Ysd = Hsd*MIMO_Rx2;
    74. Y = A0*Ysd+A1*Yrd;
    75. %接收到的二进制信号
    76. MIMO_Rx12 = Y;
    77. Rec_data12 = sign(MIMO_Rx2);
    78. %第二时隙,用户2向目的端发送用户1的第二帧信号,即用户2重新编码得到的关于U1分组的N2比特校验码字对应的调制信号
    79. %在USER2中,将接收到的N1序列重新进行编码,然后将其中的序列N2发送给目的地
    80. %译码+校验:
    81. [Data_CRC2,LQs] = turbo_decode(Rec_data12(1:end-2),zeros(N-M+3,1),Frame_Length);
    82. %编码
    83. Ldpc_trans_data_user2 = turbo_encode(Data_CRC2) ;
    84. Ldpc_trans_data_user2 = [Ldpc_trans_data_user2 0 0];
    85. Trans_N2_user2 = Ldpc_trans_data_user2;%N2序列
    86. Trans_N2_user3 = 2*Trans_N2_user2-1;
    87. %---------------------协作MIMO----------------------------------
    88. Hsd=Qsd*(randn);
    89. Hsr=Qsr*(randn);
    90. Hrd=Qrd*(randn);
    91. %协作节点的放大增益
    92. B=sqrt(1/(abs(Qsr)^2*1));
    93. %===============================
    94. %最大合并比加权因子计算(第i个支路的可变增益加权系数为该分集之路的信号幅度与噪声功率之比)
    95. %计算增益
    96. A0=conj(Hsd)/(1/(sqrt(LL)*EbNo(kk)));
    97. A1=B*conj(Hsr)*conj(Hrd)/((B^2*(abs(Hsr))^2+1)*(1/(sqrt(LL)*EbNo(kk))));
    98. %接收
    99. MIMO_Rx = Trans_N2/max(abs(Trans_N2))+ 1/(sqrt(SNR))*randn(size(Trans_N2));
    100. Ysr = Hsr*MIMO_Rx;
    101. Yrd = Hrd*Ysr*B;
    102. Ysd = Hsd*MIMO_Rx;
    103. Y = A0*Ysd+A1*Yrd;
    104. %接收到的二进制信号
    105. MIMO_Rx2 = Y;
    106. Rec_data2= sign(MIMO_Rx2);
    107. YY1 = [MIMO_Rx12,MIMO_Rx2]';
    108. YY2 = [Rec_data12]';
    109. Tx = reshape(YY2 - sqrt(-1)*YY2,Nt, Frame_Length/Nt);
    110. RayleighMat = (rand(Nr, Nt) + j*rand(Nr, Nt));
    111. rr = size(RayleighMat*Tx,1);
    112. cc = size(RayleighMat*Tx,2);
    113. r = RayleighMat*Tx;
    114. Hs = RayleighMat;
    115. HQ = Hs*Q;
    116. %%
    117. %下面开始联合迭代
    118. %下面开始联合迭代
    119. rr = r;
    120. %初始半径,这里将搜索的范围变大,就是将系数alpha定为12.
    121. RR =(12*Nt)*(2/(10^(SNR/10)));
    122. %按英文论文所示转变为实信号
    123. rev1=[real(rr);imag(rr)];
    124. H1 = RayleighMat;
    125. %按英文论文所示信道转变为实矩阵
    126. HH=[real(H1(:,:)) -imag(H1(:,:));
    127. imag(H1(:,:)) real(H1(:,:))];
    128. LA = zeros(1,Frame_Length/2);
    129. LDs = 0;
    130. LD = zeros(1,Frame_Length/2);
    131. LE = zeros(1,Frame_Length/2);
    132. for Nout = 1:OUT_Iter
    133. if Nout == 1
    134. LA = zeros(1,Frame_Length/2);
    135. else
    136. LA = LA2;
    137. end
    138. %球形map
    139. for J=1:Frame_Length/2
    140. rev = rev1(:,J);
    141. %先计算|r-g*Si|^2
    142. [y_norm,LDs] = func_FP_MAP(rev,RR,HH,[-1,1],SNR);
    143. for jj=1:Nt
    144. y_2norm(Nt*J+jj-Nt)=y_norm(jj)+j*y_norm(jj+Nt);
    145. end
    146. %每一个比特的后验似然比信息为
    147. LD(J) = LDs;
    148. end
    149. %外部迭代主要计算
    150. LE = LD - LA;
    151. %解交织
    152. LE_itrlac_code = de_interlace(LE,16,16); %用于LDPC译码节点更新
    153. DM_msg = reshape(real(y_2norm),log2(P),Nt*Frame_Length/2);
    154. for ii2 = 1:length(DM_msg)
    155. if DM_msg(ii2)~=0
    156. DM_msg2(ii2) = abs(DM_msg(ii2)+1)/2;
    157. else
    158. DM_msg2(ii2) = 0;
    159. end
    160. end
    161. DM_msg3 = de_interlace(DM_msg,16,16); %用于LDPC译码节点更新
    162. %内部迭代卷积里面
    163. [z_hat,LQ] = turbo_decode(DM_msg3(1:end-2),LE_itrlac_code',Frame_Length);
    164. x_hat = z_hat;
    165. %交织
    166. tmp = LQ(1:length(LE_itrlac_code)) - LE_itrlac_code;
    167. %交织
    168. LA2 = interlace(tmp,16,16);
    169. end
    170. %===========================================================================
    171. count = count + 1;
    172. totalNumErr = totalNumErr + biterr(round(x_hat), data);
    173. end
    174. BERs(kk) = totalNumErr/(count*Frame_Length);
    175. end
    176. 01_054_m

    4.完整MATLAB程序

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

    V

  • 相关阅读:
    Go——一、Go语言安装及介绍
    什么是可调CAP策略?为什么需要可调CAP策略?
    Vue.config.js配置详解
    k线图快速入门必读
    SpringBoot/Spring扩展点系列之CommandLineRunner和ApplicationRunner实现缓存预热
    基于JAVA社区老年人信息管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    如何保证分布式情况下的幂等性
    java面试题-设计模式基础
    拉格朗日粒子扩散FLEXPART模式
    感恩节跟进技巧(附邮件模板)
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/127986184