2017-01-24 1 views
1

Ich muss Viterbi Decodierung von einigen convolutional-encoded Signal machen. Meine Anwendung sollte mit großen Dateien arbeiten, deshalb kann ich nicht das gesamte Signal in einen Heap einfügen, also muss ich Daten durch eine Sequenz von getrennten Puffern verarbeiten. Ich habe eine gute Bibliothek für die Viterbi-Decodierung gefunden - Encoder and a Viterbi decoder in C++ on the dr. Dobbs. Ich habe den Decoder aus der libarary angewendet, es funktioniert korrekt, bietet aber keine Funktion für die kontinuierliche Verwendung (rufen Sie eine Funktion mehrmals für jeden Signalpuffer unter Berücksichtigung der vorherigen Berechnungen). Dann habe ich die GNU Radio C++ library gefunden, die the necessary functions bereitstellen. Aber ich verstehe nicht, wie man seine Funktionen benutzt, weil es keine Dokumentation zur Verfügung stellt. Es enthält the example of Viterbi decoding mit unten vorhanden ist:Wie Viterbi Decoder von GNU Radio-Bibliothek zu verwenden

extern "C" { 
#include <gnuradio/fec/viterbi.h> 
} 

#include <cstdio> 
#include <cmath> 

#define MAXCHUNKSIZE 4096 
#define MAXENCSIZE MAXCHUNKSIZE*16 

int main() 
{ 
    unsigned char data[MAXCHUNKSIZE]; 
    signed char syms[MAXENCSIZE]; 
    int count = 0; 

    // Initialize metric table 
    int mettab[2][256]; 
    int amp = 100; // What is it? *** 
    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); 

    while (!feof(stdin)) { 
    unsigned int n = fread(syms, 1, MAXENCSIZE, stdin); 
    unsigned char *out = data; 

    for (unsigned int i = 0; i < n; i++) { 

     // FIXME: This implements hard decoding by slicing the input stream 
     unsigned char sym = syms[i] > 0 ? -amp : amp; // What is it? *** 

     // Write the symbol to the decoder input 
     viterbi_in[count % 4] = sym; 

     // Every four symbols, perform the butterfly2 operation 
     if ((count % 4) == 3) { 
     viterbi_butterfly2(viterbi_in, mettab, state0, state1); 

    // Every sixteen symbols, perform the readback operation 
     if ((count > 64) && (count % 16) == 11) { 
      viterbi_get_output(state0, out); 
     fwrite(out++, 1, 1, stdout); 
    } 
     } 

     count++; 
    } 
    } 

    return 0; 
} 

Datei viterbi.c aus es enthält auch die nächste Funktion viterbi(), ohne eine Erklärung:

/* Viterbi decoder */ 
int viterbi(unsigned long *metric, /* Final path metric (returned value) */ 
    unsigned char *data, /* Decoded output data */ 
    unsigned char *symbols, /* Raw deinterleaved input symbols */ 
    unsigned int nbits, /* Number of output bits */ 
    int mettab[2][256] /* Metric table, [sent sym][rx symbol] */ 
    ) { ... 

Auch fand ich eine weitere Implementierung für Viterbi-Decodierung - The Spiral project. Es enthält aber auch keine normale Beschreibung und möchte nicht kompilieren. Und zwei weitere Implementierung auf der ExpertCore und Forward Error Correction DSP library.

Meine Frage: Kann jemand verstehen, wie für den Dauereinsatz für binäres verschachteltes digitales Signal (Encoder Parameter meines Signal die oben GNU Radio-Implementierung des Viterbi-Algorithmus verwenden: K = 7 Rate = 02.01, jedes Bit in meiner Datei ist eine demodulierte Probe eines Signals)?

+1

Als Alternative, ist es Ihre usecase paßt Software von Phil Karn zu nutzen, http://www.ka9q.net/code/fec/ I verwendet und modifizierte seinen Fano-Decoder/Encoder für meine Lizentiatsarbeit vor langer Zeit . –

Antwort

0

Ich bin kein Experte von gnuradio, aber ich mit einem ähnlichen Problem habe Schwierigkeiten.

Von

[1] https://github.com/gnuradio/gnuradio/blob/master/gr-fec/lib/viterbi/viterbi.c

[2] https://github.com/gnuradio/gnuradio/blob/master/gr-fec/lib/viterbi/metrics.c

können wir sehen, dass sie bereits einen K verwenden = 7, Rate = 1/2-Encoder und eine BPSK-Modulation. Also, wenn Ihre Polynome die gleichen sind, die sie verwenden (Suche nach POLYA und POLYB) und die Modulation ist die gleiche, ich glaube, Sie können den Beispielcode verwenden, wie er ist.

Der Verstärker Parameter die Amplitude des BPSK-Signal ist, siehe [2].

Von der Implementierung der viterbi() - Funktion [1] sieht es so aus, als könnten Sie es nicht so verwenden, wie Sie wollen: Es sieht nicht so aus, als könnten Sie den Zustand zwischen zwei Aufrufen des Aufrufs übergeben Sie verwenden viterbi_butterfly2 (oder eine andere Version) sollte es möglich sein.