мне нужно сделать декодирование Витерби какого-то сверточного кодируемого сигнала. Мое приложение должно работать с большими файлами, поэтому я не могу вставить весь сигнал в кучу, поэтому мне нужно обрабатывать данные последовательно отдельных буферов. Я нашел хорошую библиотеку для декодирования Viterbi - Encoder и декодер Viterbi в C ++ на DR. Доббс . Я применил декодер из Libarary, он работает правильно, но не обеспечивает функцию для постоянного использования (вызовите функцию много раз для каждого буфера сигнала с учетом предыдущих расчетов). Затем я нашел библиотеку Radio C ++, которая обеспечивает необходимые функции. Но я не понимаю, как использовать его функции, потому что это не предоставляет документацию. Он содержит пример декодирования Витерби, с помощью приведенного ниже: < /p>
extern "C" {
#include
}
#include
#include
#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 > 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;
}
< /code>
file viterbi.c из него также содержит следующую функцию viterbi () < /code>, без объявления: < /p>
/* 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] */
) { ...
< /code>
Также я нашел еще одну реализацию для декодирования Viterbi - спиральный проект. Но это также не содержит нормального описания и не хочет компилировать. И еще две реализации в библиотеке DSP ExpertCore и Forward Firom. сигнал)?
Подробнее здесь: https://stackoverflow.com/questions/418 ... io-library
Как использовать декодер Viterbi из Radio Library GNU ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение