2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 IEEE 802.11 Viterbi decoding with C
Сообщение05.02.2012, 21:32 
Аватара пользователя
Здравствуйте!

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

код: [ скачать ] [ спрятать ]
Используется синтаксис 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[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/ Но после пары дней безуспешных попыток к декодированию пришёл к выводу что он байт-ориентированный.. У меня же лимитируется процесс передачи бит. Задачка как мне до сих пор кажется вполне решаемая и не сложная. Но вот охота послушать ваши мнения. Как стоит написать код для декодирования, если такой уже существует пожалуйста делитесь, если есть какая-либо литература по этому вопросу(кроме Скляра) делитесь тоже. Интересует именно программная реализация, как работает в теории ясно.









Дополнение:

Функция: WSbitDisplase
Используется синтаксис 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;
}



Функция: WSxor
код: [ скачать ] [ спрятать ]
Используется синтаксис 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;
}

 
 
 [ 1 сообщение ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group