Перейти к содержанию
    

Алгоритм Витерби с мягким выходом (MATLAB)

Здравствуйте, пытаюсь использовать следующий декодер http://www.mathworks.com/matlabcentral/fil...terbi-algorithm.

 

Декларация функции - output = sovadec( msg, llr, trl, win ),

где (цитирую автора) - "where MSG is the soft input (codeword), LLR is a priori information per bit about the bits (log likelihood ratios)". trl - описание решетки, win - длина окна.

 

Неясно, как правильно использовать эту функцию - чем отличаются мягкие решения от ллр в рамках этой функции - то есть, что подавать в качестве первых двух аргументов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, пытаюсь использовать следующий декодер http://www.mathworks.com/matlabcentral/fil...terbi-algorithm.

 

Декларация функции - output = sovadec( msg, llr, trl, win ),

где (цитирую автора) - "where MSG is the soft input (codeword), LLR is a priori information per bit about the bits (log likelihood ratios)". trl - описание решетки, win - длина окна.

 

Неясно, как правильно использовать эту функцию - чем отличаются мягкие решения от ллр в рамках этой функции - то есть, что подавать в качестве первых двух аргументов?

 

Два аргумента видимо для использования в итеративных декодерах составных кодов.

 

msg - мягкие решения с выхода демодулятора

llr - информация, полученная от другого декодера об информационных битах. Для первой итерации 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Два аргумента видимо для использования в итеративных декодерах составных кодов.

 

msg - мягкие решения с выхода демодулятора

llr - информация, полученная от другого декодера об информационных битах. Для первой итерации 0.

 

Похоже на то, но вот матлабовская модель - исходное сообщение не сходится с полученным с декодера даже при высоком ОСШ

 

clear all; clc;

SNRdB = 5; % ОСШ

seq = randint(1, 10) % случайная последовательность

enctrel = poly2trellis(3, [7 5]); %формирование решетки

conv_seq = convenc(seq, enctrel); %сверточное кодирование

 

modObj = modem.pskmod('M', 2, 'InputType', 'Bit'); %конструктор модема

modulatedsig = modulate(modObj, conv_seq); % модуляция

receivedsig = awgn(modulatedsig, SNRdB, 0); % моделирование канала с АБГШ

sigma = sqrt(10^(-SNRdB/10)); % ско

demodObj = modem.pskdemod(modObj,'DecisionType','llr','NoiseVariance',sigma^2); % конструктор демодулятора

 

msg = demodulate(demodObj, receivedsig); % получение ллр с дема

llr = zeros(1, length(seq)); % имитация второго декодера

 

dec_out = sovadec(msg, llr, enctrel, 10); % декодирование SOVA

Изменено пользователем maratz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже на то, но вот матлабовская модель - исходное сообщение не сходится с полученным с декодера даже при высоком ОСШ

 

Так работает

 

clear all; clc;
SNRdB = 5; % ОСШ
seq = randint(1, 20) % случайная последовательность
enctrel = poly2trellis(3, [7 5]); %формирование решетки
conv_seq = convenc(seq, enctrel); %сверточное кодирование

modObj = modem.pskmod('M', 2, 'InputType', 'Bit'); %конструктор модема
modulatedsig = -modulate(modObj, conv_seq); % модуляция
receivedsig = awgn(real(modulatedsig), SNRdB, 0); % моделирование канала с АБГШ
sigma = sqrt(10^(-SNRdB/10)); % ско
demodObj = modem.pskdemod(modObj,'DecisionType','llr','NoiseVariance',sigma^2); % конструктор демодулятора

msg = demodulate(demodObj, receivedsig); % получение ллр с дема
llr = zeros(1, length(seq)); % имитация второго декодера

dec_out = sovadec(msg, llr, enctrel, 10); % декодирование SOVA

dec_out>0

 

С маппингом при модуляции и/или со знаками мягких решений демодулятора что-то не то было. И да, в awgn для bpsk лучше реальный сигнал пихать, а не комплексный.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И да, в awgn для bpsk лучше реальный сигнал пихать, а не комплексный.

Но не забыть при этом учесть 3 дБ (добавив их к SNR).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Автор пишет:

"The output of the function is the vector containing the soft estimates of the originally encoded information.

...

The output of the decoding algorithm is of the following form: out = sign(inp) * log( P(inp=1|out) ) / log( P(inp=-1|out) )".

 

Что за интересная форма выходных данных? На упомянутые мягкие решения это не очень похоже.

 

---

И вот еще один момент - данная реализация алгоритма не позволяет работать со структурами, где число входных бит больше 3.

 

50. enc.ksym = trl.numInputSymbols; % number of possible input combinations

...

62. enc.inp = de2bi( oct2dec( [0:enc.ksym-1] ), enc.k, 'left-msb' ); % all possible binary inputs

 

При попытке подсунуть ему структуру poly2trellis([3 3 3 3 ], [7 5; 3 5; 7 3; 7 7]) работать отказывается

 

Error in ==> sovadec>trellis2enc at 62

enc.inp = de2bi( oct2dec( [0:enc.ksym-1] ), enc.k, 'left-msb' ); % all possible binary inputs

 

 

Изменено пользователем maratz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Автор пишет:

"The output of the function is the vector containing the soft estimates of the originally encoded information.

...

The output of the decoding algorithm is of the following form: out = sign(inp) * log( P(inp=1|out) ) / log( P(inp=-1|out) )".

 

Что за интересная форма выходных данных? На упомянутые мягкие решения это не очень похоже.

 

Скорее всего попутали разность и отношение логарифмов.

 

---

И вот еще один момент - данная реализация алгоритма не позволяет работать со структурами, где число входных бит больше 3.

 

50. enc.ksym = trl.numInputSymbols; % number of possible input combinations

...

62. enc.inp = de2bi( oct2dec( [0:enc.ksym-1] ), enc.k, 'left-msb' ); % all possible binary inputs

 

При попытке подсунуть ему структуру poly2trellis([3 3 3 3 ], [7 5; 3 5; 7 3; 7 7]) работать отказывается

 

Error in ==> sovadec>trellis2enc at 62

enc.inp = de2bi( oct2dec( [0:enc.ksym-1] ), enc.k, 'left-msb' ); % all possible binary inputs

 

 

Глубоко не копал, но oct2dec на мой взгляд не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очевидно, что enc.inp - это двоичный счётчик от 0 до enc.inp. Удивляет, что за 13 лет и 16 версий этот баг не устранили :\

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очевидно, что enc.inp - это двоичный счётчик от 0 до enc.inp. Удивляет, что за 13 лет и 16 версий этот баг не устранили :\

 

 

Ну вообще эта функция, trellis2enc, зачем-то два раза вызывается - один раз в sovadec, а затем в функциях для каждого типа решетки. Такой уж код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...