Jump to content
Калькуляторы

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]

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this