From: drowe67 Date: Sat, 17 Sep 2016 02:39:56 +0000 (+0000) Subject: ldpc encoded SSTV frames X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=4392410425ebb474081ff7b06659f35fea03fd05;p=freetel-svn-tracking.git ldpc encoded SSTV frames git-svn-id: https://svn.code.sf.net/p/freetel/code@2874 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/ldpc_fsk_lib.m b/codec2-dev/octave/ldpc_fsk_lib.m index 33035abd..72d93148 100644 --- a/codec2-dev/octave/ldpc_fsk_lib.m +++ b/codec2-dev/octave/ldpc_fsk_lib.m @@ -255,17 +255,43 @@ end % One application of FSK LDPC work is SSTV. This function generates a % simulated frame for testing -function [bytes rs232_bits] = gen_sstv_frame +function frame_rs232 = gen_sstv_frame + load('H2064_516_sparse.mat'); + HRA = full(HRA); + mod_order = 2; + code_param = ldpc_init(HRA, mod_order); + + % generate payload data bytes and checksum + data = floor(rand(1,256)*256); + % data = zeros(1,256); checksum = crc16(data); + data = [data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))]; + + % unpack bytes to bits and LPDC encode + + mask = 2.^(0:7); + unpacked_data = []; + for b=1:length(data) + unpacked_data = [unpacked_data bitand(data(b), mask) > 0]; + end + codeword = ldpc_encode(code_param, unpacked_data); + + % generate unpacked header bits + uw = 'abcd'; - bytes = [hex2dec('55')*ones(1,16) hex2dec('ab') hex2dec('cd')]; - bytes = [bytes data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))]; + header = [hex2dec('55')*ones(1,16) hex2dec('ab') hex2dec('cd')]; + unpacked_header = []; + for b=1:length(header) + unpacked_header = [unpacked_header bitand(header(b), mask) > 0]; + end + frame = [unpacked_header codeword 0 0 0 0]; % integer number of bytes + + % insert rs232 framing bits - mask = 2.^(0:7); rs232_bits = []; - for b=1:length(bytes) - bits = bitand(bytes(b),mask) > 0; - rs232_bits = [rs232_bits 0 bits 1]; + frame_rs232 = []; + for b=1:8:length(frame) + frame_rs232 = [frame_rs232 0 frame(b:b+7) 1]; end endfunction diff --git a/codec2-dev/octave/test_ldpc_fsk_lib.m b/codec2-dev/octave/test_ldpc_fsk_lib.m index c2253a69..43a1348c 100644 --- a/codec2-dev/octave/test_ldpc_fsk_lib.m +++ b/codec2-dev/octave/test_ldpc_fsk_lib.m @@ -266,7 +266,7 @@ rand('state',1); % binary flags to run various demos, e.g. "15" to run 1 .. 8 -demo = 7; +demo = 8; if demo == 1 printf("simple_ut....\n"); @@ -320,6 +320,24 @@ if demo == 7 end if demo == 8 - [bytes rs232_bits] = gen_sstv_frame; - f = fopen("sstv.bin","wb"); fwrite(f, rs232_bits, "uint8"); fclose(f); + frames = 100; + EsNodB = 3; + EsNo = 10^(EsNodB/10); + variance = 1/(2*EsNo); + + frame_rs232 = []; + for i=1:frames + frame_rs232 = [frame_rs232 gen_sstv_frame]; + end + + % write hard decn version to disk file, useful for fsk_mod input + + f = fopen("sstv.bin","wb"); fwrite(f, frame_rs232, "char"); fclose(f); + + % soft decision version (with noise) + + s = 1 - 2*frame_rs232; + noise = sqrt(variance)*randn(1,length(frame_rs232)); + r = s + noise; + f = fopen("sstv_sd.bin","wb"); fwrite(f, r, "float32"); fclose(f); end