Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перфорирование при сверточном кодировании
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
Muscat
Возник вопрос по реализации перфорации в сверточном декодере.
Кодер классический (7,[171 133]) со скоростью 1/2 путем перфорации ускоряется до 3/4, что согласно теории должно давать незначительный проигрыш по BER.

Теория - битовый поток делится на блоки по 6, из которых удаляется 2 бита 4 и 5. Оставшиеся 4 передаются.
На приемной стороне выполняется операция деперфорации, пропущенные биты заменяются на состояние NULL (все равно реализовывать не будем),
либо на слабую единицу/слабый ноль. У меня идет замена на слабый нуль - 3. (0.1.2.3)
Операция перфорации выполняется вот так
Код
       ncode_2(4:6:2*D)=0.5;
        ncode_2(5:6:2*D)=0.5;


Как видно из графиков отставание такой кривой от кривой без перфорации достигает почти 4 дБ, что уже ни в какие ворота.
Если заменять не тройками, чередование 3 и 4, (оч. слабый ноль-оч. слабая единица), как рекомендуются в одном из мануалов TI
Код
        qcode_2(4:12:2*D)=3;
        qcode_2(10:12:2*D)=4;
        qcode_2(5:12:2*D)=4;
        qcode_2(11:12:2*D)=3;

То отсавание становится еще больше, доходя до 5 дБ.
Каково нормальное значение проигрыша по BER в случае использования перфорации?
Ведь во всем мире ипользуют перфорацию, и вряд ли стали бы это делать, если бы она давала такой проигрыш.

Если поставить SNR=100, ну то есть исключить все ошибки кроме перфорации, то вся последовательность декодируется правильно и без ошибок.
Да, я использовал встроенные функции Матлаба, вместо своего декодера, так как они работают в 100 раз быстрее. Но результаты дают практически такие же (мой пока проигрывает 0.5 дБ, но это я потом еще отдельно буду выяснять).

Полный код m файла ниже
Код
clear all;
SNR_MAX=11;
BER_NO_PERF(1:SNR_MAX)=0;
BER_PERF(1:SNR_MAX)=0;
D=10000;
msg = randint(D,1,2,139); % Random data
t = poly2trellis(7,[171 133]); % Define trellis.
code = convenc(msg,t); % Encode the data.


for i=1:SNR_MAX
        ncode = awgn(code,i,'measured',244); % Add noise.
    
        ncode_1=ncode;
        qcode = quantiz(ncode_1,[0.001,.1,.3,.5,.7,.9,.999]);
        tblen = 48;
        delay = tblen; % Traceback length
        decoded = vitdec(qcode,t,tblen,'cont','soft',3); % Decode.
        % Compute bit error rate.
        [number,ratio] = biterr(decoded(delay+1:end),msg(1:end-delay));
        BER_NO_PERF(i)=ratio;
    
        ncode_2=ncode;
%         ncode_2(4:6:2*D)=0.5;
%         ncode_2(5:6:2*D)=0.5;
        qcode_2= quantiz(ncode_2,[0.001,.1,.3,.5,.7,.9,.999]);
        
        qcode_2(4:12:2*D)=3;
        qcode_2(10:12:2*D)=4;
        qcode_2(5:12:2*D)=4;
        qcode_2(11:12:2*D)=3;
        
        tblen = 48;
        delay = tblen; % Traceback length
        decoded = vitdec(qcode_2,t,tblen,'cont','soft',3); % Decode.
        % Compute bit error rate.
        [number,ratio] = biterr(decoded(delay+1:end),msg(1:end-delay));
        BER_PERF(i)=ratio;
   end

semilogy(1:SNR_MAX,BER_NO_PERF)
hold on;
semilogy(1:SNR_MAX,BER_PERF)
hold off;
grid on
petrov
Этот код с перфорацией во многих стандартах используется, вот например таблица из DVB-T
Нажмите для просмотра прикрепленного файла
Muscat
Спасибо за информацию, но меня все же интересует конкретно мой случай - насколько сильно должен отличаться результат с перфорацией от результата без него и если у меня это значение слишком велико, то как сделать декодер правильно.

В таблице я так понимаю это уже данные прошедшие кодек Рида-Соломона, моделировать еще и модуляцию-код Рида-Соломона?
petrov
Не надо рида-соломона моделировать, в шапке же написано что в таблице указан требуемый сигнал/шум для достижения BER=2*10^-4 на выходе декодера Витерби.

Проверьте правильно ли вы считаете сигнал/шум для ваших графиков.
Muscat
Проверьте правильно ли вы считаете сигнал/шум для ваших графиков.

ncode = awgn(code,i,'measured',244); % Add noise.

Взято из Матлабовской справки. Так правильно?

Увеличив последовательность до 100к посмотрел на результаты, в целом числа похожи, если у чистого кодера 10^-4 дается при 6дБ, то при выкалывании требуется 10 дБ, у меня проигрыш 4 дБ, по таблице 3. Сравнимые величины
Так все же, правильно ли я моделирую и декодирую это самое перфорирование?
petrov
Цитата(Muscat @ Jul 13 2010, 08:36) *
ncode = awgn(code,i,'measured',244); % Add noise.

Взято из Матлабовской справки. Так правильно?


Вот и проверьте. Сигнал у вас есть, шум есть, измеряйте мощности, считайте сигнал/шум или Eb/N0 и т. п., сравните с тем что у вас на оси абсцисс на графике.
Muscat
Из первого же графика ясно видно что нет, у меня BER достигается при 10-12 дБ.
Как правильно сымитировать АБГШ в канале функциями Матлаба, так как прямое мнение функции AWGN явно отличается по эффекту от этого самого AWGN на реальный сигнал?

Вот график созданный в BerTool, тут все практически в точности согласно теорри (3.4 против 3.2)
Serg76
Цитата(Muscat @ Jul 13 2010, 05:34) *
На приемной стороне выполняется операция деперфорации, пропущенные биты заменяются на состояние NULL (все равно реализовывать не будем),
либо на слабую единицу/слабый ноль. У меня идет замена на слабый нуль - 3. (0.1.2.3)

Неправильно вставляете пропущенные биты - в решетку декодера необходимо вставлять те биты, которые будут порождать худшую метрику состояния ребра. Простая вставка константы никчему хорошему не приведет. декодер будет правильно работать, но только до первого ошибочного бита.


переход от относительной скорости кодирования 1/2 к 3/4 при использовании алгоритма Витерби дает энергетические потери Eb/No примерно 1,5 дБ при Pb = 1е-5...1е-6.
Muscat
Serg76, Ох, именно такой ответ я и хотел получить, спасибо!

Не совсем понятно, что именно я делаю неправильно.
Информацию я взял из мануала Texas Instruments по одному их DSP, где описывалось как реализовать на нем декодер Витерби. В частности там используется система, когда 100 - сильная единица, 111 - неуверенная единица, 000-неуверенный ноль, 001 - уверенный ноль. Вот там пропущенные биты рекомендовалось либо заменять на некое состояние Null, но в дальнейшем проект будет реализовываться на ПЛИС и вводить третье состояние не хотелось бы, если только обозначать его как ZZZ.
Либо поочередно вставлять вместо пропусков 111 и 000 - слабые нули и единицы, что я собственно и реализовал и что дало мне такой проигрышь.

Правильно ли я понял вашу рекомендацию, что нужно делать так
Используем мягкие решения, сигнал ранжируется 0.1.2...7. Если принят сигнал Х-6 (один выколотый и "скорее всего единица"), а сравнивается с переходом 0-7, то для второго бита просто считаем ошибку равную 1, а для первого бита сразу берем ее максимальной равной 7.
Но не очень понятен смысл такого алгоритма, так как по сути мы прибавляем 7 ко всем метрикам и на выбор ветви это никак не повляет. То есть действие аналогичное тому, что мы просто не учитываем этот бит при вычислении метрик переходов. Разве не так?

Цитата
Puncturing is a method to reduce the coding rate by deleting symbols from the encoded data. The
decoder detects which symbols were deleted and replaces them, a process called depuncturing.
While this has the effect of introducing errors, the magnitude of the errors is reduced by the use of
soft-decision data and null symbols, which are halfway between a positive and negative value.
These null symbols add very little bias to the accumulated metrics. In some coding schemes, no
null value exists, requiring the depuncturing to use alternatively the smallest positive and negative
values.(7) Using the coding scheme in Table 1, the punctured symbols are replaced by 000, then
111, etc. As expected, the performance of punctured codes is not equal to that of their
nonpunctured counterparts, but the increased coding rate is worth the decreased performance.


Texas Instruments (TI)
Application Report
SPRA071A - January 2002
Viterbi Decoding Techniques for the TMS320C54x
DSP Generation
Henry Hendrix Member, Group Technical Staff
Muscat
Разобрался с моделью, представленной в Симулинке. Покрутил, понравилось.

Построил вот такие вот графики. Clear - это BER при скорости 1/2, без перфорации, сверху 3 графика с перфорацией, но разных бит. И вот тут вопрос.

Красный график соответствует матрице перфорирования, которая уже реализована и работает. Мне было сказано, что такая матрица перфорирования была взята из стандартного кода. Однако в Матлабе, к примеру, в качестве стандартного было другое перфорирование - зеленый пунктир. Заинтересовавшись этим эффектом я попробовал еще развести биты выкалывания, получился еще более красивый график - голубой снизу.
Разница 0.7дБ. Не бог весть что, но тоже неплохо.

Какие еще факторы влияют на выбор матрицы перфорирования? Сложность реализации? Способность исправлять пакетные ошибки?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.