Новичок
Регистрация: 05.02.2012
Сообщений: 3
Репутация: 10
![]() |
Здравствуйте!
Так уж случилось что через год мне придётся защищать дипломную работу, тема работы - "Wireless Simulator" За основу взят документ: http://standards.ieee.org/getieee802...02.11-2007.pdf Сейчас я закончил стадию кодирования, сделал всё точь-в-точь как описано в параграфе 17.3.5.5 Convolutional encoder [size=]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.[/size] ![]() На вход кодирующей функции поступает такая последовательность: 10101010101010101010101010101010101010101010101010 1010101010101010101010101010101010101010101010 [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[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; }[/syntax] В итоге на выходе мы имеем: 11001011011111001100110011001100110011001100110011 00110011001100110011001100110011001100110011001100 11001100110011001100110011001100110011001100110011 001100110011001100110011001100110011001100 Всё вроде бы хорошо, и замечательно. Было.... пока я не захотел реализовать декодер(Витерби - судя по документации) Перерыл кучу сайтов, кучу форумов, самый адекватный код видел на сайте 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] |
||
Оценка
|
Новичок
|
Посмотрите в книге Морелос-Сарагоса Р. "Искусство помехоустройчивого кодирования", она есть на русском, по-моему там неплохо написано об этом декодере. На сайте http://the-art-of-ecc.com/ этой книги есть много программ кодеров-декодеров, вроде и Витерби есть.
А о чем ваш диплом если не секрет? |
||
Оценка
|
Новичок
Регистрация: 09.02.2011
Сообщений: 4
Репутация: 10
![]() |
Viterbi decoding with C
Если вопрос еще актуален, предлагаю взглянуть на реализацию кодека в GNU Radio: viterbi. Может будут интересными ссылки на открытые проекты GNU Radio wireless и отечественный проект Wimax-scanner.
Удачи. |
||
Оценка
|
Новичок
Регистрация: 05.02.2012
Сообщений: 3
Репутация: 10
![]() |
Огромное спасибо за ответы!
Мой диплом представляет собой симулятор для анализа потерь, snr, многолучёвости, и тп. Ничего особо сложного, фактически просто проверка основных результатов (уже полученных). Сейчас попробовал кодер/декодер с GNU Radio, дело в том что это реальная, рабочая вещь, кодирует - декодирует реальную информацию.. А мне же нужно кодировать - декодировать всего-то 300 - 500 бит. У меня задача - показать наглядно, на примерах из нулей и единиц. Вот я и изобретаю(как сейчас уже начинаю понимать) велосипед... |
||
Оценка
|
Новичок
Регистрация: 09.02.2011
Сообщений: 4
Репутация: 10
![]() |
GSMSP
Понятно.
Могу предложить декодер Витерби из проекта GSM Scanner Project (GSMSP), предельно подробно выполненный в MatLab в виде m-файла. Декодер предназначен для декодирования L2-сообщений GSM (456 битов сверточного кода со скоростью 1/2). Если будет интерес, могу предоставить ссылку (или hackchina.com в помощь ![]() |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |