Тема
Т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)
прекращение
сеанса передачи данных