Jump to content

Recommended Posts

Posted

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

 

Так уж случилось что через год мне придётся защищать дипломную работу, тема работы - "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]

Posted

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

Posted

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

 

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

 

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

 

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

Posted

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

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

 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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.