СИСТЕМА СБОРА ДАННЫХ

С ПОДВИЖНЫХ СТАНЦИЙ

(часть 4 - экспериментальная)

 

С.А. Милованов, РГРТУ, гр.8110



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

Роль канала RACH в сценарии взаимодействия объектов нашей системы была описана во второй [2] и третьей [1] статьях. Структура полей сообщения канала RACH так же была подробно рассмотрена в третьей [1] статье.

Разработанная программа реализует формирование от терминала сообщения к точке доступа, передачу данного сообщения по каналу с АБГШ, прием сообщения точкой доступа, анализ принятой информации на предмет достоверности.

При разработке программы за основу была взята «Вторая версия примера PSK-модема» [3].

 

Текст программы формально разделен на две части – «передающая» и «приёмная». На рисунке 1 представлена блок-схема передающей части. Слева изображен порядок происходящих процессов, справа – вариации обрабатываемых программой структурных единиц (пакетов и полей) как результат соответствующих процессов.

 


 

Рисунок 1. Блок-схема передающей части

 

Ниже приведен фрагмент программы, реализующий передающую часть.


SNR = 10;                             % значение ОСШ, дБ

len_L2 = 71;                          % длина пакета уровня L2

t=2;                                  % номер типа пакета

i=4;                                  % номер терминала

 

%/////////////////////////////////////////////////

%////// СБОРКА ПАКЕТА КАНАЛЬНОГО УРОВНЯ L2 ///////

%/////////////////////////////////////////////////

 

type = de2biMy(t,'left_msb',3);     % Определение типа пакета №2 (RACH) - поле "TYPE"

id_t = de2biMy(i,'left_msb',5);     % Определение ID терминала №4 - поле "ID_T"

len = de2biMy(12,'left_msb',8);     % Определение длины инф. части - поле "LEN"

 

disp(['Тип передаваемого пакета - №',int2str(t)]);

disp(['Передаваемый номер терминала - №',int2str(i)]);

disp('------------------------------------');

 

%============= Вычисление CRC ==================================

 

forcrc = [type len id_t];         % Создание поля, для кот.вычисл. CRC

poly = [1 1 0 0 1];               % Создание полинома

[x y] = size(poly);               % Размерность полинома

m = [forcrc zeros(1,y-1)];        % Добавление нулей в поле CRC

 

[q r] = deconv(m,poly);           % Поиск частного и остатка от деления

r = mod(abs(r),2);                  информационной части на порождающий полином CRC кода

                                  

CRC = r(length(forcrc) + 1:end);  % расчет поля CRC

 

%==============================================================

 

inf_L2 = [forcrc CRC];                  % создание информационной части L2

fill = zeros(1,len_L2-length(inf_L2));  % создание массива битов заполнения

data_L2 = [inf_L2 fill];                % сборка пакета L2

 

%/////////////////////////////////////////////////

%//// КОДИРОВАНИЕ ПАКЕТА КАНАЛЬНОГО УРОВНЯ L2 ////

%/////////////////////////////////////////////////

 

enc = fec.bchenc(127,71);               % создание объекта BCH encoder

code_data = encode(enc,data_L2');       % кодирование

code_data_null = [code_data' 0]';       % добавляем к пакету один бит для приведения к

степени двойки

                                

%/////////////////////////////////////////////////

%//// ПЕРЕМЕЖЕНИЕ ПАКЕТА КАНАЛЬНОГО УРОВНЯ L2 ////

%/////////////////////////////////////////////////

 

intr_code_data_null = matintrlv(code_data_null, 4, 32);

 

%/////////////////////////////////////////////////

%//// СБОРКА ПАКЕТА ФИЗИЧЕСКОГО УРОВНЯ L1 ////////

%/////////////////////////////////////////////////

 

fl = [1 1 1 0 0 0 1 1];                     % формирование флагов

eq = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];     % настроечная послед. эквалайзера

tch = [fl eq intr_code_data_null' fl]';     % сборка пакета L1

                

%/////////////////////////////////////////////////

%//////////////// МОДУЛЯЦИЯ //////////////////////

%/////////////////////////////////////////////////

 

h = modem.pskmod(4);                        % QPSK модем

 

% ---- Параметры модуляции ---

h.inputtype = 'bit';

h.SymbolOrder = 'gray';

h.PhaseOffset = pi/4;

% ----------------------------

 

modul_signal = modulate(h, tch);                               % собственно модуляция

figure(1);

plot(modul_signal,'.'),title('СКС модулированного сигнала');   % построение СКС

 

%/////////////////////////////////////////////////

%/////////////// НАЛОЖЕНИЕ AWGN //////////////////

%/////////////////////////////////////////////////

 

modul_signal = awgn(modul_signal,SNR);

figure(2);

plot(modul_signal,'.'),title('СКС зашумленного сигнала'); ;    % построение СКС


Для оценки влияния шума на передаваемый сигнал, были построены сигнально-кодовые созвездия (СКС). На рисунке 2 – СКС модулированного QPSK сигнала на выходе модулятора. На рисунке 3 – СКС того же сигнала под влиянием АБГШ при отношении сигнал/шум 10 дБ.



Рисунок 2. СКС модулированного QPSK сигнала на выходе модулятора



Рисунок 3. СКС сигнала под влиянием АБГШ (ОСШ=10 дБ)

 

Из рисунков 2 и 3 видно, что наложение АБГШ на сигнал уменьшает вероятность его безошибочного приема.

 

На рисунке 4 представлена блок-схема приёмной части. Как и в случае с блок-схемой передающей части, слева изображен порядок происходящих процессов, справа – вариации обрабатываемых программой структурных единиц (пакетов и полей) как результат соответствующих процессов.

 


 

Рисунок 4. Блок-схема приемной части

 

Ниже приведен фрагмент программы, реализующий приемную часть.

 

%/////////////////////////////////////////////////

%//////////////// ДЕМОДУЛЯЦИЯ ////////////////////

%/////////////////////////////////////////////////

 

h = modem.pskdemod(4);                              % QPSK демод

 

% ---- Параметры демодуляции ---

h.OutputType = 'bit';

h.SymbolOrder = 'gray';

h.PhaseOffset = pi/4;

% ----------------------------

 

demod_signal = demodulate(h,modul_signal);          % собственно демодуляция

 

%/////////////////////////////////////////////////

%//// РАЗБОРКА ПАКЕТА ФИЗИЧЕСКОГО УРОВНЯ L1 //////

%/////////////////////////////////////////////////

 

res_intr_code_data_null = demod_signal(25:152,1);   % выделение пакета L2

 

%/////////////////////////////////////////////////

%/// ДЕПЕРЕМЕЖЕНИЕ ПАКЕТА КАНАЛЬНОГО УРОВНЯ L2 ///

%/////////////////////////////////////////////////

 

deintr_code_data_null = matdeintrlv(res_intr_code_data_null,4,32);

deintr_code_data = deintr_code_data_null(1:127,1);  % удаление дополнительного нулевого

 бита

 

%/////////////////////////////////////////////////

%/// ДЕКОДИРОВАНИЕ ПАКЕТА КАНАЛЬНОГО УРОВНЯ L2 ///

%/////////////////////////////////////////////////

 

decoder = fec.bchdec(enc);                          % Construct decoder from encoder

decode_data = decode(decoder,deintr_code_data)';    % декодирование

 

%/////////////////////////////////////////////////

%//// РАЗБОРКА ПАКЕТА КАНАЛЬНОГО УРОВНЯ L2 ///////

%/////////////////////////////////////////////////

 

re_type_b = decode_data(1,1:3);     % Вычисление номера типа пакета - поле "TYPE"

re_id_t_b = decode_data(1,12:16);   % Вычисление ID терминала - поле "ID_T"

re_len_b = decode_data(1,4:11);     % Вычисление длины инф. части - поле "LEN"

re_CRC = decode_data(1,17:20);      % Вычисление поля CRC

 

%============= Проверка CRC ==================================

 

inf_part = [re_type_b re_len_b re_id_t_b];              % создание информационной части

     пакета L2

re_forcrc = [re_type_b re_len_b re_id_t_b re_CRC];      % Создание поля, для кот.вычисл.

     CRC

 

[q r]=deconv(re_forcrc,poly);        % подготовка к проверке CRC

r=mod(abs(r),2);                     % проверка остатка

 

%==============================================================

 

%============= Вывод результатов ==============================

 

err_count = biterr(forcrc,inf_part); % подсчет количества ошибок

 

if r == zeros(1,length(re_forcrc));

    disp(['Тип принятого пакета - №',int2str(bi2deMy(re_type_b,'left_msb'))]);

    disp(['Принятый номер терминала - №',int2str(bi2deMy(re_id_t_b,'left_msb'))]);

else

    disp(['Информационная часть принята ошибочно! Количество ошибок: ',int2str(err_count)]);

end

 

%==============================================================

 

После работы механизма CRC по проверке принятого сообщения на ошибки, в случае отсутствия таковых, программа выводит сообщение типа:

 

================================

Тип передаваемого пакета - №2

Передаваемый номер терминала - №4

------------------------------------

Тип принятого пакета - №2

Принятый номер терминала - №4

================================

 

Если механизм CRC выявил ошибки в принятых данных, то программа выводит сообщение типа:

 

================================

Тип передаваемого пакета - №2

Передаваемый номер терминала - №4

------------------------------------

Информационная часть принята ошибочно! Количество битовых ошибок: 1

================================

 

Количество битовых ошибок подсчитывается в информационной части сообщения канального уровня, т.е в полях, содержащих тип пакета, длину информационной части и id терминала.

 

Для исследования минимально необходимого значения ОСШ, при котором передача сообщения происходит безошибочно, процесс передачи был смоделирован при различных значениях ОСШ и по сто итераций для каждого значения. Итогом выполненных итераций являлась сумма битовых ошибок в информационной части сообщения канального уровня. Так, битовые ошибки появились при ОСШ = 5 дБ – две ошибки на сто итераций передачи. Итак, минимально необходимое значения ОСШ, при котором передача сообщения происходит безошибочно, равно 6 дБ, что практически совпадает с показателем, рассчитанным по графику в третьей [1] статье.

 

 

 

Использованная литература:

 

  1. С.А. Милованов – Система сбора данных с подвижных станций. Часть 3;
  2. С.А. Милованов – Система сбора данных с подвижных станций. Часть 2;
  3. Вторая версия примера PSK-модема - http://radiolay.ru/viewtopic.php?f=37&t=185&start=10#p916.