From acbdbee947fe7a676ca84be1802c601d7f146d27 Mon Sep 17 00:00:00 2001 From: chadac8j <59776317+chadac8j@users.noreply.github.com> Date: Thu, 20 Jan 2022 07:09:16 -0500 Subject: [PATCH] LDPC Error Floor Archive These are some of the files used during my research on LDPC Error Floors documented in: https://arxiv.org/pdf/cs/0605051.pdf --- .../H2048_8023an.mat | Bin 0 -> 25014 bytes ChadCole_LDPC_ErrorFloor_Archive/ISldpc.m | 434 +++++++++++++++ .../TS_classify.m | 6 + ChadCole_LDPC_ErrorFloor_Archive/TSearch.m | 527 ++++++++++++++++++ .../determ_boundary_finder.m | 346 ++++++++++++ ChadCole_LDPC_ErrorFloor_Archive/int2vec.m | 15 + .../irregularSPA.m | 385 +++++++++++++ 7 files changed, 1713 insertions(+) create mode 100644 ChadCole_LDPC_ErrorFloor_Archive/H2048_8023an.mat create mode 100644 ChadCole_LDPC_ErrorFloor_Archive/ISldpc.m create mode 100644 ChadCole_LDPC_ErrorFloor_Archive/TS_classify.m create mode 100644 ChadCole_LDPC_ErrorFloor_Archive/TSearch.m create mode 100644 ChadCole_LDPC_ErrorFloor_Archive/determ_boundary_finder.m create mode 100644 ChadCole_LDPC_ErrorFloor_Archive/int2vec.m create mode 100644 ChadCole_LDPC_ErrorFloor_Archive/irregularSPA.m diff --git a/ChadCole_LDPC_ErrorFloor_Archive/H2048_8023an.mat b/ChadCole_LDPC_ErrorFloor_Archive/H2048_8023an.mat new file mode 100644 index 0000000000000000000000000000000000000000..7feab3c178a8a70e8981a59725b4caf0e200b599 GIT binary patch literal 25014 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 deg_current) + num_combos = 1; + indices = [1:deg_current]'; + else + indices = zeros(v_num, nchoosek(deg_v_prof(length(deg_v_prof(:,1))+1-iii,2), v_num)); + for pp = 1:2^deg_current + binary = int2vec(pp, deg_current); + if (sum(binary) == v_num) + num_combos = num_combos + 1; + indices(:, num_combos) = find(binary); + end + end + end + num_combos_save(iii) = num_combos; + + for jj = 1:deg_v_prof(length(deg_v_prof(:,1))+1-iii,1) + v_count = v_count - 1 + for kk = 1:num_combos + +% The c_nodes structure contains the check-nodes involved in the tree rooted +% at the v_count^{th} variable node + c_nodes = Clist(v_count, indices(:,kk)+1); +% The v_tier_1 structure contains all possible variable nodes that are in +% variable tier 1 of the tree rooted at the v_count^{th} variable node. + v_tier_1 = zeros(length(c_nodes), max(Vlist(c_nodes, 1))); + for ppp = 1:length(c_nodes) + v_tier_1(ppp, 1:Vlist(c_nodes(ppp),1)-1) = setxor(Vlist(c_nodes(ppp),2:Vlist(c_nodes(ppp),1)+1),v_count); + end + % v_tier_1_ind contains indices of nonzero elements of v_tier_1 + v_tier_1_ind = find(v_tier_1); + %store candidates for epsilon_2 impulses in this matrix which only has + %to be calculated once for each of our n trees + epsilon_mat = zeros(length(v_tier_1_ind), (max(Vlist(:,1))-1)*(max(Clist(v_tier_1(v_tier_1_ind),1))-1)); + for ppp = 1:length(v_tier_1_ind) + tot = 0; + for qqq = 1:Clist(v_tier_1(v_tier_1_ind(ppp)),1) + if sum(Clist(v_tier_1(v_tier_1_ind(ppp)),qqq+1)*ones(1,length(c_nodes)) == c_nodes)==0 + epsilon_mat(ppp, tot+1:tot+Vlist(Clist(v_tier_1(v_tier_1_ind(ppp)),qqq+1),1)-1) ... + = setxor(Vlist(Clist(v_tier_1(v_tier_1_ind(ppp)),qqq+1), 2: ... + Vlist(Clist(v_tier_1(v_tier_1_ind(ppp)),qqq+1),1)+1), ... + v_tier_1(v_tier_1_ind(ppp))); + tot = tot + Vlist(Clist(v_tier_1(v_tier_1_ind(ppp)),qqq+1),1)-1; + end + end + end + + + %tot_perms counts the number of permutations of impulse bits for each + % tree + tot_perms = 1; + for ppp = 1:length(c_nodes) + tot_perms = tot_perms*(Vlist(c_nodes(ppp),1)-1); + end + + %bit_combos enumerates all tot_perms length(c_nodes)-bit error impulse + % candidate sets + bit_combos = zeros(length(c_nodes),tot_perms); + count = zeros(length(c_nodes),1); + for ppp = 1:tot_perms + v_prod = 1; + for zzz = 1:length(c_nodes) + if (mod(ppp, v_prod)==0) + count(zzz) = mod(count(zzz)+1,Vlist(c_nodes(zzz),1)-1); + end + v_prod = v_prod*(Vlist(c_nodes(zzz),1)-1); + end + for zzz = 1:length(indices(:,1)) + bit_combos(zzz, ppp) = v_tier_1(zzz, count(zzz)+1); + end + end + + for ll = 1:tot_perms + +%%%%The following code can be +%%%%uncommented for finding TS in codes where searching the first layer +%%%%of variable nodes falls short, typically for larger variable degree +%%%%nodes, such as {4,8} codes with n > 2000 or so. Don't forget to also +%%%%uncomment the end of the for loop below this block of code. + +%%%% Find c_nodes connected to leftmost v_node at tier 1. + +% v_root=intersect(Vlist(c_nodes(1),2:Vlist(c_nodes(1),1)+1), ... +% bit_combos(:,ll)); +% v_root_cnodes = setxor(Clist(v_root,2:Clist(v_root,1)+1), c_nodes(1)); +% v_tier_2 = zeros(length(v_root_cnodes), max(Vlist(v_root_cnodes, 1))); +% for ppp = 1:length(v_root_cnodes) +% v_tier_2(ppp, 1:Vlist(v_root_cnodes(ppp),1)-1) = setxor(Vlist(v_root_cnodes(ppp),2:Vlist(v_root_cnodes(ppp),1)+1),v_root); +% end +% +% tot_perms_2 = 1; +% for ppp = 1:length(v_root_cnodes) +% tot_perms_2 = tot_perms_2*(Vlist(v_root_cnodes(ppp),1)-1); +% end +% +% bit_combos_2 = zeros(length(v_root_cnodes),tot_perms_2); +% count_2 = zeros(length(v_root_cnodes),1); +% for ppp = 1:tot_perms_2 +% v_prod = 1; +% for zzz = 1:length(v_root_cnodes) +% if (mod(ppp, v_prod)==0) +% count_2(zzz) = mod(count_2(zzz)+1,Vlist(v_root_cnodes(zzz),1)-1); +% end +% v_prod = v_prod*(Vlist(v_root_cnodes(zzz),1)-1); +% end +% for zzz = 1:length(v_root_cnodes) +% bit_combos_2(zzz, ppp) = v_tier_2(zzz, count_2(zzz)+1); +% end +% end +% +% for mm = 1:tot_perms_2 +% + num_checks = num_checks + 1; + d = zeros(1,n); + d(v_count) = 1; + d(bit_combos(:, ll)) = 1; +% d(bit_combos_2(:, mm)) = 1; + v_node_hit_hist(bit_combos(:, ll)) = v_node_hit_hist(bit_combos(:, ll)) + 1; + v_node_hit_hist(v_count) = v_node_hit_hist(v_count) + 1; + syn_sum = sum(mod(d*H_sparse',2)); + if (syn_sum <= 14) + syn_save_hist(syn_sum+1) = syn_save_hist(syn_sum+1) + 1; + + y = gamma(iii)*a - d*epsilon_1; + %Only want nonzero values of epsilon_mat to index into y, + % this not problem for (check) regular codes. also a problem + % here if girth < 8 + [garbage,garbage2,useful] = intersect(bit_combos(:, ll),v_tier_1(v_tier_1_ind)); +% y(epsilon_mat(useful,:)) = epsilon_2; + +% MPA +% step 1: initialization + +Lc=Lc_coef*y; + +num_total = 0; +for ii = 1:num_v_deg + Lq(num_total+1:num_total+deg_v_prof(ii, 1), 1:deg_v_prof(ii, 2)) = Lc(num_total+1:num_total + deg_v_prof(ii, 1))'*ones(1,deg_v_prof(ii, 2)); + num_total = num_total + deg_v_prof(ii, 1); +end + +stopsig=0; % check whether a valid codeword has been found +%itenum=20; % maximum # of iterations +itestep=0; + +while (stopsig==0) && (itestep val) + while (lll < num_TS) && not_done_outer + lll = lll + 1; + if (sum(TS(lll,:) == TS_temp) == n) + not_done_outer = 0; + TS_unique_count(lll) = TS_unique_count(lll) + 1; + end + end + if (not_done_outer) %add new TS + num_TS = num_TS + 1 + TS(num_TS,:) = TS_temp; + TS_unique_count(num_TS) = 1; + end + end +end + +end + +end %if we decode + +% weight = 1; +% num_frame_errors = num_frame_errors + weight; +% variance = variance + weight^2; + +% end % tot_perms_2 loop - uncomment along with above stuff +end %tot_perms loop + + + end % num_combos loop + end %v_count loop +end % num deg prof while +toc + +TS = TS(1:num_TS,:); +cw = cw(1:num_cw,:); +%save Hfilename_TS TS cw diff --git a/ChadCole_LDPC_ErrorFloor_Archive/determ_boundary_finder.m b/ChadCole_LDPC_ErrorFloor_Archive/determ_boundary_finder.m new file mode 100644 index 0000000..fd18a64 --- /dev/null +++ b/ChadCole_LDPC_ErrorFloor_Archive/determ_boundary_finder.m @@ -0,0 +1,346 @@ +%%%%%%%%% +% This file contains the implementation of Step-2 of the 3-Step error floor +% analysis procedure. The input is an H matrix in sparse format called +% H_sparse. The output variable is d_e_2 which should be saved and used +% in step 3, which is implemented in ISldpc.m. + +clear all + +% load H4000_wesel_test + +% load H504_4_8_no6_fallback4_best +% load test_1200H_3_6_no6 + +% load H1000_4_8_gallager +% load H1008_nox2 +% load QR_H8192 +% load Margulis11qHCV +% load H1200_4_8_no6cycle +% load H504goodcode_no82 +% load H1008_peg +load H96_firstmackay + +n = length(H_sparse(1,:)); +n_k = length(H_sparse(:,1)); +k = n - n_k; +rate = k/n; + +%%%%%% +% These are MPA messages: +% Lq = Variable->Check +% Lr = Check->Variable +% LQ = Marginal LLR used in making a hard decision. +Lq=zeros(n,max(sum(H_sparse,1))); +Lr=zeros(n-k,max(sum(H_sparse,2))); +LQ=zeros(1,n); + +%%%% Organize H columns from highest degree -> lowest. this is necessary +%%%% for the decoding algorithm to make use of Matlab vectorized commands +%%%% which significantly speed up program run-time. +H_col_sum = sum(H_sparse,1); +H_row_sum = sum(H_sparse,2); +%B will be sorted in ascending order +B = unique(H_col_sum); +num_v_deg = length(B); +R = unique(H_row_sum); +num_c_deg = length(R); +deg_c_prof = zeros(length(R), 2); +deg_v_prof = zeros(length(B), 2); + +%%%% +% Set up degree profile info for V-nodes & C-nodes and make sure H is +% ordered from highest to lowest degree in columns and rows. +% +% Example - n-k = 500, half parities have deg 6, half 8 +% always list deg profiles in DESCENDING ORDER +% : deg_c_prof = [250, 8; +% 250, 6] +H_new = spalloc(n-k,n,length(find(H_sparse))); +running_index = 0; +for ii = 1:num_v_deg + change_loc = find(H_col_sum == B(num_v_deg + 1 - ii)); + deg_v_prof(ii, 1) = length(change_loc); + deg_v_prof(ii, 2) = B(num_v_deg + 1 - ii); +%This step orders columns from highest degree to lowest + for jj = 1:length(change_loc) + running_index = running_index + 1; + H_new(:,running_index) = H_sparse(:, change_loc(jj)); + end +end +H_sparse = H_new; +clear H_new; + +H_new = spalloc(n-k,n,length(find(H_sparse))); +running_index = 0; +for ii = 1:num_c_deg + change_loc = find(H_row_sum == R(num_c_deg + 1 - ii)); + deg_c_prof(ii, 1) = length(change_loc); + deg_c_prof(ii, 2) = R(num_c_deg + 1 - ii); +%This step orders rows from highest degree to lowest + for jj = 1:length(change_loc) + running_index = running_index + 1; + H_new(running_index,:) = H_sparse(change_loc(jj),:); + end +end +H_sparse = H_new; +clear H_new; + +%%%%%%% The Clist Vlist Data Structures +% Clist is an n by (max(deg_v)+1) matrix with the first column having the +% variable node degree (deg_v) of each column of H. The next deg_v entries +% for that row are the check node numbers which that variable node is +% connected to. Any extra columns following are set to zero. +% Vlist is an (n-k) by (max(deg_c)+1) matrix with the first column having the +% check node degree (deg_c) of each row of H. The next deg_c entries +% for that row are the variable node numbers which that check node is +% connected to. Any extra columns following are set to zero. + +Vlist=zeros(n-k,max(sum(H_sparse,2))+1); +Clist=zeros(n,max(sum(H_sparse,1))+1); + +for jj=1:n-k + Vlist(jj,1)=sum(H_sparse(jj,:)); + icnt=0; + for ii=1:n + if H_sparse(jj,ii)==1 + icnt=icnt+1; + Vlist(jj,icnt+1)=ii; + end + end +end + +for ii=1:n + Clist(ii,1)=sum(H_sparse(:,ii)); + jcnt=0; + for jj=1:n-k + if H_sparse(jj,ii)==1 + jcnt=jcnt+1; + Clist(ii,jcnt+1)=jj; + end + end +end + +%Maximum number of MPA iterations before we declare a failure. +itenum = 50; + +small_num = eps; %how expensive is eps()? + +% Simple H matrix consistency check. +num_edges_v = sum(Clist(:,1)); +num_edges_c = sum(Vlist(:,1)); +if (num_edges_c ~= num_edges_v) + text = ['error - row/col mismatch in H'] +end +num_edges = num_edges_c; +clear num_edges_c num_edges_v + +Lr_ind = zeros(1, num_edges); +Lq_ind = zeros(1, num_edges); + +%%%%% +% Set up the edge connections between Lr (C->V messages) and Lq (V->C). +% Remember, Matlab matrices are indexed by columns, so if Lr is of +% dimension (n-k)X max(d_c)+1, then Lr(n-k+1) is the same as Lr(1,2). +tot_count = 0; +for kk = 2:length(Clist(1,:)) + for jj=1:n + if(Clist(jj,kk) ~= 0) + tot_count = tot_count + 1; + Lq_ind(tot_count) = (kk-2)*n + jj; + end + end +end + +row_index = zeros(n-k, 1); +tot_count = 0; +for kk=2:length(Clist(1,:)) + for jj=1:n + if(Clist(jj,kk) ~= 0) + tot_count = tot_count + 1; + row=Clist(jj, kk); + row_index(row) = row_index(row) + 1; + Lr_ind(tot_count) = row + (row_index(row)-1)*(n-k); + end + end +end + + + +%load H1008_peg_del4_op6_ebno6_TS +%load H504_peg_del3_op8_ebno6_TS +%load H504_no82_del36_op8_ebno5_TS +%load H1200_4_8_no6cycles_5bitimpulse_TS +% load H1008_nox2_4delta_07op_7db_TS +% load QR_8192_4bit_TS +% load Margulis_TS_tot + +% load H504_4_8_no6_fallback4_best_TS +% load test_1200H_3_6_no6_TS +% load dinoi_TS_save +% load H204_TS +% load H1200_4_8_no6cycles_5bitimpulse_TS_extra_2 +% load H1200_4_8_no6cycles_5bitimpulse_TS +% load H504_no82_TS_temp +% load H4000_wesel_test_TS_cw +% load H1008_peg_del3_op6_ebno6_TS +load H96-964_5_1_TS + +num_TS = length(TS(:,1)); +temp = zeros(num_TS,2); +temp(:,1) = sum(TS(1:num_TS,:),2); +temp(:,2) = sum(mod(TS(1:num_TS,:)*H_sparse',2),2) + +% TS = TS(find(d_e < 30),:); +TS = TS(intersect(find(temp(:,1)==5), find(temp(:,2)==1)),:); + + +e_max = 3.5; +e_min = 1; +num_intervals = 10; + +mu_coef = 1; + +num_bits = zeros(length(ebnodb), length(TS(:,1))); + +ebnodb = 6; +% ebnodb = [3 4 5 6 7]; +a = ones(1,n); +e_vec = zeros(length(TS(:,1)), length(ebnodb), 2); + + +for outer = 1:length(TS(:,1)) + + mu = TS(outer,:); + + for ebnoloop = 1:length(ebnodb) + + upper = e_max + lower = e_min; + + ebno = 10^((ebnodb(ebnoloop))/10); + esno = ebno*(rate);%*3; %rate 1/2, 3 bits/sym + sigma_2 = 1/(2*esno); + sigma = sqrt(sigma_2); + Lc_coef = 4*esno; + + variance = 0; + num_frame_errors = 0; %don't forget to reset these to 0 for each ebno + + for e_loop = 1:num_intervals + mu_coef = lower + (upper - lower)/2; + + y = a - mu_coef*mu; + + % MPA +% step 1: initialization +Lc=Lc_coef*y; +num_total = 0; +for ii = 1:num_v_deg + Lq(num_total+1:num_total+deg_v_prof(ii, 1), 1:deg_v_prof(ii, 2)) = Lc(num_total+1:num_total + deg_v_prof(ii, 1))'*ones(1,deg_v_prof(ii, 2)); + num_total = num_total + deg_v_prof(ii, 1); +end + + +stopsig=0; % check whether a valid codeword has been found +itestep=0; + +while (stopsig==0) && (itestep= 2^i) + val = val - 2^i; + binvec(i+1) = 1; + else + binvec(i+1) = 0; + end + end +% return binvec; + + + \ No newline at end of file diff --git a/ChadCole_LDPC_ErrorFloor_Archive/irregularSPA.m b/ChadCole_LDPC_ErrorFloor_Archive/irregularSPA.m new file mode 100644 index 0000000..009576b --- /dev/null +++ b/ChadCole_LDPC_ErrorFloor_Archive/irregularSPA.m @@ -0,0 +1,385 @@ +%%%%%%%%%%%%% +% This program is a general Matlab LDPC decoder simulator for an AWGN channel. +% Both regular and irregular LDPC code performance can be simulated. The +% full belief propagation and min-sum approximation, using full double +% precision messages, are the two decoding algorithms currently +% implemented. +% +% The full belief propagation version of this code can simulate roughly 100 +% Kb/s (coded bits). Although this is not near as much throughput as most +% hardware simulations, the dominant TS making up the error floor are +% collected is this software implementation. +% +% The codes to be simulated should be in H_sparse form + + +clear all +% function irregularSPA() +randn('state',sum(100*clock)); + +%%%%% +% These would be some example files containing H_sparse +% load H1000_4_8_gallager +% load H504goodcode_no82 +% load QCH2331 +% load QCH8160 +% load ramanujanq17p5 +% load H504_4_8_no4cycle +% load H96_4_8_no4cycle +% load 128x256regular.mat H +% load H1008_nox2 +% load H96_4_8_70cw +% load H504_4_8_no6_fallback4_best +% load H26_reallysmall_no4cycle +% load test_1200H_3_6_no6 +% load H1200_4_8_no6cycle +load H2048_8023an +% load H4000_wesel_test +% load H128_highrate_test +% load H500_rate08_3_15 +% load H500_rate08_3_15_best +% load H1000_rate08_4_20 + +% H_sparse = sparse(H); + +n = length(H_sparse(1,:)); +n_k = length(H_sparse(:,1)); +k = n - n_k; +rate = k/n; + +%%%%%%%% To generate G matrix for encoding uncomment the following. +% This is generally not necessary because sending all zeros codeword ok for +% linear codes. Requires files rearrange_cols, inv_GF2 + +% H = full(H_sparse); +% H = rearrange_cols(H); +% %swap full rank cols to last part +% temp = H(:, 1:n-k); +% H(:, 1:n-k) = H(:, n-k+1:n); +% H(:, n-k+1:n) = temp; +% C2=H(:, n-k+1:n); +% %only need to do this N^3 operation once +% C2_inv = inv_GF2(C2); +% H_system = mod(C2_inv*H, 2); +% P_trans = H_system(:, 1:n-k); +% G = cat(2, eye(k), P_trans'); + +%Max number of noisy messages sent per SNR +num_trials = 20000000; + +%%%%%% +% These are MPA messages: +% Lq = Variable->Check +% Lr = Check->Variable +% LQ = Marginal LLR used in making a hard decision. +Lq=zeros(n,max(sum(H_sparse,1))); +Lr=zeros(n-k,max(sum(H_sparse,2))); +LQ=zeros(1,n); + +num_frame_errors = 0; +num_bit_err = 0; + +%SNR values in DeciBels +% ebnodb = [1.5:0.5:3.0]; +ebnodb = [3:.5:6]; + +%%%% Organize H columns from highest degree -> lowest. this is necessary +%%%% for the decoding algorithm to make use of Matlab vectorized commands +%%%% which significantly speed up program run-time. +H_col_sum = sum(H_sparse,1); +H_row_sum = sum(H_sparse,2); +%B will be sorted in ascending order +B = unique(H_col_sum); +num_v_deg = length(B); +R = unique(H_row_sum); +num_c_deg = length(R); +deg_c_prof = zeros(length(R), 2); +deg_v_prof = zeros(length(B), 2); + +%%%% +% Set up degree profile info for V-nodes & C-nodes and make sure H is +% ordered from highest to lowest degree in columns and rows. +% +% Example - n-k = 500, half parities have deg 6, half 8 +% always list deg profiles in DESCENDING ORDER +% : deg_c_prof = [250, 8; +% 250, 6] +H_new = spalloc(n-k,n,length(find(H_sparse))); +running_index = 0; +for ii = 1:num_v_deg + change_loc = find(H_col_sum == B(num_v_deg + 1 - ii)); + deg_v_prof(ii, 1) = length(change_loc); + deg_v_prof(ii, 2) = B(num_v_deg + 1 - ii); +%This step orders columns from highest degree to lowest + for jj = 1:length(change_loc) + running_index = running_index + 1; + H_new(:,running_index) = H_sparse(:, change_loc(jj)); + end +end +H_sparse = H_new; +clear H_new; + +H_new = spalloc(n-k,n,length(find(H_sparse))); +running_index = 0; +for ii = 1:num_c_deg + change_loc = find(H_row_sum == R(num_c_deg + 1 - ii)); + deg_c_prof(ii, 1) = length(change_loc); + deg_c_prof(ii, 2) = R(num_c_deg + 1 - ii); +%This step orders rows from highest degree to lowest + for jj = 1:length(change_loc) + running_index = running_index + 1; + H_new(running_index,:) = H_sparse(change_loc(jj),:); + end +end +H_sparse = H_new; +clear H_new; + +%%%%%%% The Clist Vlist Data Structures +% Clist is an n by (max(deg_v)+1) matrix with the first column having the +% variable node degree (deg_v) of each column of H. The next deg_v entries +% for that row are the check node numbers which that variable node is +% connected to. Any extra columns following are set to zero. +% Vlist is an (n-k) by (max(deg_c)+1) matrix with the first column having the +% check node degree (deg_c) of each row of H. The next deg_c entries +% for that row are the variable node numbers which that check node is +% connected to. Any extra columns following are set to zero. + +Vlist=zeros(n-k,max(sum(H_sparse,2))+1); +Clist=zeros(n,max(sum(H_sparse,1))+1); + +for jj=1:n-k + Vlist(jj,1)=sum(H_sparse(jj,:)); + icnt=0; + for ii=1:n + if H_sparse(jj,ii)==1 + icnt=icnt+1; + Vlist(jj,icnt+1)=ii; + end + end +end + +for ii=1:n + Clist(ii,1)=sum(H_sparse(:,ii)); + jcnt=0; + for jj=1:n-k + if H_sparse(jj,ii)==1 + jcnt=jcnt+1; + Clist(ii,jcnt+1)=jj; + end + end +end + +%Maximum number of MPA iterations before we declare a failure. +itenum = 50; +%Keep a history of number of iterations necessary for each decoding. +ite_hist = zeros(1,num_trials); +%Number of UnSatisfied Checks at each iteration. +num_USC = zeros(1, itenum); +%Store which checks unsatisfied. +USC_vec = zeros(1, n-k); +c_hat_hist_save = cell(1,itenum); +USC_vec_save = cell(1,itenum); +c_hat_hist = zeros(itenum, n); + +%Store Trapping Set, noise, and codeword information +num_TS = 0; +TS = zeros(100, n); +noise_save = zeros(100, n); +cw = zeros(10,n); + +%small_num defines the magnitude of largest messages from C->V +small_num = eps; + +%Number of miscorrections (MPA converges to incorrect valid codeword) +num_miscor = 0; + +% Simple H matrix consistency check. +num_edges_v = sum(Clist(:,1)); +num_edges_c = sum(Vlist(:,1)); +if (num_edges_c ~= num_edges_v) + text = ['error - row/col mismatch in H'] +end +num_edges = num_edges_c; +clear num_edges_c num_edges_v + +Lr_ind = zeros(1, num_edges); +Lq_ind = zeros(1, num_edges); + +%%%%% +% Set up the edge connections between Lr (C->V messages) and Lq (V->C). +% Remember, Matlab matrices are indexed by columns, so if Lr is of +% dimension (n-k)X max(d_c)+1, then Lr(n-k+1) is the same as Lr(1,2). +tot_count = 0; +for kk = 2:length(Clist(1,:)) + for jj=1:n + if(Clist(jj,kk) ~= 0) + tot_count = tot_count + 1; + Lq_ind(tot_count) = (kk-2)*n + jj; + end + end +end + +row_index = zeros(n-k, 1); +tot_count = 0; +for kk=2:length(Clist(1,:)) + for jj=1:n + if(Clist(jj,kk) ~= 0) + tot_count = tot_count + 1; + row=Clist(jj, kk); + row_index(row) = row_index(row) + 1; + Lr_ind(tot_count) = row + (row_index(row)-1)*(n-k); + end + end +end + +temp1 = zeros(size(Lr)); +temp2 = zeros(size(Lq)); +tic +%%%%% +% Main SNR loop +for ebnoloop = 1:length(ebnodb) + ebno = 10^((ebnodb(ebnoloop))/10) + esno = ebno*(rate); + sigma_2 = 1/(2*esno); + sigma = sqrt(sigma_2); + Lc_coef = 4*esno; + num_frame_errors = 0; + num_bit_errors = 0; + t = 0; + %Simulate till we collect 20 errors or num_trials reached w/o getting + % 20 errors. This can be adjusted to affect quality of estimate. +while ((t < num_trials) && (num_frame_errors < 20)) + t = t + 1; +%%% If encoding necessary +% u = (1-sign(rand(1,k)-0.5))/2; +% a = mod(u*G, 2); +% a_mod = -1*(a*2 - 1); + + noise = randn(1,n); + %for easy encoding, send all 0's message. + a_mod = ones(1,n); + + y = a_mod + sigma*noise; %regular MC + +% MPA +% Initialization +Lc=Lc_coef*y; +num_total = 0; +for ii = 1:num_v_deg + Lq(num_total+1:num_total+deg_v_prof(ii, 1), 1:deg_v_prof(ii, 2)) = Lc(num_total+1:num_total + deg_v_prof(ii, 1))'*ones(1,deg_v_prof(ii, 2)); + num_total = num_total + deg_v_prof(ii, 1); +end + + +stopsig=0; % If a valid codeword has been found, set this to `1' +itestep=0; % Iteration number + + +while (stopsig==0) && (itestep