refactored ldpcdec to have smaller ldpc code include file, and a simpler interface
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 16 Sep 2016 07:07:29 +0000 (07:07 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 16 Sep 2016 07:07:29 +0000 (07:07 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2868 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/ldpc_fsk_lib.m
codec2-dev/octave/test_ldpc_fsk_lib.m

index 663e9d94720976ce215ac03fdbb27cfebad6368d..33035abdd198b09cc576e9b76129dec84ebcb873 100644 (file)
@@ -141,24 +141,23 @@ function codeword = ldpc_encode(code_param, data)
 endfunction\r
 \r
 \r
+% Takes soft decision symbols (e.g. output of 2fsk demod) and converts\r
+% them to LLRs.  Note we calculate mean and var manually instead of\r
+% using internal functions.  This was required to get a bit exact\r
+% results against the C code.\r
+\r
 function llr = sd_to_llr(sd)\r
-    %printf("mean: %2.17g\n", mean(abs(sd)));\r
     sd = sd / mean(abs(sd));\r
     x = sd - sign(sd);\r
     sumsq = sum(x.^2);\r
     summ = sum(x);\r
     mn = summ/length(sd);\r
     estvar = sumsq/length(sd) - mn*mn; \r
-    %printf("estvar: %2.17g\n", estvar);\r
     estEsN0 = 1/(2* estvar + 1E-3); \r
     llr = 4 * estEsN0 * sd;\r
-    %printf("\n");\r
-    %for i=st:st+4\r
-    %  printf("%2.17g ", input_decoder_c(i))\r
-    %end\r
-    %printf("\n");\r
 endfunction\r
 \r
+\r
 % LDPC decoder - note it estimates EsNo from received symbols\r
 \r
 function [detected_data Niters] = ldpc_decode(r, code_param, max_iterations, decoder_type)\r
@@ -178,14 +177,14 @@ function [detected_data Niters] = ldpc_decode(r, code_param, max_iterations, dec
   detected_data = x_hat(Niters,:);\r
   \r
   if isfield(code_param, "c_include_file")\r
-    write_code_to_C_include_file(code_param, max_iterations, decoder_type, llr, x_hat);\r
+    write_code_to_C_include_file(code_param, max_iterations, decoder_type, llr, x_hat, detected_data);\r
   end\r
 end\r
 \r
 \r
 % optionally create a C include file for use in mpdecode.c C cmd line LDPC decoder\r
 \r
-function write_code_to_C_include_file(code_param, max_iterations, decoder_type, input_decoder_c, x_hat)\r
+function write_code_to_C_include_file(code_param, max_iterations, decoder_type, input_decoder_c, x_hat, detected_data)\r
        \r
   f = fopen(code_param.c_include_file, "wt");\r
 \r
@@ -207,7 +206,7 @@ function write_code_to_C_include_file(code_param, max_iterations, decoder_type,
   [r c] = size(code_param.H_rows);\r
   for j=1:c\r
     for i=1:r\r
-      fprintf(f, "%f", code_param.H_rows(i,j));\r
+      fprintf(f, "%d", code_param.H_rows(i,j));\r
       if (i == r) && (j ==c)\r
         fprintf(f,"\n};\n");\r
       else\r
@@ -220,7 +219,7 @@ function write_code_to_C_include_file(code_param, max_iterations, decoder_type,
   [r c] = size(code_param.H_cols);\r
   for j=1:c\r
     for i=1:r\r
-      fprintf(f, "%f", code_param.H_cols(i,j));\r
+      fprintf(f, "%d", code_param.H_cols(i,j));\r
       if (i == r) && (j == c)\r
         fprintf(f,"\n};\n");\r
       else\r
@@ -239,18 +238,34 @@ function write_code_to_C_include_file(code_param, max_iterations, decoder_type,
     end\r
   end\r
 \r
-  fprintf(f,"\nint output[] = {\n");\r
-  [r c] = size(x_hat);\r
-  for j=1:c\r
-    for i=1:r\r
-      fprintf(f, "%d", x_hat(i,j));\r
-      if (i == r) && (j == c)\r
-        fprintf(f,"\n};\n");\r
-      else\r
-        fprintf(f,", ");\r
-      end\r
+  fprintf(f,"\nchar detected_data[] = {\n");\r
+  for i=1:length(detected_data)\r
+    fprintf(f, "%d", detected_data(i));\r
+    if i == length(detected_data)\r
+      fprintf(f,"\n};\n");\r
+    else\r
+      fprintf(f,", ");            \r
     end\r
   end\r
 \r
   fclose(f);\r
 end\r
+\r
+\r
+% One application of FSK LDPC work is SSTV.  This function generates a\r
+% simulated frame for testing\r
+\r
+function [bytes rs232_bits] = gen_sstv_frame\r
+  data = floor(rand(1,256)*256);\r
+  checksum = crc16(data);\r
+  uw = 'abcd';\r
+  bytes = [hex2dec('55')*ones(1,16) hex2dec('ab') hex2dec('cd')];\r
+  bytes = [bytes data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))];\r
+\r
+  mask = 2.^(0:7); rs232_bits = [];\r
+  for b=1:length(bytes)\r
+    bits = bitand(bytes(b),mask) > 0;\r
+    rs232_bits = [rs232_bits 0 bits 1];\r
+  end\r
+endfunction\r
+\r
index e7be8b9d7469f9418778d93cae1069712e6a4c30..c2253a690bd456b45ce5917e308548eabe6fda16 100644 (file)
@@ -1,7 +1,7 @@
 % test_ldpc_fsk_lib\r
 % David Rowe 16 April 2016\r
 %\r
-% Some tests for ldpc_fsk_lib\r
+% Some tests for ldpc_fsk_lib, and C versions ldpc_enc and ldpc_dec\r
 \r
 1;\r
 \r
@@ -266,19 +266,19 @@ rand('state',1);
 \r
 % binary flags to run various demos, e.g. "15" to run 1 .. 8\r
 \r
-demos = 64;\r
+demo = 7;\r
 \r
-if bitand(demos,1)\r
+if demo == 1\r
   printf("simple_ut....\n");\r
   data = simple_ut;\r
 end\r
 \r
-if bitand(demos,2)\r
+if demo == 2\r
   printf("generate C header file....\n");\r
-  data = simple_ut("../src/ldpc_code.h");\r
+  data = simple_ut("../src/H2064_516_sparse.h");\r
 end\r
 \r
-if bitand(demos,4)\r
+if demo == 3\r
   printf("decode_from_file ......\n");\r
   data = simple_ut;\r
   detected_data = decode_from_file("codeword.bin");\r
@@ -287,12 +287,12 @@ if bitand(demos,4)
   printf("  Nerrs = %d\n", Nerrs);\r
 end\r
 \r
-if bitand(demos,8)\r
+if demo == 4\r
   printf("plot a curve....\n");\r
   plot_curve;\r
 end\r
 \r
-if bitand(demos,16)\r
+if demo == 5\r
 \r
   % generate test data and save to disk\r
 \r
@@ -311,10 +311,15 @@ if bitand(demos,16)
   printf("Nerrs = %d\n", Nerrs);\r
 end\r
 \r
-if bitand(demos,32)\r
+if demo == 6\r
   test_c_encoder;\r
 end\r
 \r
-if bitand(demos,64)\r
+if demo == 7\r
   test_c_decoder;\r
 end\r
+\r
+if demo == 8\r
+   [bytes rs232_bits] = gen_sstv_frame;\r
+   f = fopen("sstv.bin","wb"); fwrite(f, rs232_bits, "uint8"); fclose(f);\r
+end\r