реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Многоуровневый декодер, декодер Витерби
Ivan55
сообщение Feb 13 2013, 05:30
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



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

Вот код:
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(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;


Вот графики:
Прикрепленное изображение


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

Сообщение отредактировал Ivan55 - Feb 13 2013, 15:23
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 13 2013, 06:01
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Ivan55 @ Feb 12 2013, 23:30) *
Почему выигрышь жестких решений получился такой маленький, где косяк?

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

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

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


--------------------
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Feb 13 2013, 07:41
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(des00 @ Feb 13 2013, 09:01) *
наверное все же мягких решений %)

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

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


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

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

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



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


Сообщение отредактировал Ivan55 - Feb 13 2013, 07:36
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 13 2013, 07:48
Сообщение #4


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Ivan55 @ Feb 13 2013, 01:41) *
красный график жесткие решения синий без кодирования и где же там выигрыш?


а, вы про это. Код не смотрел, но
1. Вы младший бит в КАМ16 кодировали?
2. Созвездие по грею ставили?
3. Кривые лучше всего до 10^-7 глянуть


--------------------
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Feb 13 2013, 07:54
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(des00 @ Feb 13 2013, 10:48) *
а, вы про это. Код не смотрел, но
1. Вы младший бит в КАМ16 кодировали?
2. Созвездие по грею ставили?
3. Кривые лучше всего до 10^-7 глянуть


1. Кодируется все
2. Созвездие если вы посмотрите не по Грею
3. До 10^-7 что вам даст? если наклон кривой уже итак виден, а 10^-5 вполне достаточно
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 13 2013, 08:01
Сообщение #6


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Ivan55 @ Feb 13 2013, 01:54) *
1. Кодируется все
2. Созвездие если вы посмотрите не по Грею
3. До 10^-7 что вам даст? если наклон кривой уже итак виден, а 10^-5 вполне достаточно


Блин с QPSK перепутал %( Но для КАМ16 схожие выкладки :
1. ИМХО для скорости 1/2 самое то в паре старший бит передавать как есть, а младший кодировать.
2. Если не по грею то символьная ошибка может привести больше чем к одиночной битовой ошибке. Ну это все при ошибке до соседа.
3. Обычно для систем связи нормируется SNR при 10е-6. А графики кодированного и некодированного во всех книгах имеют точки пересечения когда кодер только мешает чем помогает %)

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


--------------------
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Feb 13 2013, 08:13
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(des00 @ Feb 13 2013, 11:01) *
Блин с QPSK перепутал %( Но для КАМ16 схожие выкладки :
1. ИМХО для скорости 1/2 самое то в паре старший бит передавать как есть, а младший кодировать.
2. Если не по грею то символьная ошибка может привести больше чем к одиночной битовой ошибке. Ну это все при ошибке до соседа.
3. Обычно для систем связи нормируется SNR при 10е-6. А графики кодированного и некодированного во всех книгах имеют точки пересечения когда кодер только мешает чем помогает %)

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


1. Про какое кодирование вы говорите?
2. Это все проверенно, работает чуть хуже Грея
3. Как нормируют и для чего? А про графики это понятно, так как кодирование избыточное и та энергия которая приходилась на не кодированный бит размазывается на кодированный, тем самым и получается что при низком ОСШ кривая выше а при увелечение идет пересечение и выигрыш, но все таки выигрыш при кодировании 1/2 должен быть хоть пара дБ на жестких решениях
Go to the top of the page
 
+Quote Post
ilya79
сообщение Feb 13 2013, 08:50
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 26-08-04
Пользователь №: 549



У вас что-то не так и с мягкими решениями. При QAM-16 и R=1/2 спектральная эффективность 2 бит/Гц т.е. соответсвует некодированной QPSK. Некодированная QPSK дает Pб=10^-5 при 9.6 дБ, выша система требует более 10 дБ. Посмотрите тут http://www.mathworks.com/help/comm/example...dulation-1.html может поможет.
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Feb 13 2013, 10:09
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



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


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

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

Кто нить вообще занимался многоуровневым кодированием???
Go to the top of the page
 
+Quote Post
ilya79
сообщение Feb 13 2013, 10:45
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 26-08-04
Пользователь №: 549



Не очень понятно где вы нашли Юлию ("Спосибо Юлия" ), но если по сути то:
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)?
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Feb 13 2013, 14:30
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(ilya79 @ Feb 13 2013, 13:45) *
Не очень понятно где вы нашли Юлию ("Спосибо Юлия" )...


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

Цитата(ilya79 @ Feb 13 2013, 13:45) *
1. спектральная эффективность -в моем понимании такая же как у всех (можно почитать у Прокиса или Скляра). Потенциально достижимая для QAM-16 4 бит/Гц (на реальных фильтрах конечно поменьше).


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

Цитата(ilya79 @ Feb 13 2013, 13:45) *
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 каким это образом кодавая скорость стала связана с модуляцией???

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


Можно подробней? я думал что отображение всегда идет в соответсвии с таблицей модуляции где определенной группе бит соответствует точка на комплексной плоскости
Go to the top of the page
 
+Quote Post
ilya79
сообщение Feb 13 2013, 15:03
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 26-08-04
Пользователь №: 549



Посмотрел ваш код, похоже у вас кодируються все точки созвездия без учета разной степени защищенности бит в точках созвездия. Возможно если вы сделаете как написал 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)
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Feb 13 2013, 15:11
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(ilya79 @ Feb 13 2013, 18:03) *
"1+1+1/2+2/3=3.16 бит/символ откуда взято 1+1???" - Пока не посмотрел ваш код думал что у вас есть некодированые потоки бит (2 потока кодируються , 2 потока передаються без кодирования).


По моему все потоки кодируются, там нет не кодированных
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Feb 13 2013, 16:38
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 17-01-12
Пользователь №: 69 640



Кажется понял что надо сделать, но че то не могу понять как эт написать, вобщем поток с первого кодера у1 поток со второго у2
надо потоки объединить так чтобы х = (у1(1), у1(2), у2(1), у2(2), у1(3), у1(4), у2(3), у2(4), и т.д.)

Сообщение отредактировал Ivan55 - Feb 13 2013, 16:53
Go to the top of the page
 
+Quote Post
ilya79
сообщение Feb 13 2013, 17:23
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 26-08-04
Пользователь №: 549



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

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 15:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01466 секунд с 7
ELECTRONIX ©2004-2016