Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вычисление LLR в MATLAB
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Ivan55
Всем привет!

Написал в MATLAB декодер Витерби, т.е. имеется сверточный кодер КАМ модулятор, канал AWGN, КАМ демодулятор и декодер Витерби

Захотел сделать декодер с мягкими решениями и тут возникли вопросы
1. Как правильно посчитать дисперсию канала с КАМ демодулятора(т.к. она необходима для вычисления LLR)?
2. В зависимости от дисперсии канала LLR изменяется в каком то диапазоне(т.к. в вычислении LLR дисперсия стоит в знаменателе), как ее правильно нормировать чтоб диапазон который надо отквантовать не плавал, чтобы потом отквантовать?
mesat88
В матлабе есть модель "LLR vs. Hard Decision Demodulation" - где именно такая система как у Вас и можете посмотреть как реализовано задание уровня шума, для блока "КАМ демодулятор" при вычислении мягких решений.
Serg76
посмотрите в этой ветке, там есть дока от AHA http://electronix.ru/forum/index.php?showt...t&p=1044559
Ivan55
Цитата(mesat88 @ Feb 6 2013, 13:31) *
В матлабе есть модель "LLR vs. Hard Decision Demodulation" - где именно такая система как у Вас и можете посмотреть как реализовано задание уровня шума, для блока "КАМ демодулятор" при вычислении мягких решений.


Спасибо за помощь) Но там подают на декодер не квантованые метрики и декодер их сам обрабатывает. А мне необходимо их отквантовать и подсунуть в декодер с параметро 'soft'


Цитата(Serg76 @ Feb 6 2013, 13:41) *
посмотрите в этой ветке, там есть дока от AHA http://electronix.ru/forum/index.php?showt...t&p=1044559


Спасибо) Читал уже, но там та же беда вычисленные LLR будут прыгать в зависимости от дисперсии, в каком деапазоне их квантовать? от -10 до 10? или от -100 до 100?
Serg76
п. 4.2.4 про нормализацию LLR

Нажмите для просмотра прикрепленного файла
petrov
Цитата(Ivan55 @ Feb 6 2013, 13:49) *
Всем привет!

Написал в MATLAB декодер Витерби, т.е. имеется сверточный кодер КАМ модулятор, канал AWGN, КАМ демодулятор и декодер Витерби

Захотел сделать декодер с мягкими решениями и тут возникли вопросы
1. Как правильно посчитать дисперсию канала с КАМ демодулятора(т.к. она необходима для вычисления LLR)?
2. В зависимости от дисперсии канала LLR изменяется в каком то диапазоне(т.к. в вычислении LLR дисперсия стоит в знаменателе), как ее правильно нормировать чтоб диапазон который надо отквантовать не плавал, чтобы потом отквантовать?


Если сигнал/(шум+помеха) для всех символов в пределах блока кода(глубины декодирования) примерно одинаковый, то нет смысла учитывать это в LLR, просто АРУ и фиксированный квантователь.
Ivan55
Цитата(petrov @ Feb 6 2013, 14:13) *
Если сигнал/(шум+помеха) для всех символов в пределах блока кода(глубины декодирования) примерно одинаковый...


А если ОСШ изменяется? Если ОСШ не менялось(приблизительно не менялось), то и АРУ не надо, просто берем фиксированный диапазон и квантуем
petrov
Цитата(Ivan55 @ Feb 6 2013, 15:30) *
Если ОСШ не менялось(приблизительно не менялось), то и АРУ не надо, просто берем фиксированный диапазон и квантуем


Интересно поглядеть на приёмник без АРУ, как решения то вообще принимать?
Serg76
Можно и через АРУ, только его надо поставить после блока расщепителя, т.е. уже после рассчитанных LLR.
petrov
Цитата(Serg76 @ Feb 6 2013, 15:55) *
Можно и через АРУ, только его надо поставить после блока расщепителя, т.е. уже после рассчитанных LLR.


Вот как считать LLR для QAM без АРУ?
Serg76
Цитата(petrov @ Feb 6 2013, 15:01) *
Вот как считать LLR для QAM без АРУ?

Мы, наверное, о разных АРУ говорим. Есть АРУ демодулятора, которое приводит значения символов к эталонным значениям для принятия решения, его никто не отменяет, оно остается по-любому. В демеппере (расщепитель LLR) из-за изменения С/Ш выходные значения LLR могут принимать значения в очень широком диапазоне, поэтому здесь тоже можно поставить блок АРУ для выравнивания амплитуды LLR перед квантованием.
Ivan55
Цитата(petrov @ Feb 6 2013, 15:01) *
Вот как считать LLR для QAM без АРУ?


А есть у кого нить пример АРУ на MATLAB?
petrov
Цитата(Ivan55 @ Feb 6 2013, 20:29) *
А есть у кого нить пример АРУ на MATLAB?


http://electronix.ru/forum/index.php?showtopic=23652
Ivan55
Цитата(Serg76 @ Feb 6 2013, 14:00) *


Спасибо) почитал, но только не совсем понял cd это коэффициент нормализации, который оказывается равен коэффициенту нормализации созвездия. Может я че то не правильно понимаю, но что делать с LLR и cd?
Serg76
Цитата(Ivan55 @ Feb 7 2013, 05:59) *
Спасибо) почитал, но только не совсем понял cd это коэффициент нормализации, который оказывается равен коэффициенту нормализации созвездия. Может я че то не правильно понимаю, но что делать с LLR и cd?

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

Вот код:
CODE

clear all; close all; clc

%% Input parametrs
robustens_mode = 2; % Режим помехоустойчивости 1; 2; 3; 4;
spectrum_mode = 5; % Размещение спектра 4.5кГц - 0; 5кГц - 1; 9кГц - 2; 10кГц - 3; 18кГц - 4; 20кГц - 5;

level_protection = 0; % Уровень защиты для QAM16 - 0; QAM4 - 1;

QAM_Pmax = 2; % 4-QAM Pmax = 1; 16-QAM Pmax = 2;

%% Initialization parametrs

% Колличество ячеек
N_mux_list = [167, 190, 359, 405, 754, 846; ...
130, 150, 282, 322, 588, 662; ...
NaN, NaN, NaN, 288, NaN, 607; ...
NaN, NaN, NaN, 152, NaN, 332];

% Кодовые скорости канала
Rate = cell(2,2,1);
Rate{1,1} = [1 3];
Rate{1,2} = [2 3];
Rate{2,1} = [1 2];
Rate{2,2} = [NaN];

% Схема выкалывания канала
puncpat = cell(2,2,1);
puncpat{1,1} = [1 1 1 0 0 0];
puncpat{1,2} = [1 1 0 0 0 0 1 0 0 0 0 0];
puncpat{2,1} = [1 1 0 0 0 0];
puncpat{2,2} = [NaN];

% Перфорирование остаточных 36 бит
puncpat_Rp = cell(12,1);
puncpat_Rp{1,1} = [1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0];
puncpat_Rp{2,1} = [1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0];
puncpat_Rp{3,1} = [1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0];
puncpat_Rp{4,1} = [1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0];
puncpat_Rp{5,1} = [1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0];
puncpat_Rp{6,1} = [1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0];
puncpat_Rp{7,1} = [1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0];
puncpat_Rp{8,1} = [1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0];
puncpat_Rp{9,1} = [1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0];
puncpat_Rp{10,1} = [1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0];
puncpat_Rp{11,1} = [1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0];
puncpat_Rp{12,1} = [1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0];

Rp = zeros(1,QAM_Pmax);
for k = 1:QAM_Pmax
Rp(k) = (2*N_mux_list(robustens_mode,spectrum_mode+1)-12) - Rate{level_protection+1,k}(2)...
*floor((2*N_mux_list(robustens_mode,spectrum_mode+1) - 12)./Rate{level_protection+1,k}(2)) + 1;
end

% Кодовая скорость материнского кода
mother_code = 1/6;

% Задание таблицы переходов
trellis = poly2trellis(7,[133, 171, 145, 133,171,145]);

Mbase = [2 4];
M=2.^Mbase(QAM_Pmax);

a = [1/sqrt(2), 1/sqrt(10)]; % Коэффициент нормализации QAM

% Модуляция QAM16 и QAM4
if QAM_Pmax == 1
SMQAM = [1+1*i, -1+1*i, -1-1*i, 1-1*i].*a(QAM_Pmax);

elseif QAM_Pmax == 2
SMQAM = [3+3*i, 3-1*i, 3+1*i, 3-3*i,...
-1+3*i, -1-1*i, -1+1*i, -1-3*i,...
1+3*i, 1-1*i, 1+1*i, 1-3*i,...
-3+3*i, -3-1*i, -3+1*i, -3-3*i].*a(QAM_Pmax);
end

% Расчет колличества бит
L_2 = 0;
for k = 1:QAM_Pmax
Mp_2(k) = Rate{level_protection+1,k}(1)*floor((2*N_mux_list(robustens_mode,spectrum_mode+1
)...
- 12)./Rate{level_protection+1,k}(2)); % Формула 77
end
L_2 = sum(Mp_2);

% Задаем схему выкалывания
punc = cell(QAM_Pmax,1);
for n = 1:QAM_Pmax
Num_puncpat = ((Mp_2(n)+ 6)/mother_code)./length(puncpat{level_protection+1,n});
m = [];
for k = 1:ceil(Num_puncpat)
m = [m ,puncpat{level_protection+1,n}];
end
punc{n,:} = [m(1:Num_puncpat*length(puncpat{level_protection+1,n}) - 36), puncpat_Rp{Rp(n),1}];
end

% QAM модулятор
H_QAM = modem.genqammod('Constellation', SMQAM, 'InputType', 'bit');

% Пременные
x_in = 2*N_mux_list(robustens_mode,spectrum_mode+1);
pBuff_out = zeros(x_in, 1);
decoded_out = [];
Input_Data_coder = [];
N_simbol = 1000;

%% Программа кодера декодера
tblen = 35;
quant = 3;
AmplQuant = 0.4;
delta = 2*AmplQuant/(2^quant-2);
for EbNo = 1:20
for l = 1:N_simbol
%% Формирование последовательности бит
Input_Data=randi([0 1],L_2,1);
Input_Data_coder = [Input_Data_coder; Input_Data];

%% Сверточный кодер
init_state = 0;
if QAM_Pmax == 2
[In_Data_1] = convenc([Input_Data(Mp_2(1)+1:Mp_2(1)+Mp_2(2)); [0 0 0 0 0 0]'],trellis,punc{2, 1}, init_state);
[In_Data_0] = convenc([Input_Data(1:Mp_2(1)); [0 0 0 0 0 0]'],trellis,punc{1, 1}, init_state);
else
[In_Data_0] = convenc([Input_Data(1:Mp_2(1)); [0 0 0 0 0 0]'],trellis,punc{1, 1}, init_state);
end

%% Мультиплексор
if QAM_Pmax == 2
pBuff_out = [In_Data_0; In_Data_1];
else
pBuff_out = In_Data_0;
end

% Отображение на созвездие QAM
Mod_qam=modulate(H_QAM,pBuff_out);

%% Канал передачи AWGN
k=log2(M);
Qam_rx=awgn(Mod_qam,EbNo+10*log10(k*1/2),'measured','dB');

%% Расчет ОСШ канала
EsNo = EbNo*k/2;
SNR = sum(real(Qam_rx).^2 + imag(Qam_rx).^2)/(EsNo*M);

%% Обратное отображение на созвездие QAM
HD_QAM = modem.genqamdemod('Constellation', SMQAM, 'OutputType', 'bit','DecisionType', 'approximate llr','NoiseVariance', SNR);
Demod_QAM=demodulate(HD_QAM,Qam_rx);

%% Демультиплексор
if QAM_Pmax == 2
In_Data_0 = Demod_QAM(1:x_in);
In_Data_1 = Demod_QAM(x_in+1:2*x_in);
else
In_Data_0 = Demod_QAM(1:x_in);
end

%% Декодирование
if QAM_Pmax == 2
[x,qcode_1] = quantiz(In_Data_1(:, 1),(-AmplQuant:delta:AmplQuant), (2^quant-1:-1:0));
[x,qcode_0] = quantiz(In_Data_0(:, 1),(-AmplQuant:delta:AmplQuant), (2^quant-1:-1:0));
[decoded_1] = vitdec(qcode_1,trellis,tblen,'trunc','soft', quant, punc{2, 1});
[decoded_0] = vitdec(qcode_0,trellis,tblen,'trunc','soft', quant, punc{1, 1});
else
[x,qcode_0] = quantiz(pBuff_out_0(:, 1),(-AmplQuant:delta:AmplQuant), (2^quant-1:-1:0));
[decoded_0] = vitdec(qcode_0,trellis,tblen,'trunc','soft', quant, punc{1, 1});
end

%% Мультиплексор
if QAM_Pmax == 2
decoded = [decoded_0(1:Mp_2(1)), decoded_1(1:Mp_2(2))];
else
decoded = decoded_0(1:Mp_2(1));
end

decoded_out = [decoded_out, decoded];
end
%% Подсчет количества ошибок
[num,BER]=biterr(Input_Data_coder(1:end),decoded_out(1:end)');
BERcod(EbNo) = BER;
fprintf('ОСШ: %f BER: %f \n', EbNo, BER);
Input_Data_coder = [];
decoded_out = [];
end

semilogy(BERcod);
grid on;


Вот графики:
Нажмите для просмотра прикрепленного файла

Почему выигрышь жестких решений получился такой маленький, где косяк?
Ivan55
Разбирайтесь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.