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

Reply via email to