Тема 2. Доставка сообщений в структурированной радиосети. Часть 3.

Выполнил: студент группы 1110 Севостьянов М.А.

Объём работы:  

1.4. Построение итоговой иерархической модели узлов сети (в соответствии с концепцией OSI). В модели должны быть обязательно учтены задачи доставки как служебных, так и информационных сообщений.

2. Экспериментальная часть. Разработка и экспериментальное исследование программной модели канала передачи данных.

2.1. Разработка и описание блок-схемы алгоритма модели.

2.2. Разработка программных модулей передачи и приема сообщений канального уровня.

1.4. Построение итоговой иерархической модели узлов сети (в соответствии с концепцией OSI). В модели должны быть обязательно учтены задачи доставки как служебных, так и информационных сообщений.


Рисунок 3.1.  Иерархическая модель узлов сети.


2. Экспериментальная часть. Разработка и экспериментальное исследование программной модели канала передачи данных.

2.1. Разработка и описание блок-схемы алгоритма модели.



Рисунок 3.2.  Блок-схема алгоритма модели

2.2. Разработка программных модулей передачи и приема сообщений канального уровня.

При разработке программных модулей необходимо передать файл, являющийся музыкальным фрагментом. Рассмотрим реализацию процесса передачи сообщений от терминала Т1 к точке доступа. Для этого необходимо:
  1. Считать сообщение из файла.
  2. Разбить его на пакеты определенной длинны.
  3. Передать на ТД.
 Структура передаваемого пакета выглядит следующим образом(Рис.3)


Рисунок 3.3.  Структура передаваемых пакетов

Программная часть:

close all;

clc;

err=0;

Выбор файла для передачи

FileName = 'audio.mp3';

Кодировка символа текста: 2 байта на символ

sym_size = 2;

Длина однократно считываемого музыкального фрагмента

Str_size = 14;

Смещение указателя чтения символа из файла на заданную величину

byte_off = 0; 


    Параметры модели:

позиционность модуляции - BPSK

mPos = 2;

R_message = '';

Параметры помехоустойчивого кодека кодека: 

 Для примера используется линейный блоковый код Хэмминга:

 Длина кодового слова n = 2^m-1 = 255 при m = 8

 Размер кодируемого блока k = n-m = 247

m = 8; 

n = 2^m-1; % Codeword length = 255

k = n-m; % Message length = 247

Инициализация пустых массивов

 matched =[]; % результат согласованной фильтрации

расширяющая кодовая последовательность (для примера - случайный код)

ss_code = [1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 1];

Параметры CRC 

poly=[1 0 0 0 0 1 0 0 0 1 0 1 1]; %CRC-12

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

Открытие на чтение и получение идентификатора музыкального файла 

[fid, message] = fopen(FileName, 'rb');

Проверка на доступность указанного файла 

if (fid < 0)

    disp('Файл с передаваемым сообщением не найден. Завершение работы.');

    return

end;

Смещение указателя начала чтения из файла на требуемую величину (sym_size*byte_off байтов)

fseek(fid, sym_size*byte_off, 'cof');

 Организуется цикл чтения данных размером Str_size байт  из файла до тех пор, пока не будет достигнут конец файла

   msg = freed(fid, sym_size, 'int16');

Канальный  уровень 

Подготовка к передаче сообщения

музыкальный фрагмент переводится в двоичный вид

   str_bin = my_de2bi(msg,'left_msb',16); %strtobin(msg)';

 Получение адреса терминала в двоичном 7-и разрядном виде (Address=5)

   addr_bin = my_de2bi(5,'left_msb',7);

  Сборка части L2-сообщения

   msg_Lev2 = [addr_bin  str_bin];

 Получение CRC кода

   m=[msg_Lev2 zeros(1,y-1)]; %вставка нулей в поле CRC

   [q r] = deconv(m,poly); % поиск частного и остатка от деления информационной части на порождающий полином CRC кода 

   r = mod(abs(r),2);

   CRC = r(length(msg_Lev2)+1:end);%расчет CRC

   Сборка сообщения

   msg_Lev1 = [msg_Lev2 CRC];

   trx = msg_Lev1;

Физический уровень

   Помехоустойчивое кодирование

   code_word = encode(trx,n,k,'hamming/binary');

   % codeword имеет размер 255 битов

   % добавление дополнительного бита с целью приведения итогового блока к 

   % величине, кратной степени 2 (256) 

   % code_word = [0 code_word]';


   Здесь выполняется расширение спектра 

    Подготовка массива 

   ss_signal =[]; % сигнал после расширения спектра


   for i=1:length(code_word)

       if code_word(i) == 1

          ss_signal = [ss_signal ss_code];

       else ss_signal = [ss_signal ~ss_code]; % "инверсия кода" 

       end;

   end;

Модуляция 

   h = modem.pskmod(mPos);

   % h - модем BPSK с позиционностью mPos

   % Требуется настроить остальные его параметры:

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

   h.inputtype = 'bit';

   h.SymbolOrder = 'gray';

   h.PhaseOffset = pi/3;


   % собственно модуляция

   IQ_signal = modulate(h, ss_signal);

 Наложение шума на сигнал

   noise_sgn = awgn(IQ_signal,-6);

 Демодуляция

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

   h = modem.pskdemod(mPos);

   h.SymbolOrder = 'gray';

   h.PhaseOffset = pi/3;

   h.OutputType = 'bit';


   % собственно демодуляция

   s = demodulate(h,noise_sgn);

   rec_mes = [];

Согласованная фильтрация (сжатие спекта)

   Принятая последовательность нарезается на блоки размером расширяющей последовательности (length(ss_code)) и перемножается с расширяющим кодом. Учитывая правила перемножения матриц, в результате получается  значение скалярного произведения двух векторов:  текущего блока принятого сигнала и расширяющего кода. Таким образом реализуется согласованная фильтрация.  Единственная особенность - принятая последовательность и расширяющий код должны быть переведены в формат (1,-1) из формата (0,1)

bin_ss_code = (ss_code .* 2)-1;

for i=1:length(code_word)

       x1 = (i-1)*length(ss_code)+1;% нижняя граница извлекаемого блока битов размером расширяющей последовательности 

       x2 = i*length(ss_code);% верхняя граница извлекаемого блока битов размером расширяющей последовательности 

       bin_s = (s(x1:x2).* 2) - 1; % перевoд в формат (1,-1) из формата (0,1)

       matched(i) = bin_s*bin_ss_code'; % собственно скалярное произведение, 

       % в массиве matched имеется оценка принятого сообщения (code_word) 

       if matched(i)>8

           rec_mes = [rec_mes 1];

       else

           rec_mes = [rec_mes 0];

       end;

   end;

 Помехоустойчивое декодирование

   received_mes_L1 = decode(rec_mes(1:n),n,k,'hamming/binary');

 Канальный  уровень 

   Декодирование L2-сообщения 

  Подготовка к проверке CRC

   [q r]=deconv(received_mes_L1,poly);

   Проверка остатка 

   r=mod(abs(r),2);

   if r == zeros(1,length(received_mes_L1))

        detect=0;% ошибок нет

   else

         err=err+1;

        detect=1;% обнаружены ошибки

   end;

 Собственно принятое сообщение

   received_mes_L2 = received_mes_L1(1:length(msg_Lev2));

   Адрес получателя

   addr =  my_bi2de(received_mes_L2(2:7)','left_msb'); 

 

   Извлечение принимаемого сообщения 

   audio_mesage = received_mes_L2(8:length(received_mes_L2))';

  audio = my_bi2de(audio_mes, );

  FileName1 = '1_1.mp3';

  [fid1, message ] = fopen( FileName1, 'wb');

for  i = 1 : length(R_message)

     fwrite(fid1, R_message(i), 'int16');

end;

 Закрытие файла

fclose (fid);

Список используемой литературы:

  1. Тема 3. Цифровой DSSS радиомодем с расширением спектра

  2. Бакке А.В.    "Лекции по курсу ССПО"
  3. Лабораторная работа   "Исследование принципов организации канала передачи данных"
  4. http://omoled.ru/publications/view/579
  5. Часть 1 http://omoled.ru/publications/view/546
  6. Часть 2 http://omoled.ru/publications/view/565