Тема Т4-N7 - "Передача данных с уведомлением о доставке".

 

Выполнил: студент группы № 1110 Соколов Н.А.

 

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

2.3. Исследование процедуры тактовой (символьной) синхронизации физического уровня.

2.4. Исследование качества приема сообщений в условиях действия в канале белого шума.

 

2.3. Исследование процедуры тактовой (символьной) синхронизации физического уровня.

 

Перед тем как проводить исследование процедуры тактовой (символьной) синхронизации физического уровня сначала изменим программный модуль, где введем  процедуры формирования ФУ.

В начале программы задаем исходные данные с помощью функции function set = init().

В исходных данных для ТСН увеличиваем амплитуду сигнала Баркера и добавляем мнимую часть, для того чтобы соответствовать кам-модуляции: set.seq_TCCH=[3+3*1i 3+3*1i 3+3*1i -3-3*1i -3-3*1i -3-3*1i 3+3*1i -3-3*1i -3-3*1i 3+3*1i -3-3*1i].

 

%инициализация параметров

st = init();

 

В начале программы вводим значение  Eb_N0_dB – это параметр энергия/шум Eb/N0, представляющий собой отношение битовой энергии Eb к спектральной плотности шума N0. Использование этих характеристик позволяет находить зависимости вероятности ошибки от Eb/No в цифровых каналах связи.

Примем его значение равное 20.

Eb_N0_dB=20;

Далее рассчитываем отношение сигнал/шум с вводом параметров помехоустойчивого кодирования SNR1 – для передачи сообщения трафика, SNR2 – для передачи сообщения подтверждения.

SNR1=Eb_N0_dB+10*log10(st.k2/st.n2*log2(st.mPos));

 

SNR2=Eb_N0_dB+10*log10(st.k1/st.n1*st.mPos);

 

% чтение wav файла

media=wavread(st.FileNameRead,'native');

% выделение моноканала

media=media(:,1)';

 

% адреса мастера и слейва

Add_rec_m = [1 0 0 0 1];

Add_rec_s = [0 1 1 1 0];

 

% переdод типа данных int16 в двоичный

data_double=int16_2_double(media(1:10000)); %участок медиа

%data_double=int16_2_double(media);% весь медиа

% инициализация параметров необходимых для работы алгоритма

media_rx=[];

% количество передаваемых сообщений

N=floor(length(data_double)/st.Len_traf);

 

for i=1:N

ARQ_cont_rx=1;

 

% последовательность управления мощностью передачи слейва   

Contr_pow = ones (1,16);  

 

% выделение сообщения трафика из мультимедиа потока

L3_traf=data_double((i-1)*st.Len_traf+1:i*st.Len_traf);

% формирование сообщения уровня управления

mes_L3=[Contr_pow L3_traf];

 

while  (ARQ_cont_rx==1)

 

disp('шаг:')

disp(i)

disp('из')

disp(N)

 

% определения номера пакета

Number_packet=my_de2bi( mod(i-1,16),'left_msb',4);

 

Далее происходит формирование мастером сообщений сначала КУ, а затем ФУ с помощью функции:  function  IQ_signal = My_transmiter_master_FL (Add_rec, Number_packet, mes_L3)

 

% формирование мастером сообщения ФУ   

IQ_signal = My_transmiter_master_FL(Add_rec_m, Number_packet, mes_L3);

 

Затем происходит наложение АБГШ

% наложение АБГШ

IQ_signal_r=awgn(IQ_signal,SNR1,'measured');

figure(1)

hold on

plot(IQ_signal_r,'r.')

%%

Далее происходит расформирование слейвом сообщений сначала КУ, а затем ФУ с помощью функцииfunction [Add_rec_rx, Number_packet_rx, rx_mes_L3,  detect] = My_receiver_slave_FL (IQ_signal_r)

 

% расформирование слейвом сообщения ФУ

[Add_rec_m_rx, Number_packet_rx, rx_mes_L3, error_slave] = My_receiver_slave_FL (IQ_signal_r);

% формирование подтверждения/запроса на повторную передачу

disp('получено сообщение траффика номер')

disp(Number_packet_rx)

 

if (error_slave == 0)

    ARQ_cont = 0;

      disp('в нем нет ошибок')

    % извлечение сообщения управления мощностью передачи слейва

    Contr_pow_rx = rx_mes_L3(1:16);

    % выделение собщения трафика

    rx_L3_traf=rx_mes_L3(17:st.Len_traf+16);

else

    ARQ_cont = 1;

    disp('в нем есть ошибки: запрос на повторную передачу')

 

end

 

%%

% последовательность управления мощностью передачи мастера   

Contr_pow_s = ones (1,16);

% формирование сообщения уровня управления

 

mes_L3_s= [Contr_pow_s zeros(1,50)];%%%%

 

%%

Далее происходит формирование слейвом сообщений сначала КУ, а затем ФУ с помощью функцииfunction  IQ_signal = My_transmiter_slave_FL (Add_rec, Number_packet, ARQ_m, mes_L3)

 

% формирование слейвом сообщения ФУ   

IQ_signal_2 = My_transmiter_slave_FL (Add_rec_s, Number_packet_rx, ARQ_cont, mes_L3_s);

 

Затем происходит наложение АБГШ

% наложение АБГШ

 

IQ_signal_2_r=awgn(IQ_signal_2,SNR2,'measured');

 

figure(2)

hold on

plot(IQ_signal_2_r,'k.')

 

Далее происходит расформирование мастером сообщений сначала КУ, а затем ФУ с помощью функции:  function [Add_rec_rx, Number_packet_rx, ARQ_m, rx_mes_L3, detect] = My_receiver_master_FL (IQ_signal_r)

 

% расформирование мастером сообщения ФУ

 

[Add_rec_rx_s, Number_packet_rx_s, ARQ_cont_rx, rx_mes_L3_s, error_master] = My_receiver_master_FL (IQ_signal_2_r);

 

% формирование подтверждения/запроса на повторную передачу

if (error_master == 0)

    disp('в сообщении управления нет ошибок')

    % извлечение сообщения управления мощностью передачи слейва

    Contr_pow_rx = rx_mes_L3_s(1:16);

else

    disp('в сообщении управления есть ошибки')

    error('прекращение сеанса передачи данных')

end

 

%%

%pause

%%

 

end

% формирование потока трафика

media_rx=[media_rx rx_L3_traf];

end

 

%перевод из двоичного в int16

media_int16=double_2_int16(media_rx);

% запись wav файла   

wavwrite(media_int16,st.Fs,st.FileNameWrite)

 

******************

function set = init()

 

% название файла для чтения

set.FileNameRead='fraza1111.wav';

% частота дискретизации

set.Fs=44100;

% название файла для записи

set.FileNameWrite='fraza1_add_noise.wav';

% параметры модели

 

% длина сообщения УУ

set.Len_traf=932;

set.Len_cont=50;

 

% длина сообщения КУ без учета поля CRC

set.length_msg_Lev2_traf = 973-16;%

set.length_msg_Lev2_cont = 92-16;%

 

% Параметры CRC

set.poly=[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0];

[set.x, set.y]=size(set.poly);

 

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

set.n1=127;

set.k1=92;

set.n2=1023;

set.k2=973;

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

set.mPos=16;

 

% последовательность TCCH

set.seq_TCCH=[3+3*1i 3+3*1i 3+3*1i -3-3*1i -3-3*1i -3-3*1i 3+3*1i -3-3*1i -3-3*1i 3+3*1i -3-3*1i];

end

 

*****************************

 function  IQ_signal = My_transmiter_master_FL (Add_rec, Number_packet, mes_L3)

% формирование сообщения КУ Мастера

st = init();

 

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

msg_Lev2 = [Add_rec Number_packet mes_L3];

 

% получение CRC кода

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

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

%информационной части на порождающий полином CRC кода

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

CRC = r(st.length_msg_Lev2_traf + 1:end);%расчет CRC

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

msg_Lev2 = [msg_Lev2 CRC];

 

% формирование сообщения ФУ Мастера

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

hEnc = comm.BCHEncoder('CodewordLength', st.n2, 'MessageLength', st.k2 );

encodedData = step(hEnc, msg_Lev2');

encodedData = [0 encodedData'];

% QAM - 16 модуляция

h = modem.qammod(st.mPos);

h.inputtype = 'bit';

IQ_signal_L1 = modulate(h, encodedData');

% Добавление поля TCCH

IQ_signal_TCCH=st.seq_TCCH;

IQ_signal = [IQ_signal_TCCH IQ_signal_L1'];

 

end

*******************

function [Add_rec_rx, Number_packet_rx, rx_mes_L3,  detect] = My_receiver_slave_FL (IQ_signal_r)

 

st = init();

% поиск TCCH, где START номер отсчета окончания поля TCCH

START= find_TCCH (IQ_signal_r);

 

% выделение поля из 256 IQ-символов несодержащих поле TCCH

IQ_signal_r=IQ_signal_r(START+1:START+256);

% расформирование сообщения ФУ мастера

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

h = modem.qamdemod(st.mPos);

h.OutputType = 'bit';

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

r_code_word = demodulate(h,IQ_signal_r');

r_code_word = r_code_word(2:1024,1)';

%декодирование

hDec = comm.BCHDecoder('CodewordLength', st.n2, 'MessageLength', st.k2 );

decodedData = step(hDec, r_code_word');

rx_mes_L2=decodedData';

 

% расформирование сообщения КУ мастера

 

[q r]=deconv(rx_mes_L2,st.poly);

%проверка остатка

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

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

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

   else

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

   end

  

Add_rec_rx=rx_mes_L2(1:5);

Number_packet_rx=rx_mes_L2(6:9);

rx_mes_L3=rx_mes_L2(10:st.length_msg_Lev2_traf);

end

*****************

function  IQ_signal = My_transmiter_slave_FL (Add_rec, Number_packet, ARQ_m, mes_L3)

% формирование сообщения КУ слейва

st = init();

 

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

msg_Lev2 = [Add_rec Number_packet ARQ_m mes_L3];

 

% получение CRC кода

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

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

%информационной части на порождающий полином CRC кода

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

CRC = r(st.length_msg_Lev2_cont + 1:end);%расчет CRC

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

msg_Lev2 = [msg_Lev2 CRC];

 

% формирование сообщения ФУ Мастера

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

hEnc = comm.BCHEncoder('CodewordLength', st.n1, 'MessageLength', st.k1 );

encodedData = step(hEnc, msg_Lev2');

encodedData = [0 encodedData'];

% QAM - 16 модуляция

h = modem.qammod(st.mPos);

h.inputtype = 'bit';

IQ_signal_L1 = modulate(h, encodedData');

% Добавление поля TCCH

IQ_signal_TCCH=st.seq_TCCH;

IQ_signal = [IQ_signal_TCCH IQ_signal_L1'];

 

end

****************

function [Add_rec_rx, Number_packet_rx, ARQ_m, rx_mes_L3, detect] = My_receiver_master_FL (IQ_signal_r)

st = init();

 

% поиск TCCH, где START номер отсчета окончания поля TCCH

START= find_TCCH (IQ_signal_r);

 

% выделение поля из 256 IQ-символов несодержащих поле TCCH

IQ_signal_r=IQ_signal_r(START+1:START+32);

% расформирование сообщения ФУ мастера

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

h = modem.qamdemod(st.mPos);

h.OutputType = 'bit';

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

r_code_word = demodulate(h,IQ_signal_r');

r_code_word = r_code_word(2:128,1)';

%декодирование

hDec = comm.BCHDecoder('CodewordLength', st.n1, 'MessageLength', st.k1 );

decodedData = step(hDec, r_code_word');

rx_mes_L2=decodedData';

 

% расформирование сообщения КУ слейва

[q r]=deconv(rx_mes_L2,st.poly);

%проверка остатка

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

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

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

   else

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

   end

  

Add_rec_rx=rx_mes_L2(1:5);

Number_packet_rx=rx_mes_L2(6:9);

ARQ_m=rx_mes_L2(10);

rx_mes_L3=rx_mes_L2(11:st.length_msg_Lev2_cont);

 

end

*************

function data_int16=double_2_int16(data_double)

% Функция, отвечающая за преобразование данных типа double в int16, а также

% за преобразование двоичного формата данных в десятичный

out_sample_int16=[];

 

out_bin=int16(data_double);

 

for ii=1:floor(length(out_bin)/16)

    sample_bin_r=out_bin(16*(ii-1)+1:16*(ii-1)+16);

   

    if sample_bin_r(1)==0

        znak=1;

    else

        znak=-1;

    end

   

   sample_in16_r=bi2de(sample_bin_r(2:16),'left-msb');

  

   sample_in16_r_znak=znak*sample_in16_r;

  

   out_sample_int16=[out_sample_int16 sample_in16_r_znak];

  

end

 

data_int16=out_sample_int16;

 

end

*************

function data_double=int16_2_double(data_int16)

% Функция, отвечающая за преобразование данных типа int16 в double, а также

% за преобразование десятичного формата данных в двоичный

out_bin=[];

 

for ii=1:length(data_int16)

    sample=data_int16(ii);

if sample>0

        znak=0;

    else

         znak=1;

end

   sample_bin=de2bi(abs(sample),15,'left-msb');

   sample_bin_znak=[znak sample_bin];

  

   out_bin=[out_bin sample_bin_znak];   

end

 

data_double=double(out_bin);

end

*****************

function d = my_bi2de(b, msbflag)

 

%now i need to convert bit vector into decimal numbers. so my_bi2de is the

%function for that, d is the output decimal number, b is the binary vector,

%and msbflag is unlike my_de2bi function to check the msb position.

 

%santosh shah, The LNM IIT Jaipur (India)(santosh.jnt@gmail.com) 23/04/07

 

if nargin < 2 % by default msb bit is at the right side

    msbflag = 'right_msb';

end

 

%checking the matrix containt wheter it has 1's or 0's or not.

if ~all(all(b==1 | b==0))

    error('matrix containt can not be other than 1 and 0');

end

   

%now i am going to check the matrix dimention

 

[nrow ncol] = size(b);

%computing decimal number

[nrows ncols] = size(b);

d = zeros(nrows, 1);

power_two = 2 .^ [0:ncols-1]; % computing in the form [1 2 4 8]

 

%checking the condition of msbflags

switch(msbflag)

    case 'left_msb'

        b = fliplr(b);

    case 'right_msb'

        %leave as same

    otherwise

        error('Invalid value of MSBFLAG');

end

d = b * power_two';   

 

****************

function b= my_de2bi(d, msbflag, n)

 

%This is the function to convert decimal to binary. here b is the binary

%output where non-negative decimal vector d is the input data. Each row of

%the binary matrix b is corresponds to the one element of d. The first

%element in the row of b signifies LSB. If d is the matrix rather than row

%and coulmn vector then, convert to coulmn vector.

 

% here two optional parameter i am using msbflag and n. msbflag determines

% the output orientation, it has two possible values right_msb and

% left_msb. if the left_msb id given then the orientation of the bits are

% just flip i.e. display the msb to the left and right_msb is for the default.

% n defines how many digits(coulmn) are output.

 

%santosh shah, The LNM IIT Jaipur (India)(santosh.jnt@gmail.com) 23/04/07

 

%process for decibel to binary conversion

 

if nargin < 2

    msbflag = 'right_msb';

end % by default msb bit is at the right side

 

% Convert d to column if necessary

d = d(:);

 

% Find minimum number of digits needed to represent the input. If n is

% specified, use it but only if its >= the required minimum; otherwise

% raise an error.

nmax = ceil(log2(max(d)));

if (nargin < 3)

    n = nmax;

elseif n < nmax

    error('Specified number of columns in output matrix is too small.');

end

 

%checking wheter d is integer or not.

if ~all(d == floor(d))

    error('messege data should be a +ve integer.');

end

 

%allocating space for output data

b = zeros(length(d),n) ;

 

% Convert to binary. Loop over the entries of d, and for each entry, first

% get the lsb, and then keep right shifting by dividing by 2 until the

% number is zero.

for k = 1:length(d)

    x = d(k);

    l = 1;      % Indicates the bit we are currently looking at

   

    while x > 0

       

        % Extract lsb, shift x to the right and update index

        b(k, l) = bitand(x, 1);

        x = floor(x / 2);

        l = l + 1;

    end

end

 

 

%checking the condition of msbflags

switch(msbflag)

    case 'left_msb'

        b = fliplr(b);

    case 'right_msb'

        %leave as same

    otherwise

        error('Invalid value of MSBFLAG');

end

 

 

Теперь приступаем к описанию процедуры тактовой (символьной) синхронизации физического уровня. Эта процедура осуществляется при расформировании слейвом сообщения трафика ФУ при помощи функции: function START_DATA = find_TCCH (IQ_signal_r).

 

function START_DATA = find_TCCH (IQ_signal_r)

 

st = init();

Происходит нахождение ВКФ (временно-корреляционной функции), сравнение входного сигнала IQ_signal_r с опорным сигналом st.seq_TCCH, у которого увеличена амплитуда сигнала Баркера и добавлена мнимая часть, для того чтобы соответствовать кам-модуляции: set.seq_TCCH=[3+3*1i 3+3*1i 3+3*1i -3-3*1i -3-3*1i -3-3*1i 3+3*1i -3-3*1i -3-3*1i 3+3*1i -3-3*1i].

 

% нахождение ВКФ

cor=abs(xcorr(IQ_signal_r,st.seq_TCCH));

 

figure(3)

plot (cor)

Далее находится максимум ВКФ и фиксирование номера отсчета, соответствующего максимуму. Максимум мы сравниваем с произвольным числом 150. Если Мах > 150, то находится номер отсчета, соответствующий окончанию ТСН.

% поиск максимума ВКФ, фиксирование номера отсчета, соответствующего

% максимуму

[MAX,Index_max]=max(cor);

 

if MAX > 150

   % номер отсчета, соответствующий окончанию ТССН

   START_DATA = Index_max-round(length(cor)/2)+11;

else

    disp('ТССН не найдена')

    disp('сбой тактовой синнхронизации')

end

 

end  


Рис.10. Пример ВКФ между входным сигналом и опорной последовательностью.

 

2.4. Исследование качества приема сообщений в условиях действия в канале белого шума.

 

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

2.4.1. При ОСШ равном 20


Рис.2.4.1.1. Сигнально-кодовое созвездие QAM-16 сигнала от мастера к слейву


Рис.2.4.1.2. Сигнально-кодовое созвездие QAM-16 сигнала от слейва к мастеру


Рис.2.4.1.3. ВКФ между входным сигналом и опорной последовательностью.

 

2.4.2. При ОСШ равном 15


Рис.2.4.2.1. Сигнально-кодовое созвездие QAM-16 сигнала от мастера к слейву


Рис.2.4.2.2. Сигнально-кодовое созвездие QAM-16 сигнала от слейва к мастеру


Рис.2.4.2.3. ВКФ между входным сигналом и опорной последовательностью.

 

2.4.3. При ОСШ равном 10


Рис.2.4.3.1. Сигнально-кодовое созвездие QAM-16 сигнала от мастера к слейву


Рис.2.4.3.2. Сигнально-кодовое созвездие QAM-16 сигнала от слейва к мастеру


Рис.2.4.3.3. ВКФ между входным сигналом и опорной последовательностью.

 

2.4.4. При ОСШ равном 5


Рис.2.4.4.1. Сигнально-кодовое созвездие QAM-16 сигнала от мастера к слейву


Рис.2.4.4.2. Сигнально-кодовое созвездие QAM-16 сигнала от слейва к мастеру


Рис.2.4.4.3. ВКФ между входным сигналом и опорной последовательностью.

 

Рассмотрим ошибки, которые могут возникнуть при передаче данных.

1. При ОСШ равном 5 при передаче пакета трафика, когда слейв производит расформирование сигнала возникают ошибки. Я рассмотрел это на участке медиа 1:1000.

Здесь работает ARQ-запрос с остановкой и ожиданием до тех пор пока пакет не передастся правильно.

шаг:

     1

из

    17

получено сообщение трафика номер

     0     0     0     0

в нем есть ошибки: запрос на повторную передачу

в сообщении управления нет ошибок

 

шаг:

     1

из

    17

получено сообщение трафика номер

     0     0     0     0

в нем нет ошибок

в сообщении управления нет ошибок

 

шаг:

     2

из

    17

получено сообщение трафика номер

     0     0     0     1

 

в нем есть ошибки: запрос на повторную передачу

в сообщении управления нет ошибок

 

Второй шаг также будет выполняться до тех пор пока пакет не передастся правильно.

И так будет продолжаться 17 шагов.

 

Когда

2. При ОСШ равном  (-5) при передаче пакета трафика, когда мастер производит расформирование сообщения от слейва о запросе на повторную передачу возникают ошибки. Я рассмотрел это на участке медиа 1:1000.

шаг:

     1

из

    17

получено сообщение траффика номер

     0     0     0     0

в нем есть ошибки: запрос на повторную передачу

в сообщении управления есть ошибки

Error using sokolov_L1 (line 107)

прекращение сеанса передачи данных