add test for C LDPC encoder
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 12 Sep 2016 09:43:19 +0000 (09:43 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 12 Sep 2016 09:43:19 +0000 (09:43 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2858 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/test_ldpc_fsk_lib.m

index 12e4859ce83cefe94d3ab0cbcf4c7da62ec3e658..f86a8b936eb56d4eb5e3ffdc51dbafd4b195342f 100644 (file)
@@ -9,7 +9,7 @@
 % decode_from_file() below, and can optionally generate include file for\r
 % C version of decoder.\r
 \r
-function data = simple_ut(c_include_file)\r
+function [data code_param] = simple_ut(c_include_file)\r
   load('H2064_516_sparse.mat');\r
   HRA = full(HRA);  \r
   max_iterations = 100;\r
@@ -37,8 +37,7 @@ function data = simple_ut(c_include_file)
   error_positions = xor(detected_data(1:code_param.data_bits_per_frame), data);\r
   Nerrs = sum(error_positions);\r
 \r
-  printf("  Nerrs = %d\n", Nerrs);\r
-\r
+  printf("Nerrs = %d\n", Nerrs);\r
 end\r
 \r
 \r
@@ -107,6 +106,52 @@ function plot_curve
 end\r
 \r
 \r
+% Test C encoder\r
+\r
+function test_c_encoder\r
+  load('H2064_516_sparse.mat');\r
+  HRA = full(HRA);  \r
+  max_iterations = 100;\r
+  decoder_type = 0;\r
+  EsNodB = 3;\r
+  mod_order = 2;\r
+  frames = 100;\r
+\r
+  EsNo = 10^(EsNodB/10);\r
+  variance = 1/(2*EsNo);\r
+\r
+  code_param = ldpc_init(HRA, mod_order);\r
+\r
+  data = round(rand(1,frames*code_param.data_bits_per_frame));\r
+  f = fopen("data.bin","wt"); fwrite(f, data, "uint8"); fclose(f);\r
+\r
+  % Outboard C encoder\r
+\r
+  system("../src/ldpc_enc data.bin codewords.bin"); \r
+\r
+  % Test with Octave decoder\r
+\r
+  f = fopen("codewords.bin","rb"); codewords = fread(f, "uint8")'; fclose(f);\r
+  \r
+  Nerrs = 0;\r
+  for i=1:frames\r
+    st = (i-1)*code_param.symbols_per_frame+1; en = st+code_param.symbols_per_frame-1;\r
+    tx = 1 - 2 * codewords(st:en);   \r
+\r
+    noise = sqrt(variance)*randn(1,code_param.symbols_per_frame); \r
+    rx = tx + noise;\r
+\r
+    [detected_data Niters] = ldpc_decode(rx, code_param, max_iterations, decoder_type);\r
+\r
+    st = (i-1)*code_param.data_bits_per_frame+1; en = st+code_param.data_bits_per_frame-1;\r
+    error_positions = xor(detected_data(1:code_param.data_bits_per_frame), data(st:en));\r
+    Nerrs += sum(error_positions);\r
+  end\r
+\r
+  printf("Nerrs = %d\n", Nerrs);\r
+end\r
+\r
+\r
 % Start simulation --------------------------------------------------------\r
 \r
 more off;\r
@@ -138,9 +183,9 @@ ldpc_fsk_lib;
 randn('state',1);\r
 rand('state',1);\r
 \r
-% binary flags to run various demos, e.g. "15" runs them all\r
+% binary flags to run various demos, e.g. "15" to run 1 .. 8\r
 \r
-demos = 2;\r
+demos = 32;\r
 \r
 if bitand(demos,1)\r
   printf("simple_ut....\n");\r
@@ -154,6 +199,7 @@ end
 \r
 if bitand(demos,4)\r
   printf("decode_from_file ......\n");\r
+  data = simple_ut;\r
   detected_data = decode_from_file("codeword.bin");\r
   error_positions = xor( detected_data(1:length(data)), data );\r
   Nerrs = sum(error_positions);\r
@@ -165,3 +211,26 @@ if bitand(demos,8)
   plot_curve;\r
 end\r
 \r
+if bitand(demos,16)\r
+\r
+  % generate test data and save to disk\r
+\r
+  [data code_param] = simple_ut;\r
+  f = fopen("dat_in2064.bin","wb"); fwrite(f, data, "uint8"); fclose(f);\r
+\r
+  % Outboard C encoder\r
+\r
+  system("../src/ldpc_enc dat_in2064.bin dat_op2064.bin"); \r
+\r
+  % Test with Octave decoder\r
+\r
+  detected_data = decode_from_file("dat_op2064.bin");\r
+  error_positions = xor(detected_data(1:length(data)), data);\r
+  Nerrs = sum(error_positions);\r
+  printf("Nerrs = %d\n", Nerrs);\r
+end\r
+\r
+\r
+if bitand(demos,32)\r
+  test_c_encoder;\r
+end\r