com_decoder_new.asv
上传用户:hnyfjx
上传日期:2013-06-30
资源大小:2149k
文件大小:3k
源码类别:

传真(Fax)编程

开发平台:

Matlab

  1. function [so,e_p] = com_decoder_new(a_p,in,is_com1)
  2. %****************************************************************
  3. % 内容概述:子解码器,输入a_p是先验信息,in是RSC编码器输出
  4. %          与一般的解码器相比,这个子解码器多出了对是否第一个子解码器的判断
  5. %          如果是第一个子解码器,输出的外部信息中包含了输入系统信息比特
  6. %          提供给第二个子解码器使用时不需要将系统位删除,只需和后验信息
  7. % 一同交织后交给第二个子解码器,这样就省掉了专门需要对系统信息进行的交织!!
  8. %          利用硬件化的方式实现TURBO码的p-MAX-LOG-MAP译码
  9. %          生成矩阵按照3GPP标准为[1 1 0 1;1 0 1 1]
  10. %          未使用另外一个译码器反馈的外部信息
  11. %          输入为经过高斯信道的RSC软输入,而输出为软输出
  12. % 创 建 人:朱殿荣/QQ:235347/MSN:njzdr@msn.com
  13. % 单    位:南京邮电大学,通信工程系
  14. % 创建时间:2005年7月18日
  15. % 修改时间:
  16. % 参考文献:《数字通信--基础与应用》
  17. %          《High performace parallelised 3GPP Turbo Decoder》
  18. %          《改进的Turbo码算法及其FPGA实现过程的研究》,天津大学,张宁,赵雅兴
  19. % 版权声明:任何人均可复制、传播、修改此文件,同时需保留原始版权信息。
  20. %****************************************************************
  21. x=in(1,:);   %输入系统位 
  22. y=in(2,:);   %输入校验位
  23. %---初始化&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  24. Infty = -128;
  25. pi=0.5;
  26. % [n,K] = size(g); 
  27. % m = K - 1;
  28. L_seq = length(in);
  29. d(1:2,1:L_seq)=zeros(2,L_seq);  %分支量度,2种可能结果,输入为-1或者1
  30.                                 %D(i,k)
  31. a(1:8,1:L_seq)=Infty*ones(8,L_seq);         %前向分支量度,A(S,k)
  32. a(1,1)=0;                                   %寄存器状态由全零开始
  33. b(1:8,1:L_seq+1)=Infty*ones(8,L_seq+1);     %后向分支量度,B(S,k)
  34. b(1,L_seq+1)=0;                             %寄存器状态由全零结束
  35. va1(1:8,1)=zeros(8,1);
  36. va0(1:8,1)=zeros(8,1);
  37. va0_index=[2 1 4 3 6 5 8 7]';
  38. a2a_index=([4 0 1 5 6 2 3 7]+1)';
  39. vb1(1:8,1)=zeros(8,1);
  40. vb0(1:8,1)=zeros(8,1);
  41. vb0_index=[5 6 7 8 1 2 3 4]';
  42. b2b_index=([1 2 5 6 0 3 4 7]+1)';
  43. %初始化结束,开始计算
  44. for k=1:L_seq
  45.     if is_com1==1
  46.         d(1,k)=pi*(a_p(k)+x(k)+y(k));
  47.         d(2,k)=pi*(a_p(k)+x(k)-y(k));
  48.     else
  49.         d(1,k)=pi*(a_p(k)+y(k));
  50.         d(2,k)=pi*(a_p(k)-y(k));
  51.     end
  52.     
  53.     if k>1
  54.         va1=a(:,k-1)+[d(1,k);d(1,k);d(2,k);d(2,k);d(2,k);d(2,k);d(1,k);d(1,k)];
  55.         va0=a(:,k-1)-[d(1,k);d(1,k);d(2,k);d(2,k);d(2,k);d(2,k);d(1,k);d(1,k)];
  56.         va0(va0_index)=va0;
  57.         a(:,k)=max(va0,va1);
  58.         a(a2a_index,k)=a(:,k);
  59.     end
  60.     
  61.     if k==L_seq
  62.         %计算后向分支度量
  63.         vb1=b(:,k+1)+[d(1,k);d(2,k);d(2,k);d(1,k);d(1,k);d(2,k);d(2,k);d(1,k)];
  64.         vb0=b(:,k+1)-[d(1,k);d(2,k);d(2,k);d(1,k);d(1,k);d(2,k);d(2,k);d(1,k)];
  65.         vb0(vb0_index)=vb0;
  66.         b(:,k)=max(vb0,vb1);
  67.         b(b2b_index,k)=b(:,k);
  68.         %计算LLR;
  69.         llr_a=a(b2b_index,k);
  70.         llr(k)=max(llr_a+vb1)-max(llr_a+vb0);
  71.     end
  72. end
  73. for k=L_seq-1:-1:1
  74.     vb1=b(:,k+1)+[d(1,k);d(2,k);d(2,k);d(1,k);d(1,k);d(2,k);d(2,k);d(1,k)];
  75.     vb0=b(:,k+1)-[d(1,k);d(2,k);d(2,k);d(1,k);d(1,k);d(2,k);d(2,k);d(1,k)];
  76.     vb0(vb0_index)=vb0;
  77.     b(:,k)=max(vb0,vb1);
  78.     b(b2b_index,k)=b(:,k);
  79.     %计算LLR;
  80.     llr_a=a(b2b_index,k);
  81.     llr(k)=max(llr_a+vb1)-max(llr_a+vb0);
  82. end
  83. so=llr;
  84. % 软输出
  85. e_p=so/-a_p;
  86. % 为下一个子解码器提供的外部信息