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

Многоуровневый декодер

Написал программу многоуровневого кодера декодера, построил графики для жестких мягких решений и вот что получил

 

Вот код:

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(In_Data_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;        

 

Вот графики:

post-69640-1360733388_thumb.jpg

 

Почему выигрышь жестких решений получился такой маленький, где косяк?

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

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


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

Почему выигрышь жестких решений получился такой маленький, где косяк?

наверное все же мягких решений %)

 

И с чего вы решили что маленький ? выигрыш 2дБ, все как теория гуторит %)

 

ЗЫ. спасибо за рефернсный код, мне скоро в железе подобное делать %)

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


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

наверное все же мягких решений %)

 

И с чего вы решили что маленький ? выигрыш 2дБ, все как теория гуторит %)

 

ЗЫ. спасибо за рефернсный код, мне скоро в железе подобное делать %)

 

красный график жесткие решения синий без кодирования и где же там выигрыш?

 

То что выигрыш мягких на 2 дБ по сравнению с жесткими это так и получилось) против ниче не имею

 

А за код не за что;) это лишь малая часть) обращайтесь если что)

 

 

 

У кого какие мысли, давайте обсуждать!

 

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

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


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

красный график жесткие решения синий без кодирования и где же там выигрыш?

 

а, вы про это. Код не смотрел, но

1. Вы младший бит в КАМ16 кодировали?

2. Созвездие по грею ставили?

3. Кривые лучше всего до 10^-7 глянуть

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


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

а, вы про это. Код не смотрел, но

1. Вы младший бит в КАМ16 кодировали?

2. Созвездие по грею ставили?

3. Кривые лучше всего до 10^-7 глянуть

 

1. Кодируется все

2. Созвездие если вы посмотрите не по Грею

3. До 10^-7 что вам даст? если наклон кривой уже итак виден, а 10^-5 вполне достаточно

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


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

1. Кодируется все

2. Созвездие если вы посмотрите не по Грею

3. До 10^-7 что вам даст? если наклон кривой уже итак виден, а 10^-5 вполне достаточно

 

Блин с QPSK перепутал %( Но для КАМ16 схожие выкладки :

1. ИМХО для скорости 1/2 самое то в паре старший бит передавать как есть, а младший кодировать.

2. Если не по грею то символьная ошибка может привести больше чем к одиночной битовой ошибке. Ну это все при ошибке до соседа.

3. Обычно для систем связи нормируется SNR при 10е-6. А графики кодированного и некодированного во всех книгах имеют точки пересечения когда кодер только мешает чем помогает %)

 

Надо будет ваши сорцы внимательнее посмотреть

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


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

Блин с QPSK перепутал %( Но для КАМ16 схожие выкладки :

1. ИМХО для скорости 1/2 самое то в паре старший бит передавать как есть, а младший кодировать.

2. Если не по грею то символьная ошибка может привести больше чем к одиночной битовой ошибке. Ну это все при ошибке до соседа.

3. Обычно для систем связи нормируется SNR при 10е-6. А графики кодированного и некодированного во всех книгах имеют точки пересечения когда кодер только мешает чем помогает %)

 

Надо будет ваши сорцы внимательнее посмотреть

 

1. Про какое кодирование вы говорите?

2. Это все проверенно, работает чуть хуже Грея

3. Как нормируют и для чего? А про графики это понятно, так как кодирование избыточное и та энергия которая приходилась на не кодированный бит размазывается на кодированный, тем самым и получается что при низком ОСШ кривая выше а при увелечение идет пересечение и выигрыш, но все таки выигрыш при кодировании 1/2 должен быть хоть пара дБ на жестких решениях

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


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

У вас что-то не так и с мягкими решениями. При QAM-16 и R=1/2 спектральная эффективность 2 бит/Гц т.е. соответсвует некодированной QPSK. Некодированная QPSK дает Pб=10^-5 при 9.6 дБ, выша система требует более 10 дБ. Посмотрите тут http://www.mathworks.com/help/comm/example...dulation-1.html может поможет.

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


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

У вас что-то не так и с мягкими решениями. При QAM-16 и R=1/2 спектральная эффективность 2 бит/Гц т.е. соответсвует некодированной QPSK. Некодированная QPSK дает Pб=10^-5 при 9.6 дБ, выша система требует более 10 дБ. Посмотрите тут http://www.mathworks.com/help/comm/example...dulation-1.html может поможет.

 

Спосибо Юлия) я тоже вижу что чтото не так, но там и жесткие не так)) Что в вашем понимании спектральная эффективность? вы бы хоть полосу сигнала тогда указали

 

А сылку на модель я уже видел, для одного уровня кодирования оно так и у меня получается;) но я делаю многоуровневое кодирование, где каждый уровень кодируется своей скоростью, в данном случае у меня первый уровень rate1 = 1/2 второй уровень rate2 = 2/3, потом эти потоки обыединяются то есть Rate_all = (rate1+rate2)/2 = 1/2

 

Кто нить вообще занимался многоуровневым кодированием???

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


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

Не очень понятно где вы нашли Юлию ("Спосибо Юлия" ), но если по сути то:

1. спектральная эффективность -в моем понимании такая же как у всех (можно почитать у Прокиса или Скляра). Потенциально достижимая для QAM-16 4 бит/Гц (на реальных фильтрах конечно поменьше).

2. Rate_all = (rate1+rate2)/2 -может проблема в этой формуле? (0.5+0,667)/2=0,583 Если вы работаете с Multilevel Codes то суммарная скорость у вас 1+1+1/2+2/3=3.16 бит/символ (Гц). Или Rate_all=3,16/4,0=0,79. Или у вас нет потоков без кодирования?

3. Отображение кодированных потоков в сигнальные точки соответсвует оптимальным скоростям для данных точек (J. Huber and U. Wachsmann Capacities of equivalent channels in multilevel coding schemes)?

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


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

Не очень понятно где вы нашли Юлию ("Спосибо Юлия" )...

 

Извиняюсь я английский букф плохо понимать))

 

1. спектральная эффективность -в моем понимании такая же как у всех (можно почитать у Прокиса или Скляра). Потенциально достижимая для QAM-16 4 бит/Гц (на реальных фильтрах конечно поменьше).

 

Спектральная эффективность — отношение скорости передачи данных к используемой полосе пропускания радиоканала. Всегда думал что это и есть определение спектральной эффективности

 

2. Rate_all = (rate1+rate2)/2 -может проблема в этой формуле? (0.5+0,667)/2=0,583 Если вы работаете с Multilevel Codes то суммарная скорость у вас 1+1+1/2+2/3=3.16 бит/символ (Гц). Или Rate_all=3,16/4,0=0,79. Или у вас нет потоков без кодирования?

 

1+1+1/2+2/3=3.16 бит/символ откуда взято 1+1??? Rate_all=3,16/4,0=0,79 каким это образом кодавая скорость стала связана с модуляцией???

 

3. Отображение кодированных потоков в сигнальные точки соответсвует оптимальным скоростям для данных точек (J. Huber and U. Wachsmann Capacities of equivalent channels in multilevel coding schemes)?

 

Можно подробней? я думал что отображение всегда идет в соответсвии с таблицей модуляции где определенной группе бит соответствует точка на комплексной плоскости

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


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

Посмотрел ваш код, похоже у вас кодируються все точки созвездия без учета разной степени защищенности бит в точках созвездия. Возможно если вы сделаете как написал des00 (1. ИМХО для скорости 1/2 самое то в паре старший бит передавать как есть, а младший кодировать. )

или как делают тут (tait.e-technik.uni-ulm.de/~baum/research/ofdm_workshop00.ps) ваша конструкция заведеться.

 

 

"1+1+1/2+2/3=3.16 бит/символ откуда взято 1+1???" - Пока не посмотрел ваш код думал что у вас есть некодированые потоки бит (2 потока кодируються , 2 потока передаються без кодирования).

"Rate_all=3,16/4,0=0,79 каким это образом кодавая скорость стала связана с модуляцией???" -в данном случае это скорость бит/символ модуляции 3,16-инф. бит 4.0-общее число бит в символе модуляции.

"Спектральная эффективность — отношение скорости передачи данных к используемой полосе пропускания радиоканала. Всегда думал что это и есть определение спектральной эффективности" - так оно и есть, потенциально возможно передавать 4 бит в полосе 1 Гц в сек при использовании QAM-16. (http://en.wikipedia.org/wiki/Spectral_efficiency Example 3)

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


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

"1+1+1/2+2/3=3.16 бит/символ откуда взято 1+1???" - Пока не посмотрел ваш код думал что у вас есть некодированые потоки бит (2 потока кодируються , 2 потока передаються без кодирования).

 

По моему все потоки кодируются, там нет не кодированных

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


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

Кажется понял что надо сделать, но че то не могу понять как эт написать, вобщем поток с первого кодера у1 поток со второго у2

надо потоки объединить так чтобы х = (у1(1), у1(2), у2(1), у2(2), у1(3), у1(4), у2(3), у2(4), и т.д.)

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

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


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

Правильно ли я понял что вы не используете multistage decoder (декодирование составных кодов с мягкими решениями с последующей передачей их другим декодерам) см рис 5 в (tait.e-technik.uni-ulm.de/~baum/research/ofdm_workshop00.ps)?

Если да то большого выигрыша от такой схемы наверное не будет.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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