Перейти к содержимому
Калькуляторы

IEEE 802.11 Viterbi decoding with C

Здравствуйте!

 

Так уж случилось что через год мне придётся защищать дипломную работу, тема работы - "Wireless Simulator"

 

За основу взят документ: http://standards.ieee.org/getieee802/download/802.11-2007.pdf

 

Сейчас я закончил стадию кодирования, сделал всё точь-в-точь как описано в параграфе 17.3.5.5 Convolutional encoder

 

The DATA field, composed of SERVICE, PSDU, tail, and pad parts, shall be coded with a convolutional

encoder of coding rate R = 1/2, 2/3, or 3/4, corresponding to the desired data rate. The convolutional encoder

shall use the industry-standard generator polynomials, g0 = 1338 and g1 = 1718, of rate R = 1/2, as shown in

Figure 17-8. The bit denoted as “A” shall be output from the encoder before the bit denoted as “B.” Higher

rates are derived from it by employing “puncturing.” Puncturing is a procedure for omitting some of the

encoded bits in the transmitter (thus reducing the number of transmitted bits and increasing the coding rate)

and inserting a dummy “zero” metric into the convolutional decoder on the receive side in place of the

omitted bits. The puncturing patterns are illustrated in Figure 17-9. Decoding by the Viterbi algorithm is

recommended.

3b9d2baa6928t.jpg

 

 

 

На вход кодирующей функции поступает такая последовательность:

101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010

 

[syntax lang=c]W8 * WSDecodeBits(W8 *bitSeq)

{

W8 *buf;

 

W8 reg[] = "1111111";

W8 g1[] = "1011011";

W8 g2[] = "1111001";

W16 i, j = 0;

W16 curBit;

W16 res;

 

buf = (W8*)malloc(WS_RAW_MSG_SIZE * 2);

 

if ( NULL == buf )

{

WSFailureReport_m(OUT_OF_MEMORY);

}

 

for (i=0; i<WS_RAW_MSG_SIZE; i++)

{

curBit = bitSeq-'0';

 

(void)WSbitDisplase(curBit, (char**)reg);

(void)WSxor(reg, g1, &res);

 

if (res)

{

buf[j++] = (char)'1';

}

else

{

buf[j++] = (char)'0';

}

 

(void)WSxor(reg, g2, &res);

 

if (res)

{

buf[j++] = '1';

}

else

{

buf[j++] = '0';

}

}

 

buf[WS_RAW_MSG_SIZE * 2] = '\0';

 

return buf;

}[/syntax]

 

 

В итоге на выходе мы имеем:

110010110111110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100

 

 

Всё вроде бы хорошо, и замечательно. Было.... пока я не захотел реализовать декодер(Витерби - судя по документации)

 

Перерыл кучу сайтов, кучу форумов, самый адекватный код видел на сайте http://www.eccpage.com/ Но после пары дней безуспешных попыток к декодированию пришёл к выводу что он байт-ориентированный.. У меня же лимитируется процесс передачи бит. Задачка как мне до сих пор кажется вполне решаемая и не сложная. Но вот охота послушать ваши мнения. Как стоит написать код для декодирования, если такой уже существует пожалуйста делитесь, если есть какая-либо литература по этому вопросу(кроме Скляра) делитесь тоже. Интересует именно программная реализация, как работает в теории ясно.

 

 

 

 

 

 

 

 

 

Дополнение:

 

Функция: WSbitDisplase

[syntax lang=c]W16 WSbitDisplase(W16 b, W8 **reg)

{

int i;

 

for(i=6;i>0;i--)

{

*((char*)reg+i) = *((char*)reg+i-1);

}

 

*((char*)reg) = (char)b + 48;

 

return 0;

}[/syntax]

 

 

Функция: WSxor

[syntax lang=c]int WSxor(char *a, char *mask, int *res)

{

int i, tmp;

tmp = 0;

for(i=0;i<7;i++)

{

if (*(mask+i) == (char)'1')

{

tmp += *(a+i) - '0';

}

}

 

if ( !(tmp%2) )

{

*res = 0;

}

else

{

*res = 1;

}

 

return 0;

}[/syntax]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

однако для начала неплохо было бы поучить язык С? На котором Вы типа пишете... а уже потом что-то реализовывать. Для реализации обычно достаточно стандарта. Кодер/декодер работает с символьной последовательностью и обычно реализуется аппаратно или на DSP. Если же нужна C-model, есть такая штука - TTCN, сгенерирует что угодно. Ну исходники ей генереные для диплома врядле прокатят :) но проверить работоспособность своего кода по ним можно. Оно как раз для этого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ,

 

Для начала хотелось бы спросить, что по вашему мнению мне понадобится от СИ что я по вашему мнению не знаю, с удовольствием подучу.

 

Второй вопрос, в стандартах вроде бы не описывается процесс декодирования... или я что-то путаю?

 

И третий, TTCN может сгенерировать С-код?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что Вам понадобится от Си - это я не знаю, но либо займитесь все же изучением, как на нем писать либо пишите на чем-то другом. Знание синтаксиса языка и умение писать на нем ~ знание как в шахматах ходят фигуры и умение играть.

Декодер надо писать красиво и так, чтобы код был нормально читабелен. Тогда возможно появятся конструкции типа

 if ( buf = malloc(sizeof(W8)*SIZE...) ) { ... }

, и указатель на локальную область памяти не будет возвращаться через стек.

 

http://ieng9.ucsd.edu/~chc019/publication/IEEETWC2006.pdf и там в конце есть список литературы.

 

C-model - это есть описание процесса на языке С. Для этого TTCN и придуман.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.