ldpc encoded SSTV frames
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 17 Sep 2016 02:39:56 +0000 (02:39 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 17 Sep 2016 02:39:56 +0000 (02:39 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2874 01035d8c-6547-0410-b346-abe4f91aad63

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

index 33035abdd198b09cc576e9b76129dec84ebcb873..72d931487152396b10593b186063766a6756c9b7 100644 (file)
@@ -255,17 +255,43 @@ end
 % 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
+function frame_rs232 = gen_sstv_frame\r
+  load('H2064_516_sparse.mat');\r
+  HRA = full(HRA);  \r
+  mod_order = 2;\r
+  code_param = ldpc_init(HRA, mod_order);\r
+\r
+  % generate payload data bytes and checksum\r
+\r
   data = floor(rand(1,256)*256);\r
+  % data = zeros(1,256);\r
   checksum = crc16(data);\r
+  data = [data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))];\r
+\r
+  % unpack bytes to bits and LPDC encode\r
+\r
+  mask = 2.^(0:7);\r
+  unpacked_data = [];\r
+  for b=1:length(data)\r
+    unpacked_data = [unpacked_data bitand(data(b), mask) > 0];\r
+  end\r
+  codeword = ldpc_encode(code_param, unpacked_data);\r
+\r
+  % generate unpacked header bits\r
+\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
+  header = [hex2dec('55')*ones(1,16) hex2dec('ab') hex2dec('cd')];\r
+  unpacked_header = [];\r
+  for b=1:length(header)\r
+    unpacked_header = [unpacked_header bitand(header(b), mask) > 0];\r
+  end\r
+  frame = [unpacked_header codeword 0 0 0 0]; % integer number of bytes\r
+\r
+  % insert rs232 framing bits\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
+  frame_rs232 = [];\r
+  for b=1:8:length(frame)\r
+    frame_rs232 = [frame_rs232 0 frame(b:b+7) 1];\r
   end\r
 endfunction\r
 \r
index c2253a690bd456b45ce5917e308548eabe6fda16..43a1348c29653d9b8a8ee4694ce1a87d467a9a33 100644 (file)
@@ -266,7 +266,7 @@ rand('state',1);
 \r
 % binary flags to run various demos, e.g. "15" to run 1 .. 8\r
 \r
-demo = 7;\r
+demo = 8;\r
 \r
 if demo == 1\r
   printf("simple_ut....\n");\r
@@ -320,6 +320,24 @@ if demo == 7
 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
+  frames = 100;\r
+  EsNodB = 3;\r
+  EsNo = 10^(EsNodB/10);\r
+  variance = 1/(2*EsNo);\r
+\r
+  frame_rs232 = [];\r
+  for i=1:frames\r
+    frame_rs232 = [frame_rs232 gen_sstv_frame];\r
+  end\r
+\r
+  % write hard decn version to disk file, useful for fsk_mod input\r
+\r
+  f = fopen("sstv.bin","wb"); fwrite(f, frame_rs232, "char"); fclose(f);\r
+\r
+  % soft decision version (with noise)\r
+\r
+  s = 1 - 2*frame_rs232;\r
+  noise = sqrt(variance)*randn(1,length(frame_rs232)); \r
+  r = s + noise;\r
+  f = fopen("sstv_sd.bin","wb"); fwrite(f, r, "float32"); fclose(f);\r
 end\r