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

传真(Fax)编程

开发平台:

Matlab

  1. function so = decoder_3GPP_P_max_ok(in,app)
  2. %function so = decoder_3GPP_P_max_ok(in)
  3. %****************************************************************
  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月16日
  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. pi=10;
  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)=pi*(app(k)+x(k)+y(k));
  42.     d(2,k)=pi*(app(k)+x(k)-y(k));
  43. %    d(1,k)=pi*(x(k)+y(k));
  44. %    d(2,k)=pi*(x(k)-y(k));
  45.     
  46.     if k>1
  47.         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)];
  48.         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)];
  49.         va0=va0(va0_index);
  50.         a(:,k)=max(va0,va1);
  51.         a(a2a_index,k)=a(:,k);
  52.     end
  53.     
  54.     if k==L_seq
  55.         %计算后向分支度量
  56.         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)];
  57.         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)];
  58.         vb0=vb0(vb0_index);
  59.         b(:,k)=max(vb0,vb1);
  60.         b(b2b_index,k)=b(:,k);
  61.         %计算LLR;
  62.         llr_a=a(b2b_index,k);
  63.         llr(k)=max(llr_a+vb1)-max(llr_a+vb0);
  64.     end
  65. end
  66. for k=L_seq-1:-1:1
  67.     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)];
  68.     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)];
  69.     vb0=vb0(vb0_index);
  70.     b(:,k)=max(vb0,vb1);
  71.     b(b2b_index,k)=b(:,k);
  72.     %计算LLR;
  73.     llr_a=a(b2b_index,k);
  74.     llr(k)=max(llr_a+vb1)-max(llr_a+vb0);
  75. end
  76. so=llr;