目录
1.算法描述
2.仿真效果预览
3.MATLAB部分代码预览
4.完整MATLAB程序
从上面的结构可知,整个卷积编码的结构可由CRC校验,卷积编码,打孔组成,其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。
这里,我们采用如下的数据帧方式进行:
首先,每次发送的数据长度为:221,进行CRC校验之后为253,然后通过卷积编码之后的长度为512,注意,这里对于213卷积编码,需要将编码前的数据自动加3个0进行补偿。
里,我们使用卷积编码的参数为213系统,编码码率为1/2,所以这里就不需要打孔了。
所以整个卷积编码的结构为校验,编码,译码,校验,四个部分构成。
参数指标:
matlab2013B仿真结果如下:
........................................................................
for kk = 1:length(EbNo)disp('当前EbNo:');EbNo(kk)totalNumErr = 0;count = 0;SNR = 10^(EbNo(kk)/10);N0 = 2*10^(-EbNo(kk)/10);sigma = 1/(sqrt(SNR)/2); ii = 0;Dsd = 36; %db数Dsr = 36;Drd = 36;Qsd = sqrt(10^(Dsd/10));Qsr = sqrt(10^(Dsr/10));Qrd = sqrt(10^(Drd/10)); LL = 2;while (totalNumErr < Error_Num)totalNumErr%%RandStream.setDefaultStream(RandStream('mt19937ar','seed',sum(count)));%%%发送端%发送端%产生数据data = round(rand(1,N-M)); %卷积213编码u = turbo_encode(data) ;u = [u 0 0];%交织u1 = interlace(u,16,16); %BPSKtx = 2*u1 - 1; %%%编码协作协议%编码协作协议%安论文中的卷积编码协作的结构框图进行设计%首先对于 发送信息分为两路进行发送Trans_N1 = tx; Trans_N2 = tx;%ii=1的时候,发送自身的码字,而ii=2的时候发送协作的码字,从而达到时隙的效果ii = ii + 1; %将N1发送给目的地%将N1发送给目的地%作为发送信源%进行AF中继%信道增益Hsd=Qsd*(randn);Hsr=Qsr*(randn);Hrd=Qrd*(randn);%协作节点的放大增益B=sqrt(1/(abs(Qsr)^2*1));%===============================%最大合并比加权因子计算(第i个支路的可变增益加权系数为该分集之路的信号幅度与噪声功率之比)%计算增益A0=conj(Hsd)/(1/(sqrt(LL)*EbNo(kk)));A1=B*conj(Hsr)*conj(Hrd)/((B^2*(abs(Hsr))^2+1)*(1/(sqrt(LL)*EbNo(kk)))); %接收MIMO_Rx = Trans_N1/max(abs(Trans_N1))+ 1/(sqrt(SNR))*randn(size(Trans_N1));Ysr = Hsr*MIMO_Rx;Yrd = Hrd*Ysr*B;Ysd = Hsd*MIMO_Rx;Y = A0*Ysd+A1*Yrd; %接收到的二进制信号MIMO_Rx1 = Y; Rec_data1= sign(MIMO_Rx1); %将N1发送给用户2%将N1发送给用户2 %接收MIMO_Rx2 = Trans_N1/max(max(Trans_N1))+ 1/(sqrt(SNR))*randn(size(Trans_N1));Ysr = Hsr*MIMO_Rx2;Yrd = Hrd*Ysr*B;Ysd = Hsd*MIMO_Rx2;Y = A0*Ysd+A1*Yrd; %接收到的二进制信号MIMO_Rx12 = Y; Rec_data12 = sign(MIMO_Rx2); %第二时隙,用户2向目的端发送用户1的第二帧信号,即用户2重新编码得到的关于U1分组的N2比特校验码字对应的调制信号%在USER2中,将接收到的N1序列重新进行编码,然后将其中的序列N2发送给目的地%译码+校验:[Data_CRC2,LQs] = turbo_decode(Rec_data12(1:end-2),zeros(N-M+3,1),Frame_Length); %编码Ldpc_trans_data_user2 = turbo_encode(Data_CRC2) ;Ldpc_trans_data_user2 = [Ldpc_trans_data_user2 0 0];Trans_N2_user2 = Ldpc_trans_data_user2;%N2序列Trans_N2_user3 = 2*Trans_N2_user2-1;%---------------------协作MIMO----------------------------------Hsd=Qsd*(randn);Hsr=Qsr*(randn);Hrd=Qrd*(randn);%协作节点的放大增益B=sqrt(1/(abs(Qsr)^2*1));%===============================%最大合并比加权因子计算(第i个支路的可变增益加权系数为该分集之路的信号幅度与噪声功率之比)%计算增益A0=conj(Hsd)/(1/(sqrt(LL)*EbNo(kk)));A1=B*conj(Hsr)*conj(Hrd)/((B^2*(abs(Hsr))^2+1)*(1/(sqrt(LL)*EbNo(kk)))); %接收MIMO_Rx = Trans_N2/max(abs(Trans_N2))+ 1/(sqrt(SNR))*randn(size(Trans_N2));Ysr = Hsr*MIMO_Rx;Yrd = Hrd*Ysr*B;Ysd = Hsd*MIMO_Rx;Y = A0*Ysd+A1*Yrd; %接收到的二进制信号MIMO_Rx2 = Y;Rec_data2= sign(MIMO_Rx2); YY1 = [MIMO_Rx12,MIMO_Rx2]'; YY2 = [Rec_data12]'; Tx = reshape(YY2 - sqrt(-1)*YY2,Nt, Frame_Length/Nt); RayleighMat = (rand(Nr, Nt) + j*rand(Nr, Nt)); rr = size(RayleighMat*Tx,1);cc = size(RayleighMat*Tx,2);r = RayleighMat*Tx; Hs = RayleighMat; HQ = Hs*Q; %%%下面开始联合迭代%下面开始联合迭代rr = r; %初始半径,这里将搜索的范围变大,就是将系数alpha定为12.RR =(12*Nt)*(2/(10^(SNR/10))); %按英文论文所示转变为实信号rev1=[real(rr);imag(rr)]; H1 = RayleighMat;%按英文论文所示信道转变为实矩阵HH=[real(H1(:,:)) -imag(H1(:,:));imag(H1(:,:)) real(H1(:,:))]; LA = zeros(1,Frame_Length/2);LDs = 0;LD = zeros(1,Frame_Length/2);LE = zeros(1,Frame_Length/2);for Nout = 1:OUT_Iterif Nout == 1LA = zeros(1,Frame_Length/2);elseLA = LA2; end%球形mapfor J=1:Frame_Length/2 rev = rev1(:,J); %先计算|r-g*Si|^2[y_norm,LDs] = func_FP_MAP(rev,RR,HH,[-1,1],SNR);for jj=1:Nty_2norm(Nt*J+jj-Nt)=y_norm(jj)+j*y_norm(jj+Nt); end%每一个比特的后验似然比信息为LD(J) = LDs;end %外部迭代主要计算 LE = LD - LA;%解交织LE_itrlac_code = de_interlace(LE,16,16); %用于LDPC译码节点更新DM_msg = reshape(real(y_2norm),log2(P),Nt*Frame_Length/2);for ii2 = 1:length(DM_msg)if DM_msg(ii2)~=0DM_msg2(ii2) = abs(DM_msg(ii2)+1)/2;elseDM_msg2(ii2) = 0; endend DM_msg3 = de_interlace(DM_msg,16,16); %用于LDPC译码节点更新%内部迭代卷积里面[z_hat,LQ] = turbo_decode(DM_msg3(1:end-2),LE_itrlac_code',Frame_Length);x_hat = z_hat;%交织tmp = LQ(1:length(LE_itrlac_code)) - LE_itrlac_code;%交织LA2 = interlace(tmp,16,16); end%===========================================================================count = count + 1;totalNumErr = totalNumErr + biterr(round(x_hat), data);endBERs(kk) = totalNumErr/(count*Frame_Length);
end
01_054_m
matlab源码说明_我爱C编程的博客-CSDN博客
V