2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 IEEE 802.11 Viterbi decoding with C
Сообщение05.02.2012, 21:32 
Аватара пользователя


07/07/10
100
Нижний Новгород
Здравствуйте!

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

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group