unmanner Posted February 5, 2012 Posted February 5, 2012 Здравствуйте! Так уж случилось что через год мне придётся защищать дипломную работу, тема работы - "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. На вход кодирующей функции поступает такая последовательность: 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] Вставить ник Quote
Ainy Posted February 6, 2012 Posted February 6, 2012 однако для начала неплохо было бы поучить язык С? На котором Вы типа пишете... а уже потом что-то реализовывать. Для реализации обычно достаточно стандарта. Кодер/декодер работает с символьной последовательностью и обычно реализуется аппаратно или на DSP. Если же нужна C-model, есть такая штука - TTCN, сгенерирует что угодно. Ну исходники ей генереные для диплома врядле прокатят :) но проверить работоспособность своего кода по ним можно. Оно как раз для этого. Вставить ник Quote
unmanner Posted February 6, 2012 Author Posted February 6, 2012 Спасибо за ответ, Для начала хотелось бы спросить, что по вашему мнению мне понадобится от СИ что я по вашему мнению не знаю, с удовольствием подучу. Второй вопрос, в стандартах вроде бы не описывается процесс декодирования... или я что-то путаю? И третий, TTCN может сгенерировать С-код? Вставить ник Quote
Ainy Posted February 9, 2012 Posted February 9, 2012 Что Вам понадобится от Си - это я не знаю, но либо займитесь все же изучением, как на нем писать либо пишите на чем-то другом. Знание синтаксиса языка и умение писать на нем ~ знание как в шахматах ходят фигуры и умение играть. Декодер надо писать красиво и так, чтобы код был нормально читабелен. Тогда возможно появятся конструкции типа if ( buf = malloc(sizeof(W8)*SIZE...) ) { ... } , и указатель на локальную область памяти не будет возвращаться через стек. http://ieng9.ucsd.edu/~chc019/publication/IEEETWC2006.pdf и там в конце есть список литературы. C-model - это есть описание процесса на языке С. Для этого TTCN и придуман. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.