tankist 0 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Здравствуйте! Появилась необходимость в реализации сверточного кода со скоростью 2/3. Для образования кода использую генерацию со скоростью 1/2 с помощью двух полиномов 133 и 171. Далее провожу перфорацию данного кода путем отбрасывания кадого четвертого бита. Результирующая скорость кода при этом возрастает до требуемых 2/3. Для проверки работы кода создал модель в Matlab. Проверил - декодирует, даже исправляет ошибки). Но радость была недолгой - обнаружилось, что хотя код в состоянии справить и 5 ошибок, он не может исправить даже одну, если она расположена в "хвосте" закодированной последовательности. Размер исходного кадра - 40 бит, закодированного - 60 бит. Длина "хвоста" примерно 5-8 бит. Привожу код модели. dataIn = randi([0, 1], 1, 40); % входной вектор rate = 2/3; tblen = 20; ber = 2; % вероятность ошибок в канале, в процентах trellis = poly2trellis(7,[133,171]); % создание решетки %% encoder - кодируем на скорости 1/2 dataEncoded = convenc(dataIn, trellis, 0); %% perforation - выбрасываем каждый 4-ый бит dataEncoded(4:4:length(dataEncoded))=0.5; dataEncoded = dataEncoded(find(dataEncoded ~= 0.5)); %% distortion - вносим искажения в случайные позиции исходя из заданной вероятности ошибки numer = round((length(dataIn) / rate) * ber / 100); errors = randi([1, length(dataIn) / rate], 1, numer); %errors = 57; % ФАТАЛИТИ! Можно закомментировать верхнюю строчку и определить позицию ошибки вручную. dataEncoded(errors) = 1 - dataEncoded(errors); %% decoder - декодируем перфорированный сигнал [dataDecoded] = vitdec(dataEncoded, trellis, tblen, 'trunc', 'hard', [1 1 1 0]); %% result - подсчитываем ошибки numErrors = sum(dataIn ~= dataDecoded); res = find(dataIn ~= dataDecoded); fprintf('ber = %d\n', numErrors); fprintf('pos = '); fprintf('%d, ', res); fprintf('\n'); Может кто-нибудь подсказать, в чем может быть причина такого поведения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 20 октября, 2015 Опубликовано 20 октября, 2015 (изменено) · Жалоба Может кто-нибудь подсказать, в чем может быть причина такого поведения? Какой был объем статистики при моделировании? Это свойство алгоритма с truncated. http://www.xilinx.com/support/documentatio...tes/xapp551.pdf В конце фрейма ошибок больше. Изменено 20 октября, 2015 пользователем Grizzzly Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andyp 9 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Может кто-нибудь подсказать, в чем может быть причина такого поведения? Декодер не знает конечного состояния решетки. Добавьте в хвост информационных бит 6 нулей и используйте режим 'term' Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Декодер не знает конечного состояния решетки. Добавьте в хвост информационных бит 6 нулей и используйте режим 'term' Спасибо за пояснение. Проблема в том, что сообщение будет передаваться по каналу связи, и все размеры рассчитаны до бита - я не могу добавить лишнюю информацию. То есть на входе и имею четко 40 бит, на выходе четко 60 бит. Как добиться полного декодирования в этом случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба сообщение будет передаваться по каналу связи, и все размеры рассчитаны до бита - я не могу добавить лишнюю информацию. То есть на входе и имею четко 40 бит, на выходе четко 60 бит. Как добиться полного декодирования в этом случае? 1. Уменьшить скорость кодирования. 2. Взять код с циклической решеткой и итерационным декодированием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба tankist Самое простое: удалите первые 12 закодированных бит (полностью) и добавте 6 терминирующих. На приёме оставшиеся 6 бит (удалённые) получаете по состоянию декодера (номеру метрики). Хотя 40 бит для перфорированного 133/171 маловато будет. Там глубина сливания путей, ЕМНИП, равна 7,5К (К = размер линии задержки), то есть 45. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Спасибо за пояснение. Проблема в том, что сообщение будет передаваться по каналу связи, и все размеры рассчитаны до бита - я не могу добавить лишнюю информацию. То есть на входе и имею четко 40 бит, на выходе четко 60 бит. Как добиться полного декодирования в этом случае? Немного улучшить помехоустойчивость может tail biting. В доке Xilinx про это написано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg76 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба 2. Взять код с циклической решеткой +1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 30 октября, 2015 Опубликовано 30 октября, 2015 · Жалоба Спасибо! Более-менее разобрался. В процессе моделирования возник вопрос: можно ли в матлабе реализовать тэйл-битинг, чтобы не передавать лишних нулей? Прочитал хелп по convenc, но нигде не нашел упоминания, как это сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 30 октября, 2015 Опубликовано 30 октября, 2015 (изменено) · Жалоба Спасибо! Более-менее разобрался. В процессе моделирования возник вопрос: можно ли в матлабе реализовать тэйл-битинг, чтобы не передавать лишних нулей? Прочитал хелп по convenc, но нигде не нашел упоминания, как это сделать. Есть модель для Simulink: http://www.mathworks.com/help/comm/example...ml#zmw57dd0e646 Подозреваю, что она появилась в новых версиях MATLAB. Еще что-то здесь нашлось: http://code.google.com/r/normdeplume-wimax...=feature_branch В m-файлах есть кодер и декодер, через vitdec сделано. Изменено 30 октября, 2015 пользователем Grizzzly Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 10 ноября, 2015 Опубликовано 10 ноября, 2015 · Жалоба Есть модель для Simulink: http://www.mathworks.com/help/comm/example...ml#zmw57dd0e646 Подозреваю, что она появилась в новых версиях MATLAB. Еще что-то здесь нашлось: http://code.google.com/r/normdeplume-wimax...=feature_branch В m-файлах есть кодер и декодер, через vitdec сделано. Большое спасибо за ссылку! Модель в симулинке, к сожалению, не столь интересна, ибо моделирую сценарием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 10 ноября, 2015 Опубликовано 10 ноября, 2015 · Жалоба Большое спасибо за ссылку! Модель в симулинке, к сожалению, не столь интересна, ибо моделирую сценарием. Ссылку на Simulink привел, скорее, чтобы показать график. Также там есть ценная статья с субоптимальным алгоритмом (Y. E. Wang and R. Ramesh, "To Bite or not to Bite ? A study of Tail Bits vs. Tail-Biting," Personal, Indoor and Mobile Radio Communications, 1996. PIMRC'96, Seventh IEEE® International Symposium, Volume 2, Oct. 15-18, 1996, Page(s):317 - 321.). Он как раз и реализован в той модели. Если делать "в лоб", то вычислительная сложность по сравнению с обычным Витерби во много раз выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться