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

传真(Fax)编程

开发平台:

Matlab

  1. function [soft_out,ex_info]=com_decoder_zhang(in,app)
  2. %****************************************************************
  3. % 内容概述:利用硬件化的方式实现TURBO码的MAX-LOG-MAP译码
  4. %          生成矩阵按照3GPP标准为[1 1 0 1;1 0 1 1]
  5. %          未使用另外一个译码器反馈的外部信息
  6. %          输入为经过高斯信道的RSC软输入,而输出为软输出
  7. % 创 建 人:朱殿荣/QQ:235347/MSN:njzdr@msn.com
  8. % 单    位:南京邮电大学,通信工程系
  9. % 创建时间:2005年7月23日
  10. % 修改时间:
  11. % 参考文献:《数字通信--基础与应用》
  12. %          《改进的Turbo码算法及其FPGA实现过程的研究》,天津大学,张宁,赵雅兴
  13. %           后向度量的计算方式和decoder_3GPP_MAX.m有所不同
  14. % 版权声明:任何人均可复制、传播、修改此文件,同时需保留原始版权信息。
  15. %****************************************************************
  16.  
  17. x=in(1,:);              %输入系统位
  18. y=in(2,:);              %输入校验位
  19. in_length=length(in);
  20. pii=1;
  21. Kw=0;
  22. S=1;
  23. %---初始化&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  24. Infty = -128;
  25. d(1:8,1:2,1:in_length)=zeros(8,2,in_length);    %分支量度,8种可能状态,输入为0或者1
  26.                                 %D(S,i,k)
  27. a(1:8,1:in_length)=Infty*ones(8,in_length);     %前向分支量度,A(S,k)
  28. a(1,1)=0;                       %寄存器状态由全零开始
  29. b(1:8,1:in_length+1)=Infty*ones(8,in_length+1);     %后向分支量度,B(S,k)
  30. b(1,in_length)=0;                       %寄存器状态由全零结束
  31. for k=1:in_length
  32. %    d(1,2,k)=(x(k)+y(k)+pii*app(k))/2;
  33.     d(1,2,k)=x(k)+y(k)+pii*app(k);
  34.     d(2,2,k)=d(1,2,k);
  35.     d(7,2,k)=d(1,2,k);
  36.     d(8,2,k)=d(1,2,k);
  37.     
  38.     d(1,1,k)=-d(2,2,k)%(x(k)+y(k)+pii*app(k));
  39.     d(2,1,k)=d(1,1,k);
  40.     d(7,1,k)=d(1,1,k);
  41.     d(8,1,k)=d(1,1,k);
  42.     
  43.     d(3,2,k)=x(k)-y(k)+pii*app(k);
  44. %    d(3,2,k)=(x(k)+pii*app(k))/2;
  45. %    d(3,2,k)=x(k)+pii*app(k);
  46.     d(4,2,k)=d(3,2,k);
  47.     d(5,2,k)=d(3,2,k);
  48.     d(6,2,k)=d(3,2,k);
  49.     
  50.     d(3,1,k)=-d(3,2,k); %-x(k)+y(k)-pii*app(k)
  51. %    d(3,1,k)=y(k)-pii*app(k);
  52. %   d(3,1,k)=y(k)/2;
  53. %    d(3,1,k)=y(k);
  54.     d(4,1,k)=d(3,1,k);
  55.     d(5,1,k)=d(3,1,k);
  56.     d(6,1,k)=d(3,1,k);
  57.     
  58.     if k>1
  59.         a(1,k)=max((a(1,k-1)+d(1,1,k-1)),(a(2,k-1)+d(2,2,k-1)))+Kw;
  60.         a(2,k)=max((a(4,k-1)+d(4,1,k-1)),(a(3,k-1)+d(3,2,k-1)))+Kw;
  61.         a(3,k)=max((a(5,k-1)+d(5,1,k-1)),(a(6,k-1)+d(6,2,k-1)))+Kw;
  62.         a(4,k)=max((a(8,k-1)+d(8,1,k-1)),(a(7,k-1)+d(7,2,k-1)))+Kw;
  63.         a(5,k)=max((a(2,k-1)+d(2,1,k-1)),(a(1,k-1)+d(1,2,k-1)))+Kw;
  64.         a(6,k)=max((a(3,k-1)+d(3,1,k-1)),(a(4,k-1)+d(4,2,k-1)))+Kw;
  65.         a(7,k)=max((a(6,k-1)+d(6,1,k-1)),(a(5,k-1)+d(5,2,k-1)))+Kw;
  66.         a(8,k)=max((a(7,k-1)+d(7,1,k-1)),(a(8,k-1)+d(8,2,k-1)))+Kw;        
  67.     end
  68.     
  69.     if k==in_length
  70.         b(1,k)=max((b(1,k+1)+d(1,1,k)),(b(5,k+1)+d(1,2,k)))+Kw;
  71.         b(2,k)=max((b(5,k+1)+d(2,1,k)),(b(1,k+1)+d(2,2,k)))+Kw;
  72.         b(3,k)=max((b(6,k+1)+d(3,1,k)),(b(2,k+1)+d(3,2,k)))+Kw;
  73.         b(4,k)=max((b(2,k+1)+d(4,1,k)),(b(6,k+1)+d(4,2,k)))+Kw;
  74.         b(5,k)=max((b(3,k+1)+d(5,1,k)),(b(7,k+1)+d(5,2,k)))+Kw;
  75.         b(6,k)=max((b(7,k+1)+d(6,1,k)),(b(3,k+1)+d(6,2,k)))+Kw;
  76.         b(7,k)=max((b(8,k+1)+d(7,1,k)),(b(4,k+1)+d(7,2,k)))+Kw;
  77.         b(8,k)=max((b(4,k+1)+d(8,1,k)),(b(8,k+1)+d(8,2,k)))+Kw;
  78.         %计算LLR--------------------------------------
  79.         l(k)=max([...
  80.             (a(1,k)+d(1,2,k)+b(5,k+1)),(a(2,k)+d(2,2,k)+b(1,k+1)),...
  81.             (a(3,k)+d(3,2,k)+b(2,k+1)),(a(4,k)+d(4,2,k)+b(6,k+1)),...
  82.             (a(5,k)+d(5,2,k)+b(7,k+1)),(a(6,k)+d(6,2,k)+b(3,k+1)),...
  83.             (a(7,k)+d(7,2,k)+b(4,k+1)),(a(8,k)+d(8,2,k)+b(8,k+1))...
  84.             ])-max([...
  85.             (a(1,k)+d(1,1,k)+b(1,k+1)),(a(2,k)+d(2,1,k)+b(5,k+1)),...
  86.             (a(3,k)+d(3,1,k)+b(6,k+1)),(a(4,k)+d(4,1,k)+b(2,k+1)),...
  87.             (a(5,k)+d(5,1,k)+b(3,k+1)),(a(6,k)+d(6,1,k)+b(7,k+1)),...
  88.             (a(7,k)+d(7,1,k)+b(8,k+1)),(a(8,k)+d(8,1,k)+b(3,k+1))...
  89.             ]);
  90.     end
  91. end
  92. for k=in_length-1:-1:1
  93.    b(1,k)=max((b(1,k+1)+d(1,1,k)),(b(5,k+1)+d(1,2,k)))+Kw;
  94.    b(2,k)=max((b(5,k+1)+d(2,1,k)),(b(1,k+1)+d(2,2,k)))+Kw;
  95.    b(3,k)=max((b(6,k+1)+d(3,1,k)),(b(2,k+1)+d(3,2,k)))+Kw;
  96.    b(4,k)=max((b(2,k+1)+d(4,1,k)),(b(6,k+1)+d(4,2,k)))+Kw;
  97.    b(5,k)=max((b(3,k+1)+d(5,1,k)),(b(7,k+1)+d(5,2,k)))+Kw;
  98.    b(6,k)=max((b(7,k+1)+d(6,1,k)),(b(3,k+1)+d(6,2,k)))+Kw;
  99.    b(7,k)=max((b(8,k+1)+d(7,1,k)),(b(4,k+1)+d(7,2,k)))+Kw;
  100.    b(8,k)=max((b(4,k+1)+d(8,1,k)),(b(8,k+1)+d(8,2,k)))+Kw;
  101.    %计算LLR--------------------------------------
  102.    l(k)=max([...
  103.        (a(1,k)+d(1,2,k)+b(5,k+1)),(a(2,k)+d(2,2,k)+b(1,k+1)),...
  104.        (a(3,k)+d(3,2,k)+b(2,k+1)),(a(4,k)+d(4,2,k)+b(6,k+1)),...
  105.        (a(5,k)+d(5,2,k)+b(7,k+1)),(a(6,k)+d(6,2,k)+b(3,k+1)),...
  106.        (a(7,k)+d(7,2,k)+b(4,k+1)),(a(8,k)+d(8,2,k)+b(8,k+1))...
  107.        ])-max([...
  108.        (a(1,k)+d(1,1,k)+b(1,k+1)),(a(2,k)+d(2,1,k)+b(5,k+1)),...
  109.        (a(3,k)+d(3,1,k)+b(6,k+1)),(a(4,k)+d(4,1,k)+b(2,k+1)),...
  110.        (a(5,k)+d(5,1,k)+b(3,k+1)),(a(6,k)+d(6,1,k)+b(7,k+1)),...
  111.        (a(7,k)+d(7,1,k)+b(8,k+1)),(a(8,k)+d(8,1,k)+b(3,k+1))...
  112.        ]); 
  113. end
  114. soft_out=l;
  115. %ex_info=0.625*soft_out+0.375*app;
  116. ex_info=(soft_out-app-x)*S;