# Main stats (Hamming correction for n=4)

Jan 14th, 2022
890
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. %% Close all figures, clear workspace and console
2. close all;
3. clear;
4. clc;
5.
6. %% NICE COMBINATIONS
7. % n = 3 and er = 0.1   (below 0.147)
8. % n = 4 and er = 0.05  (below 0.066)
9.
10. %% Application - Hamming Code
11.
12. n = 4;                   % rows of H
13. m = 2^n - n - 1;         % message bits || rows of G
14. H = ham_par(n);          % Creating a Hamming Code Parity Matrix
15. P = H(:, 1:(2^n-1-n));
16. G = [eye(2^n-1-n) P'];   % Creating Generator Matrix
17.
18. % Creating messages words
19. u_list = dec2bin(0:2^m-1)-'0';
20.
21. % Creating codewords
22. codewords = ones(2^m,2^n-1);
23. rows_codewords = size(codewords, 1);
24. cols_codewords = size(codewords, 2);
25.
26. for i = 1:rows_codewords
27.     codewords(i,:) = mod(u_list(i,:)*G,2); % EINAI MOD 2?
28. end
29.
30.
31.
32.
33.
34. %% Create the stats
35. counter_rounds = 0;
36. target = 1000;
37. num_of_corrections = 0;
38.
39. while counter_rounds < target
40.
41.     %% Simulating the Binary Symmetric Channel
42.     er = 0.05;  % Channel error
43.     in_data = codewords(randi([1 rows_codewords]), :); % Random codeword
44.     % in_data = codewords(2,:);
45.     x = zeros(1, cols_codewords); % x(0,1) to x(-1,0)
46.
47.     for i = 1:cols_codewords
48.         if in_data(i) == 0
49.             x(i) = 1;
50.         else
51.             x(i) = -1;
52.         end
53.     end
54.
55.     [out_data,err] = bsc(in_data,er);
56.     initial_errors = sum(err);
57.
58.
59.
60.
61.     if initial_errors == 1
62.
63.         counter_rounds = counter_rounds + 1;
64.         disp("******** Counter " + num2str(counter_rounds) + " ********");
65.         %% Begin the process
66.         y = zeros(1, cols_codewords);     % out_data(0,1) to out_data(1,-1)
67.         for i = 1:length(out_data)
68.             if out_data(i) == 0
69.                 y(i) = 1;
70.             else
71.                 y(i) = -1;
72.             end
73.         end
74.
75.         %% Print the state
76.         disp("x = " + num2str(x));
77.         disp("y = " + num2str(y));
78.         disp("Initial errors: "+num2str(initial_errors));
79.
80.         %% Implementing the Graph
81.
82.         pos = lk(x, y, er);   % old chan_node
83.         var_nodes = cell(1, 2^n-1);
84.         for i = 1:2^n-1
85.
86.            var_nodes{i} = connections(H,i,pos);
87.
88.         end
89.         check_nodes = cell(1,n);
90.
91.         for i = 1:n
92.            check_nodes{i} = var2check(H,i,pos,0);
93.         end
94.
95.         % Iterations
96.         limit = 100;
97.         counter = 0;
98.         SUM = -1;
99.         while (counter <= limit) && SUM ~= 0
100.
101.             counter = counter + 1;
102.
103.             for i = 1:n
104.                 check_nodes =...
105.                 var2check_updated(var_nodes,check_nodes,pos,i);
106.             end
107.
108.             check_to_var = check2var(check_nodes, n);
109.             var_rec_sum = var_rec(check_to_var, pos);
110.             var_values = map_detection(var_rec_sum);
111.             % x^ = 1 - 2x => x = (1 - x^) / 2
112.             % x = x, x^ = var_values
113.             var_values_01 = (1 - var_values) / 2;
114.             temp = mod(H*var_values_01',2);
115.             SUM = sum(temp);
116.             var_nodes =...
117.             edges_values(var_nodes, check_to_var);
118.
119.         end
120.
121.         disp(' ')
122.         %disp("x^= " + num2str(var_values));
123.         %disp("x = " + num2str(x))
124.         disp("x = " + num2str(in_data));
125.         disp("x^= " + num2str(var_values_01));
126.         final_errors = sum(abs(x-var_values))/2;
127.         disp("Final errors: " + num2str(final_errors));
128.         display("**********************")
129.         display(' ')
130.         if final_errors == 0
131.             num_of_corrections = num_of_corrections + 1;
132.         end
133.
134.     end
135.
136. end
137.
138.
139. %% Display overall stats
140. disp("Iterations: " + num2str(target));
141. disp("Corrected codewords with 1 initial mistake: " + num2str(num_of_corrections))
142. percentage100 = 100 * num_of_corrections / target;
143. disp("Percentage of correction: " + num2str(percentage100) + "%");
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
RAW Paste Data