資源簡介
簡單實用的LDPC BP算法;適用于新手理解算法過程。
代碼片段和文件信息
function?[?outputdecode?]?=?SPA_decode(?H??r_num??c_num??EbN0??Rs?)
%SPA_decode?this?function?is?used?to?decode?LDPC?codes?with?SPA?method.
%???input:?H?--------the?check?matrix
%??????????c_num-----how?many?columns?in?H
%??????????r_num-----how?many?rows?in?H
%??????????EbNo------EbN0?for?the?AWGN?channel?which?is?used?to?calculate?log(p1/p0)
%??????????Rs--------receive?signals
%???output:?outputdecode-----the?decode?result?which?is?only?0s?and?1s
Receive?=?2?*?Rs?*?2?*?EbN0;?%%?假定信號功率為1;
%%%%%%%%%%%%%%%?set?parameter?%%%%%%%%%%%%%%%%%%%%%
????????it_num?=?20;?%iteration?number
????????row_nonzero_index?=?zeros(r_numc_num);?%H中每行里1的位置
????????col_nonzero_index?=?zeros(r_numc_num);?%H中每列里1的位置
????????row_nonzero_number?=?zeros(r_num1);?%H中每行1的個數
????????col_nonzero_number?=?zeros(c_num1);?%H中每列1的個數
????????u_ml?=?zeros(r_numc_num);?%校驗節點(對校驗節點的更新值)
????????v_ml?=?zeros(r_numc_num);?%變量節點(對變量節點的更新值)
????????v_l?=?zeros(1c_num);?%似后驗概率
????????v_l0?=?zeros(1c_num);?%初始后驗概率信息
?%%%%%%%%%%%%%%%?initialization?%%%%%%%%%%%%%%%%%%%%
????????%?找到每行中1的位置
????????for?i?=?1:r_num
????????????row_nonzero_number(i)?=?length(find(H(i:)));
????????????row_nonzero_index(i:)?=?[find(H(i:))??zeros(1c_num-row_nonzero_number(i))];
????????end
????????%?找到每列中1的位置
????????for?j?=?1:c_num
????????????col_nonzero_number(j)?=?length(find(H(:j)));
????????????col_nonzero_index(:j)?=?[find(H(:j))?;?zeros(r_num-col_nonzero_number(j)1)];
????????end
????????
????????v_l0?=?Receive;
????????for?i?=?1:r_num??%?it?can?be?better?here?by?using?column?assignment?%%%
????????????for?l?=?1:row_nonzero_number(i)
????????????????j?=?row_nonzero_index(il);
????????????????v_ml(ij)?=?v_l0(j);
????????????end?%?end?l
????????end?%?end?i
?%%%%%%%%%%%%%%%%%??iteration?%%%%%%%%%%%%%%%%%
????????for?it_counter?=?1:it_num
????????????%%%%%%?check?notes(u_ml)?updating?%%%%%%
????????????
????????????
%?????????????tanh_v_ml?=?tanh(v_ml/2);
%?????????????for?i?=?1:r_num
%?????????????????len?=?row_nonzero_number(i);
%?????????????????for?l?=?1:len
%?????????????????????j?=?row_nonzero_index(il);
%?????????????????????pro?=?1;
%?????????????????????for?k?=1:len
%?????????????????????????if?k?~=?l
%?????????????????????????????pro?=?pro?*?tanh_v_ml(irow_nonzero_index(ik));
%?????????????????????????end?%?end?if
%?????????????????????end?%?end?k?
%?????????????????????u_ml(ij)?=?2*atanh(pro);
%?????????????????????why_error?=?double(isinf(u_ml(ij)));
%?????????????????????if?why_error?~=?0
%?????????????????????????u_ml(ij)?=?sign(u_ml(ij))*1000;
%
評論
共有 條評論