Здравствуйте!
Так уж случилось что через год мне придётся защищать дипломную работу, тема работы - "
Wireless
Simulator"
За основу взят документ:
http://standards.ieee.org/getieee802/download/802.11-2007.pdfСейчас я закончил стадию кодирования, сделал всё точь-в-точь как описано в параграфе 17.3.5.5
Convolutional encoderThe 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
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[i]-'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;
}
В итоге на выходе мы имеем:
110010110111110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100Всё вроде бы хорошо, и замечательно. Было.... пока я не захотел реализовать декодер(Витерби - судя по документации)
Перерыл кучу сайтов, кучу форумов, самый адекватный код видел на сайте
http://www.eccpage.com/ Но после пары дней безуспешных попыток к декодированию пришёл к выводу что он байт-ориентированный.. У меня же лимитируется процесс передачи бит. Задачка как мне до сих пор кажется вполне решаемая и не сложная. Но вот охота послушать ваши мнения. Как стоит написать код для декодирования, если такой уже существует пожалуйста делитесь, если есть какая-либо литература по этому вопросу(кроме Скляра) делитесь тоже. Интересует именно программная реализация, как работает в теории ясно.
Дополнение:Функция:
WSbitDisplaseW16 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;
}
Функция:
WSxor
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;
}