Разработка функциональных схем передающего и приемного трактов физического уровня – на основе концепции SDR (Software Defined Radio). Пояснение назначения модулей схемы.

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

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

Текст программы разделяется на 2 части: передающую и приёмную.

передающее устройство включает в себя следующие блоки:

·         устройство управления – осуществляет управление устройством и формируем сообщение канального уровня.

·         помехоустойчивый кодер – предназначается для того, чтобы вносить избыточность в информационный поток.

·         перемежитель – для борьбы с пакетными ошибками осуществляет перестановку бит.

модулятор – модуляция битового потока.

                                                              Рисунок 1. Передающая часть. 

    Текст программы отображающий передающую часть:




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

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

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

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

 

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

%////// СБОРКА ПАКЕТА КАНАЛЬНОГО УРОВНЯ 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 дБ)

 

На приемной части выполняются обратные операции:

·         Демодуляция – модулированный сигнал преобразуется в битовый поток.

·         Деперемежение – обратная операция перемежения.

·         Помехоустойчивый декодер – осуществляет исправление ошибок.

·         Устройство управления – анализ принятого пакета .


                                                             Рисунок 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 по проверке принятого сообщения на ошибки, в случае отсутствия таковых, программа выводит сообщение типа:

 

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

 

Точка сбора  должна сравнить полученный идентификатор терминала с записанным в своей памяти, и на основании этого сравнения определить дальнейший сценарий взаимодействия с терминалом. Минимально необходимое значения ОСШ, при котором передача сообщения происходит безошибочно, равно 6 дБ.

Список литературы:

1.http://omoled.ru/publications/view/348

2.Куликов А.А.– Система сбора данных с подвижных станций. Часть 2;

3.Куликов А.А.– Система сбора данных с подвижных станций. Часть 3;

4.Основы построения беспроводных сетей стандарта 802.11: А.В. Бакке. -Рязань, 2008.

5.А.В. Бакке. «Лекции по курсу ССПО», Рязань, РГРТУ 2012.