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

传真(Fax)编程

开发平台:

Matlab

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