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
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
[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
[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
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
% 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
\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
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
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