Мне нужно сделать расшифровку Витерби некоторых сверточного кодирования сигнал. Мое приложение должно работать с большими файлами, поэтому я не могу вставить весь сигнал в кучу, поэтому мне нужно обрабатывать данные с помощью последовательности отдельных буферов. Я нашел хорошую библиотеку для декодирования Витерби — Кодировщик и декодер Витерби в C ++ на д-ра. Доббс. Я применил декодер из библиотеки, он работает правильно, но не предоставляет функцию для непрерывного использования (многократно вызывайте функцию для каждого буфера сигналов с учетом предыдущих вычислений). Тогда я нашел Библиотека GNU Radio C ++ которые обеспечивают необходимые функции. Но я не понимаю, как использовать его функции, потому что он не предоставляет документацию. Это содержит пример декодирования Витерби с присутствует ниже:
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] */
) { ...
Также я нашел еще одну реализацию для декодирования Витерби — Спиральный проект. Но он также не содержит нормального описания и не хочет компилироваться. И еще две реализации на ExpertCore а также Библиотека прямого исправления ошибок DSP.
Мой вопрос: Может кто-нибудь понять, как использовать вышеупомянутую реализацию GNU Radio алгоритма Витерби для непрерывного использования для двоичного цифрового сигнала с чередованием (Параметры моего сигнала кодера: K = 7 rate = 1/2, каждый бит в моем файле является демодулированной выборкой сигнал)?
Я не специалист по 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), а модуляция такая же, я полагаю, вы можете использовать пример кода как есть.
Параметр amp — это амплитуда сигнала BPSK, см. [2].
Из реализации функции viterbi () [1] похоже, что вы не можете использовать ее так, как хотите: не похоже, что вы можете передавать состояние между двумя вызовами вызова, но если вы используете viterbi_butterfly2 ( или любая другая версия) это должно быть возможно.
Других решений пока нет …