からビタビ復号器を使用します。私のアプリケーションは大きなファイルで動作するため、すべてのシグナルをヒープに挿入することができないため、一連のバッファでデータを処理する必要があります。私はビタビ復号のための良いライブラリを見つけました - 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を。しかし、それはまた、通常の記述を含んでおらず、コンパイルしたくない。さらに、
ExpertCoreと
Forward Error Correction DSP libraryの2つの実装。
私の質問:誰でもバイナリインターリーブされたデジタル信号のための連続使用のためにビタビ・アルゴリズムのGNUラジオの実装上の使用方法を理解することはできます(私の信号のエンコーダパラメータ:K = 7率= 1月2日、すべてのビット私のファイルでは復調された信号のサンプルです)?
、それはhttp://www.ka9q.net/code/fec/、フィル・カーンからソフトウェアを利用するために、あなたのユースケースに合わせて、私は長い時間前に私のLicentiate論文のための彼のファノデコーダ/エンコーダを使用して修正。 –