Jean-Michel FRIEDT wrote:
I am currently investigating LRPT (as used by METEOR-M2) and am stuck with the Viterbi decoder. While trying to use https://github.com/gnuradio/gnuradio/blob/master/gr-fec/lib/viterbi/decode.cc which implements
I tried building this program on Windows and failed. Since it's missing in viterbi/CmakeLists.txt, I fail to see it's built by default. How did you compile it? Are you sure it wasn't written on a big-endian machine? On Windows at least, the viterbi.h + decode.cc + encode.cc are not up-to-date. Missing proper dllexport, setmode(fd,O_BINARY) etc. etc. Anyway, with some patching I was able to link and run them. But I have no data to test the Viterbi encoder/decoder with. Could you please ship some files to me?
I am unable to encode the sync word 0x1ACFFC1D to the expected result 0xfc 0xa2 0xb6 0x3d 0xb0 0x0d 0x97 0x94 as explained at https://www.teske.net.br/lucas/2016/11/goes-satellite-hunt-part-3-frame-decoder/ I know this encoded sync word is correct because cross-correlating the METEOR stream (after proper constellation rotation) with this word gives a correlation peak every 16384 samples (=1024 byte sentence * 8 bits/byte * 2 bits/Viterbi encoder). I am doing (word.bin was generated with Octave's fwrite function) $ xxd word.bin 00000000: 1acf fc1d 0000 0000 0000 .......... and then $ cat word.bin | ./viterbi/encode > t.bin but $ xxd t.bin 00000000: 0000 0000 0000 0101 0001 0001 0101 0001 ................ 00000010: 0001 0000 0100 0001 0101 0000 0000 0100 ................ 00000020: 0001 0000 0101 0101 0101 0101 0000 0100 ................ 00000030: 0001 0100 0100 0000 0001 0100 0100 0101 ................ 00000040: 0000 0001 0001 0101 0001 0101 0000 0000 ................ does not match the expected bit sequence which should be word=[1 1 1 1 1 1 0 0 ... % fc 1 0 1 0 0 0 1 0 ... % a2 1 0 1 1 0 1 1 0 ... % b6 0 0 1 1 1 1 0 1 ... % 3d 1 0 1 1 0 0 0 0 ... % b0 0 0 0 0 1 1 0 1 ... % 0d 1 0 0 1 0 1 1 1 ... % 97 1 0 0 1 0 1 0 0 ... % 94
I had no lock with 'xxd -revert' to check your results here I used the attached hex2bin.c instead. And BTW, my patches also attached. -- --gv
/* * hex2bin - simple hex to bin filter * anti...@invece.org - under GPL version 2 */ #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <string.h> static int hex2bin (void) { char hex[3]; int d = 0; unsigned char c; int stdin_fd = fileno(stdin); int n_read; while ((n_read = read(stdin_fd, hex, sizeof(hex)-1)) > 0) { if (n_read == 1) { if (hex[0] != '\n') { fprintf (stderr, "input parse error, odd digits in hex file\n"); return (1); } return (1); } hex[2] = '\0'; sscanf (hex, "%x", &d); c = (unsigned char) d; printf ("%c", c); } return (0); } static int bin2hex (void) { int stdin_fd = fileno(stdin); int n_read; unsigned char c; #ifdef _WIN32 setmode (fileno(stdin), O_BINARY); setmode (fileno(stdout), O_BINARY); #endif while ((n_read = read(stdin_fd, &c, 1)) > 0) printf ("%.2x", c); return (0); } int main (int argc, char **argv) { if (argc >= 2 && strstr(argv[1], "-r")) return bin2hex(); return hex2bin(); }
--- a/gr-fec/include/gnuradio/fec/viterbi.h 2015-12-16 20:39:46 +++ b/gr-fec/include/gnuradio/fec/viterbi.h 2018-08-10 12:33:59 @@ -24,6 +24,13 @@ * But it fits so nicely into a 32-bit machine word... */ +#ifndef INCLUDED_VITERBI_H +#define INCLUDED_VITERBI_H + +#ifdef __cplusplus +extern "C" { +#endif + #include <gnuradio/fec/api.h> struct viterbi_state { @@ -51,3 +58,10 @@ FEC_API unsigned char viterbi_get_output(struct viterbi_state *state, unsigned char *outbuf); + +#ifdef __cplusplus +}; +#endif + +#endif /* INCLUDED_VITERBI_H */ + --- a/gr-fec/lib/viterbi/decode.cc 2015-12-16 20:39:46 +++ b/gr-fec/lib/viterbi/decode.cc 2018-08-10 14:05:31 @@ -49,14 +49,21 @@ float RATE=0.5; float ebn0 = 12.0; float esn0 = RATE*pow(10.0, ebn0/10); + gen_met(mettab, amp, esn0, 0.0, 4); // Initialize decoder state struct viterbi_state state0[64]; struct viterbi_state state1[64]; unsigned char viterbi_in[16]; + viterbi_chunks_init(state0); +#ifdef _WIN32 + setmode (fileno(stdin), O_BINARY); + setmode (fileno(stdout), O_BINARY); +#endif + while (!feof(stdin)) { unsigned int n = fread(syms, 1, MAXENCSIZE, stdin); unsigned char *out = data; --- a/gr-fec/lib/viterbi/encode.cc 2015-12-16 20:39:46 +++ b/gr-fec/lib/viterbi/encode.cc 2018-08-10 14:05:55 @@ -44,6 +44,11 @@ unsigned char data[MAXCHUNKSIZE]; unsigned char syms[MAXENCSIZE]; +#ifdef _WIN32 + setmode (fileno(stdin), O_BINARY); + setmode (fileno(stdout), O_BINARY); +#endif + while (!feof(stdin)) { unsigned int n = fread(data, 1, MAXCHUNKSIZE, stdin); encoder_state = encode(syms, data, n, encoder_state); --- a/gr-fec/lib/viterbi/metrics.c 2015-12-16 20:39:46 +++ b/gr-fec/lib/viterbi/metrics.c 2018-08-10 09:57:03 @@ -30,6 +30,8 @@ * */ +#include <gnuradio/fec/viterbi.h> + #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -42,8 +44,10 @@ #include <stdlib.h> #include <math.h> -//declare erf in case it was missing in math.h and provided for by the build system -extern double erf(double x); +#ifndef HAVE_ERF + //declare erf in case it was missing in math.h and provided for by the build system + extern double erf(double x); +#endif /* Normal function integrated from -Inf to x. Range: 0-1 */ #define normal(x) (0.5 + 0.5*erf((x)/M_SQRT2)) @@ -54,7 +58,7 @@ /* Generate log-likelihood metrics for 8-bit soft quantized channel * assuming AWGN and BPSK */ -void +int gen_met(int mettab[2][256], /* Metric table, [sent sym][rx symbol] */ int amp, /* Signal amplitude, units */ double esn0, /* Es/N0 ratio in dB */ @@ -123,4 +127,5 @@ #endif } } + return (0); }
_______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio