2017-01-24 5 views
1

からビタビ復号器を使用します。私のアプリケーションは大きなファイルで動作するため、すべてのシグナルをヒープに挿入することができないため、一連のバッファでデータを処理する必要があります。私はビタビ復号のための良いライブラリを見つけました - Encoder and a Viterbi decoder in C++ on the dr. Dobbs。私はlibararyからデコーダを適用しましたが、正しく動作しますが、連続して使用する関数を提供していません(以前の計算を考慮して各信号バッファに対して関数を何度も呼び出します)。それからthe necessary functionsを提供するGNU Radio C++ libraryが見つかりました。しかし、私は関数を使う方法を理解していません。なぜなら、それはドキュメンテーションを提供しないからです。なお、以下に存在しているとthe example of Viterbi decoding含まれていますは、どのように私はいくつかの<a href="https://en.wikipedia.org/wiki/Convolutional_code" rel="nofollow noreferrer">convolutional-encoded</a>信号のビタビ復号を行う必要があるGNUラジオライブラリ

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; 
} 

ファイルviterbi.cを、それはまた次の機能viterbi()が含まれているから、宣言なし:

/* 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] */ 
    ) { ... 

はまた、私は、ビタビ復号のための1つ以上の実装見つかった - The Spiral projectを。しかし、それはまた、通常の記述を含んでおらず、コンパイルしたくない。さらに、 ExpertCoreForward Error Correction DSP libraryの2つの実装。

私の質問:誰でもバイナリインターリーブされたデジタル信号のための連続使用のためにビタビ・アルゴリズムのGNUラジオの実装上の使用方法を理解することはできます(私の信号のエンコーダパラメータ:K = 7率= 1月2日、すべてのビット私のファイルでは復調された信号のサンプルです)?

+1

、それはhttp://www.ka9q.net/code/fec/、フィル・カーンからソフトウェアを利用するために、あなたのユースケースに合わせて、私は長い時間前に私のLicentiate論文のための彼のファノデコーダ/エンコーダを使用して修正。 –

答えて

0

私はgnuradioの専門家ではないが、私は同様の問題に苦しんでいます。

から

[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 = 7、レート= 1/2エンコーダ、及びBPSK変調を使用していることを見ることができます。したがって、多項式が同じであれば(POLYAとPOLYBを検索しています)、モジュレーションが同じであれば、サンプルコードをそのまま使用することができます。

アンペアパラメータは、BPSK信号の振幅である、[2]を参照します。

viterbi()関数[1]の実装からは、あなたが望むように使用できないように見えます。呼び出しの2回の呼び出しの間に状態を渡すことはできませんが、あなたはviterbi_butterfly2(または他のバージョン)を使用することができます。代替案として

関連する問題

 関連する問題