improvements to LDPC dec sync state machine
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 30 Dec 2013 23:36:11 +0000 (23:36 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 30 Dec 2013 23:36:11 +0000 (23:36 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1350 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/ldpc.m
codec2-dev/octave/ldpcenc.m

index 917b7efa24ac90976c2702985ad8c05fd1b7e4cb..2e9cf125b72487792689e80bb9caf95e22684fc4 100644 (file)
@@ -102,15 +102,16 @@ endfunction
 \r
 % Uses the UW to determine when we have a full codeword ready for decoding\r
 \r
-function found_uw = look_for_uw(mem_rx_symbols, mod_uw)\r
+function [found_uw corr] = look_for_uw(mem_rx_symbols, mod_uw)\r
     sparse_mem_rx_symbols = mem_rx_symbols(find(mod_uw));\r
 \r
     % correlate with ref UW\r
 \r
     num = (mem_rx_symbols * mod_uw') .^ 2;\r
     den = (sparse_mem_rx_symbols * sparse_mem_rx_symbols') * (mod_uw * mod_uw');\r
-\r
-    found_uw = abs(num/(den+1E-6)) > 0.8;\r
+    \r
+    corr = abs(num/(den+1E-6));\r
+    found_uw = corr > 0.8;\r
 endfunction\r
 \r
 \r
index 9d7dde0bd3af871dbc22068a5b4b227f3118bb3d..d32cc7da8b41bfcace0d5dd5866ca34af64899d2 100644 (file)
@@ -17,6 +17,8 @@ ldpc;
 \r
 % Start simulation\r
 \r
+rand('state',1);\r
+\r
 rate = 3/4; \r
 framesize = 576;  \r
 \r
@@ -28,6 +30,7 @@ demod_type = 0;
 decoder_type = 0;\r
 max_iterations = 100;\r
 EsNo = 10;\r
+Eprob = 0.18;\r
 \r
 vocoderframesize = 52;\r
 nvocoderframes = 8;\r
@@ -72,11 +75,13 @@ lpackedmodem = 72/8;
 mod_codeword = zeros(1, code_param.code_bits_per_frame/2);\r
 lmod_codeword = code_param.code_bits_per_frame/2;\r
 \r
-for m=1:8\r
-\r
-    % read in one modem frame at a time\r
+Terrs = 0; Ferrs = 0; Tbits = 0; Tframes = 0; nerr = [];\r
+corr = []; n = 0;\r
+sync_state = 0; sync_count = 0;\r
 \r
-    packedmodem = fread(fc,lpackedmodem,"uchar");\r
+[packedmodem, count] = fread(fc,lpackedmodem,"uchar");\r
+while (count == lpackedmodem)\r
+    n++;\r
     unpackedmodem = unpackmsb(packedmodem);\r
 \r
     j = 1;\r
@@ -85,13 +90,22 @@ for m=1:8
         j += 1;\r
     end\r
 \r
+    erasures = rand(1,length(mod_unpackedmodem))<Eprob; \r
+    mod_unpackedmodem(erasures) = 0;\r
+\r
     % keep buffer of one entire codeword\r
 \r
     mod_codeword(1:lmod_codeword-length(mod_unpackedmodem)) = mod_codeword(length(mod_unpackedmodem)+1:lmod_codeword);\r
     mod_codeword(lmod_codeword-length(mod_unpackedmodem)+1:lmod_codeword) = mod_unpackedmodem;\r
 \r
-    uw_sync = look_for_uw(mod_codeword(1:length(mod_uw)), mod_uw);\r
+    [uw_sync corr(n)] = look_for_uw(mod_codeword(1:length(mod_uw)), mod_uw);\r
     if (uw_sync)\r
+      sync_state = 1;\r
+    end\r
+\r
+    if (sync_state && (sync_count == 0))\r
+        Tframes++;\r
+\r
         % force UW symbols as they are known (is this needed?)\r
 \r
         % LDPC decode\r
@@ -106,12 +120,29 @@ for m=1:8
 \r
         error_positions = xor(vd, vd_rx);\r
         Nerrs = sum(error_positions);\r
-        if Nerrs>0, fprintf(1,'x'),  else fprintf(1,'.'),  end\r
+        if Nerrs>0, fprintf(1,'x'); Ferrs++; ,  else fprintf(1,'.'),  end\r
+        Tbits += length(vd);\r
+        Terrs += Nerrs;\r
+        nerr(Tframes) = Nerrs;\r
 \r
         % save packed payload data to disk\r
     end\r
-end\r
 \r
-fprintf(1,'\n')\r
+    if (sync_state)\r
+        sync_count++;\r
+        if (sync_count == 8)\r
+            sync_count = 0;\r
+        end\r
+    end\r
+\r
+    % read in one modem frame at a time\r
+\r
+    [packedmodem, count] = fread(fc, lpackedmodem, "uchar");\r
+end\r
 fclose(fc);\r
 \r
+fprintf(1,"\nFrames: %d bits: %d errors: %d BER = %f FER = %f\n", Tframes, Tbits, Terrs, Terrs/Tbits, Ferrs/Tframes);\r
+subplot(211)\r
+plot(corr);\r
+subplot(212)\r
+plot(nerr);\r