?? com_decoder_new.asv
字號:
function [so,e_p] = com_decoder_new(a_p,in,is_com1)
%****************************************************************
% 內(nèi)容概述:子解碼器,輸入a_p是先驗信息,in是RSC編碼器輸出
% 與一般的解碼器相比,這個子解碼器多出了對是否第一個子解碼器的判斷
% 如果是第一個子解碼器,輸出的外部信息中包含了輸入系統(tǒng)信息比特
% 提供給第二個子解碼器使用時不需要將系統(tǒng)位刪除,只需和后驗信息
% 一同交織后交給第二個子解碼器,這樣就省掉了專門需要對系統(tǒng)信息進行的交織!!
% 利用硬件化的方式實現(xiàn)TURBO碼的p-MAX-LOG-MAP譯碼
% 生成矩陣按照3GPP標準為[1 1 0 1;1 0 1 1]
% 未使用另外一個譯碼器反饋的外部信息
% 輸入為經(jīng)過高斯信道的RSC軟輸入,而輸出為軟輸出
% 創(chuàng) 建 人:朱殿榮/QQ:235347/MSN:njzdr@msn.com
% 單 位:南京郵電大學,通信工程系
% 創(chuàng)建時間:2005年7月18日
% 修改時間:
% 參考文獻:《數(shù)字通信--基礎(chǔ)與應用》
% 《High performace parallelised 3GPP Turbo Decoder》
% 《改進的Turbo碼算法及其FPGA實現(xiàn)過程的研究》,天津大學,張寧,趙雅興
% 版權(quán)聲明:任何人均可復制、傳播、修改此文件,同時需保留原始版權(quán)信息。
%****************************************************************
x=in(1,:); %輸入系統(tǒng)位
y=in(2,:); %輸入校驗位
%---初始化&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Infty = -128;
pi=0.5;
% [n,K] = size(g);
% m = K - 1;
L_seq = length(in);
d(1:2,1:L_seq)=zeros(2,L_seq); %分支量度,2種可能結(jié)果,輸入為-1或者1
%D(i,k)
a(1:8,1:L_seq)=Infty*ones(8,L_seq); %前向分支量度,A(S,k)
a(1,1)=0; %寄存器狀態(tài)由全零開始
b(1:8,1:L_seq+1)=Infty*ones(8,L_seq+1); %后向分支量度,B(S,k)
b(1,L_seq+1)=0; %寄存器狀態(tài)由全零結(jié)束
va1(1:8,1)=zeros(8,1);
va0(1:8,1)=zeros(8,1);
va0_index=[2 1 4 3 6 5 8 7]';
a2a_index=([4 0 1 5 6 2 3 7]+1)';
vb1(1:8,1)=zeros(8,1);
vb0(1:8,1)=zeros(8,1);
vb0_index=[5 6 7 8 1 2 3 4]';
b2b_index=([1 2 5 6 0 3 4 7]+1)';
%初始化結(jié)束,開始計算
for k=1:L_seq
if is_com1==1
d(1,k)=pi*(a_p(k)+x(k)+y(k));
d(2,k)=pi*(a_p(k)+x(k)-y(k));
else
d(1,k)=pi*(a_p(k)+y(k));
d(2,k)=pi*(a_p(k)-y(k));
end
if k>1
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)];
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)];
va0(va0_index)=va0;
a(:,k)=max(va0,va1);
a(a2a_index,k)=a(:,k);
end
if k==L_seq
%計算后向分支度量
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)];
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)];
vb0(vb0_index)=vb0;
b(:,k)=max(vb0,vb1);
b(b2b_index,k)=b(:,k);
%計算LLR;
llr_a=a(b2b_index,k);
llr(k)=max(llr_a+vb1)-max(llr_a+vb0);
end
end
for k=L_seq-1:-1:1
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)];
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)];
vb0(vb0_index)=vb0;
b(:,k)=max(vb0,vb1);
b(b2b_index,k)=b(:,k);
%計算LLR;
llr_a=a(b2b_index,k);
llr(k)=max(llr_a+vb1)-max(llr_a+vb0);
end
so=llr;
% 軟輸出
e_p=so/-a_p;
% 為下一個子解碼器提供的外部信息
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -