Вы находитесь на странице: 1из 185

Министерство образования и науки Украины

Национальный университет кораблестроения


имени адмирала Макарова

Ш. М. Ихсанов, В. М. Рябенький, А.С. Дьяконов

ИССЛЕДОВАНИЕ СИГНАЛОВ РЕАЛЬНЫХ


ИНФОРМАЦИОННЫХ СИСТЕМ
С ИСПОЛЬЗОВАНИЕМ ПРИЕМНИКОВ RTL-SDR

Учебное пособие

Николаев
2018
УДК 654.1:621.396.7
ББК 32.884.8-5
І95
Рецензенты:
Докт. технических наук, профессор Лисовой Иван Павлович
Докт. технических наук, профессор Фисун Николай Тихонович

Одобрено Ученым советом НУК


Рекомендовано к печати в качестве учебного пособия
(протокол № 6 от 27.06 2018 г.)

Ихсанов Ш. М., Рябенький В. М., Дьяконов А.С.


И95 Исследование сигналов реальных информационных систем с использованием прием-
ников RTL-SDR : учебн. пособ. / Ш. М. Ихсанов, В. М. Рябенький, А.С. Дьяконов. — Ни-
колаев, 2018. — 175 с.
ISBN
Пособие посвящено использованию в учебном процессе приемников RTL-SDR, которые позволяют
использовать вместо цифровых моделей реальные сигналы различных информационных систем.
В первом разделе исследуются сигналы FM радиостанций, анализируются алгоритмы их обработки.
Приведена цифровая модель сигналов FM радиостанций и показана ее соответствие реальным сигналам.
Второй раздел посвящен исследованию бортовых сигналов воздушных суден в технологии ADS-B.
Подробно рассмотрены методы передачи бортовых данных, алгоритмы их выделения с указанием направле-
ний возможного совершенствования, приведены статистические данные по приему бортовых сигналов.
В третьем разделе рассмотрена система автоматической идентификации морских судов (AIS). Приве-
дены теоретические и экспериментальные данные по сигналам GMSK, используемым в системе для переда-
чи информации. Приведены результаты обнаружения сигналов AIS в акватории Бугского лимана. Оценены
характеристики алгоритма выделения бортовых сигналов корпорации MathWorks, экспериментально пока-
зано, что его совершенствование приводит к увеличению частоты обнаружения сигналов AIS более чем в 3
раза.
В четвертом разделе рассмотрен алгоритм и программная реализация демодулятора QPSK сигналов.
Рассмотрены характеристики алгоритма при обработке моделируемой и реальной спутниковой информации.
Приведены индивидуальные задания по лабораторным и курсовым работам, а также темы курсовых
проектов.
Программная реализация алгоритмов привязана к MATLAB версии R2015a и выше.
Пособие рекомендуется для студентов вузов направления «Электроника и телекоммуникации».

УДК 654.1:621.396.7
ББК 32.884.8-5

ISBN © Ихсанов Ш. М., Рябенький В. М., Дьяконов А.С.


4

ВВЕДЕНИЕ ........................................................................................................................... 5
1. ПРИЕМ И ОБРАБОТКА СИГНАЛОВ FM-РАДИОСТАНЦИЙ .......................................... 11
1.1. История и теоретические основы FM-сигналов......................................................................11
1.2. Дискриминантный алгоритма выделения FM-сигналов .......................................................14
1.3. Краткий обзор основ теории фильтрации сигналов ..............................................................19
1.4. Цифровая модель сигналов FM радиостанций. .....................................................................28
1.5. Совершенствование некогерентного дискриминантного алгоритма обработки FM
сигналов .................................................................................................................................................36
1.6. Задания для лабораторных, курсовых работ и дипломных проектов..................................44

2. ОТСЛЕЖИВАНИЕ ТРАЕКТОРИЙ ПОЛЕТА ВОЗДУШНЫХ СУДОВ ............................. 49


2.1. Общая информация о методах передачи сообщений воздушными судами .....................49
2.2. Структура передаваемых сообщений......................................................................................50
2.3. Информация о местоположении воздушного судна .............................................................55
2.4. Информация о скорости воздушного судна............................................................................59
2.5. Алгоритм обнаружения бортовых сигналов воздушных суден ............................................63
2.6. Обзор экспериментов по приему бортовых сигналов ...........................................................80
2.7. Задания для лабораторных, курсовых работ и дипломных проектов..................................86

3. ОТСЛЕЖИВАНИЕ ДВИЖЕНИЯ МОРСКИХ СУДОВ .................................................... 89


3.1. Общие сведения о GMSK сигналах ..........................................................................................89
3.2. Исследование сигналов GMSK в Matlab. .................................................................................97
3.3. Общая информация о методах передачи сообщений морскими судами ........................114
3.4. Исследование реальных сигналов AIS ...................................................................................117
3.4.1. Алгоритм обнаружения сигналов AIS ............................................................................117
3.4.2. Исследование записей сигналов AIS от судов в окрестности г. Бостона ...................119
3.4.3. Исследование сигналов судов в акватории Бугского лимана .....................................150
3.5. Задания для лабораторных, курсовых работ и дипломных проектов.....................................164

4. ИССЛЕДОВАНИЕ РЕАЛЬНЫХ СПУТНИКОВЫХ СИГНАЛОВ ..................................... 166


4.1. Стандарт передачи Интернет данных через спутниковые каналы связи ..........................166
4.2. Краткое описание записи спутникового сигнала..................................................................173
4.3. Математическая модель сигналов с фазовой модуляцией ................................................173
4.4. Результаты сравнения реального спутникового сигнала с моделью QPSK сигналов.......177
4.5. Задания для лабораторных, курсовых работ и дипломных проектов................................183

ЛИТЕРАТУРА ................................................................................................................... 185


5

ВВЕДЕНИЕ
Аббревиатура RTL-SDR расшифровывается как Real Time Desktop Soft-
ware Defined Radio – на русский язык переводится примерно как «Программ-
но-определяемая радиосистема (радио) реального времени». Прежде всего,
это приемник принимающий сигналы в очень широком диапазоне частот, а
именно от 25 МГц до 1.75 ГГц. Далее принятый сигнал переводится в цифру
по обоим квадратурным каналам с помощью высокоскоростного 8-
разрядного АЦП с частотой до 2.8 МГц (частота квантования может быть до-
ведена до 3.2 МГц, однако не рекомендуется превышать величину 2.8 МГц,
поскольку это гарантирует отсутствие потерь данных). На рисунке 1 изобра-
жены некоторые виды приемника и прилагаемая антенна:

Рис. 1. Некоторые виды приемника RTL-SDR и прилагаемая антенна

Как видно из рисунка, приемник стыкуется с ПК по USB-порту (USB2).


Указанные характеристики приемника позволяют принимать сигналы
многих служб. На рисунке 2 приведены некоторые из служб Великобритании
(примерно такая же загрузка частот используется на территории Украины и
России), радиосигналы которых могут быть приняты на приемник RTL-SDR:
6

Рис . 2. Службы Великобритании, радиосигналы которых могут быть при-


няты на приемник RTL-SDR

После установки драйверов приемника и обеспечения возможности по-


дачи сигналов приемника в MATLAB, мы можем начинать анализировать
программы по обработке различных сигналов. Приведем текст программы,
обеспечивающей прием квадратурной информации в заданный массив:
%% Функция для приема информации с RTL-SDR

function ReceiveFromRTLSDR
%% PARAMETERS (edit)
rtlsdr_id = '0'; % stick ID – порт приемника
rtlsdr_fc = 623.225e6; % tuner centre frequency in Hz —
% центральная частота приемника в Гц
rtlsdr_gain = 60; % tuner gain in dB —
% усиление приемника в дБ
rtlsdr_fs = 2.4e6; % tuner sampling rate, max 3.2e6 –
% частота квантования сигнала в Гц
rtlsdr_ppm = 0; % tuner parts per million correction
% — параметр, используемый при
% дополнительной коррекции частоты
rtlsdr_frmlen = 5*256; % output data frame size(multiple of 5)
% — количество комплексных отсчетов
% при одной выдаче
rtlsdr_datatype='single';% output data type – тип выдаваемых
% данных, аналог float (4 байта)

%% SYSTEM OBJECTS (do not edit)

% link to a physical rtl-sdr


7

% – подключаемся к физическому приемнику:


obj_rtlsdr = comm.SDRRTLReceiver(...
rtlsdr_id,...
'CenterFrequency', rtlsdr_fc,...
'EnableTunerAGC', false,...
'TunerGain', rtlsdr_gain,...
'SampleRate', rtlsdr_fs, ...
'SamplesPerFrame', rtlsdr_frmlen,...
'OutputDataType', rtlsdr_datatype,...
'FrequencyCorrection', rtlsdr_ppm);

% Проверяем активность RTL-SDR:


if isempty(sdrinfo(obj_rtlsdr.RadioAddress))
error(['RTL-SDR failure. Please check connection to ',...
'MATLAB using the "sdrinfo" command.']);
end

% Создаем спектр-анализатор:
h = dsp.SpectrumAnalyzer('SampleRate',rtlsdr_fs);

% calculate time for 1 frame of data — вычисляем время


% приема одной порции (одного фрейма) информации:
rtlsdr_frmtime = rtlsdr_frmlen/rtlsdr_fs;

% set rec_time and reset run_time to 0 (secs):


rec_time = 3600; % время работы программы
run_time = 0;

f = figure; % окно для программы

% Create a constellation diagram and set the SamplesPerSymbol


% property — создание объекта для отображения сигнального
% созвездия (фазового портрета сигнала) и задание количества
% отсчетов на символ (при Rup=1 все комплексные отсчеты
% используются для отображения, при Rup=2 — через 1 и т.д.)
Rup = 1;
hScope = comm.ConstellationDiagram('SamplesPerSymbol',Rup);

% loop while run_time is less than rec_time — цикл до истечения


% заданного времени работы программы:
while run_time < rec_time

% fetch a frame from obj_rtlsdr —


% получение одной порции информации:
rtlsdr_data = step(obj_rtlsdr);

% Отображение квадратур исходного сигнала:


Nn=1; % Начальная точка на отображение
dN=245; % количество точек на отображение
Nk=Nn+dN;
t=Nn:Nk;
8

plot(t,rtlsdr_data(Nn:Nk),t,imag(rtlsdr_data(Nn:Nk)));

% Отображение спектра сигнала:


step(h,rtlsdr_data);

% Display the constellation diagram of the received signal —


% - отображение текущего сигнального созвездия:
step(hScope,rtlsdr_data);

% update run_time after processing another frame —


% увеличение текущего времени на время получения одной
% порции информации:
run_time = run_time + rtlsdr_frmtime;

% Пауза на заданное число секунд


%(можно задавать доли секунды)
pause(1.0);

% Прерывание работы программы по нажатию клавиши Q при


% активном окне программы (созданного командой f = figure):
if get(f,'CurrentCharacter') == 'q'
break;
end
end

close(f);
end

В программе приведено подробное разъяснение используемых функций.


Дополнительно отметим одно из соглашений MATLAB по возможности раз-
мещения аргументов функции в нескольких строках. В отличие от языка
С++, в котором можно любые выражения переносить на новую строку (ис-
ключением являются значения строковых переменных, заключенные в двой-
ные или одинарные кавычки), в MATLAB перед переносом необходимо по-
ставить троеточие. Это сделано в приведенной программе при соединении и
выдаче на физический приемник RTL-SDR управляющих команд функцией
comm.SDRRTLReceiver(). Кроме приема квадратурной информации с прием-
ника, в программе приведены функции для отображения квадратур во време-
ни, спектра сигнала в полосе частот rtlsdr_fs (2.4 МГц) и сигнального созвез-
дия (фазового портрета сигнала). Реализации перечисленных данных приве-
дены для сигнала из радиовещательного диапазона на частоте 623.225 МГц:
9

Рис. 3. Пример информации в квадратурных каналах

Рис. 4. Пример с пектра сигнала


10

Рис. 5. Пример сигнального созвездия


11

1. ПРИЕМ И ОБРАБОТКА СИГНАЛОВ FM-РАДИОСТАНЦИЙ


1.1. История и теоретические основы FM-сигналов
Подробный анализ различных реальных сигналов и алгоритмов их обра-
ботки начнем с сигналов FM-радиостанций. Вначале коротко остановимся на
принципах работы FM-станций. Аббревиатура FM взята от сочетания Fre-
quency Modulation — частотная модуляция. Не путать с режимом FSK – (Fre-
quency Shift Keying) для передачи цифровой информации.
Режим FM был предложен американским инженером Едвином Арм-
стронгом (Edwin Howard Armstrong) в 1933 году как результат его усилий по
борьбе со статическими помехами для уже широко использовавшегося в то
время режима амплитудной модуляции (AM – amplitude modulation). Он от-
крыл, что при модулировании несущей частоты вместо амплитуды, излучен-
ный сигнал становится гораздо более устойчивым к воздействию помех и
сигналам близких радиостанций. Получив 4 патента на свое изобретение, он
начал работы по созданию сети FM радиостанций. В горах Нью-Джерси
Армстронг построил ажурную башню высотой 400 футов (122 м). Башня бы-
ла построена 1937 году и до сих пор эксплуатируется!
Наиболее простая схема генерирования FM сигнала получается в режи-
ме VCO (voltage-controlled oscillator - генератор, управляемый напряжением)
(рис. 1.1):

Рис. 1.1. Схема генерирования FM сигнала в режиме VCO

В аналитическом виде такой FM сигнал записывается следующим об-


разом:

 t

s fm (t ) = A0 exp j ( 2πf c t + 2πK fm ∫ si (τ )dτ )  (1.1)
 −∞ 
Здесь f c — несущая радиочастота, K fm — коэффициент девиации ча-
стоты, s i (t ) — информационный (звуковой) сигнал. Обратите внимание, что
12

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


интегралом от него.
За эталон цифровой обработки сигналов FM радиостанций возьмем про-
грамму SDRSharp. Описание элементов управления и настроек SDRSharp [1]
показывает широкие возможности программы и сложность применяемых ал-
горитмов обработки.
В северо-восточной части Николаева (46.965960, 32.076280), где автор
проводил эксперименты с приемником SDR-RTL, программа SDRSharp при
подключении к приемнику маленькой антенны, изображенной на рисунке 1,
обеспечивает хорошее качество звука по 8-ми FM радиостанциям (таблица
1.1):
Таблица 1.1.
№ п/п Частота FM станции (МГц) Название
1 99.2 Мелодия
2 102.1 Kiss FM
3 102.8 Наше радио
4 103.3 Авто радио
5 104.1 Стильное радио
6 105.1 Радио Пятница
7 106.4 Ретро FM
8 107.8 Эра FM

В частотной области в районе 102 МГц сигналы FM станций выглядят


следующим образом (рис 1.2):
13

Рис. 1.2. Спектры FM-радиостанций в программе SDRSharp


В самом начале диапазона мы видим очень мощный сигнал от KissFM
на частоте 102.1 МГц, далее довольно слабый сигнал от Нашего радио на
частоте 102.8 МГц и немного лучший сигнал от Авто радио на частоте 103.3
МГц. В нижней части спектр отображается в так называемом режиме Water-
fall (водопад), в котором вниз идет ось времени, а спектральная мощность
каждой частоты отображается цветом в соответствии приведенной в правой
части шкалой. Отметим, что сигналы FM радиостанций занимает полосу до
250 кГц (осветленная полоса на сигнале KissFM), соответственно их нельзя
размещать ближе. Дальность распространения волн в диапазоне FM, за ис-
ключением редких случаев аномального распространения радиоволн, строго
ограничена так называемой «прямой видимостью». Она зависит от высоты
расположения передающей и приёмной антенн. Понятно, что в условиях го-
родской застройки, ни о какой прямой видимости говорить нельзя, но радио-
волны проходят сквозь городские застройки с некоторым ослаблением. Чем
выше частота, тем выше затухание в городских застройках. Понятно поэто-
му, что необходимо в каждом регионе иметь ретрансляторы FM радиостан-
ций, при этом их частоты в разных регионах, как правило, отличаются.
14

1.2. Дискриминантный алгоритма выделения FM-сигналов


Обработку сигналов FM радиостанций начнем с достаточно простого, не
когерентного дискриминантного алгоритма для выделения моно сигнала.
Программа приведена в открытом виде в библиотеке файлов замечательной
книги [2]:

Рис. 1.3. Обложка одной из лучших книг по обработке сигналов


приемников RTL-SDR

Приведем полный текст программы:


% RTL-SDR(rx) FM Mono Non Coherent Discriminator Demodulator
% MATLAB Script

function rtlsdr_fm_discrim_demod_matlab

%% PRINT FILE INFORMATION HYPERLINK TO COMMAND WINDOW


disp(['View file information for <a href="matlab: mfilein-
fo(''',mfilename,''')">',mfilename,'</a>']);

%% PARAMETERS (edit)
offline = 0; % 0 = use RTL-SDR, 1 = import data
offline_filepath = 'rec_data\wfm_mono.mat'; % path to signal
rtlsdr_id = '0'; % stick ID
15

rtlsdr_fc = 102.8e6; % tuner centre frequency in Hz


rtlsdr_gain = 50; % tuner gain in dB
rtlsdr_fs = 2.4e6; % tuner sampling rate
rtlsdr_ppm = 0; % tuner parts per million correction
rtlsdr_frmlen = 256*25; % output data frame size
% (multiple of 5)
rtlsdr_datatype = 'single';% output data type
deemph_region = 'eu'; % set to either eu or us
audio_fs = 48e3; % audio output sampling rate
sim_time = 3600; % simulation time in seconds

%% CALCULATIONS (do not edit)


% calculate time for 1 frame of data:
rtlsdr_frmtime = rtlsdr_frmlen/rtlsdr_fs;
% find de-emphasis filter coeff
if deemph_region == 'eu'
[num,den] = butter(1,3183.1/(audio_fs/2));
elseif deemph_region == 'us'
[num,den] = butter(1,2122.1/(audio_fs/2));
else
error('Invalid region for de-emphasis filter –
must be either "eu" or "us"');
end

%% SYSTEM OBJECTS (do not edit)

% check if running offline


if offline == 1

% link to an rtl-sdr data file


obj_rtlsdr = import_rtlsdr_data(...
'filepath', offline_filepath,...
'frm_size', rtlsdr_frmlen,...
'data_type',rtlsdr_datatype);

% reduce sampling rate


rtlsdr_fs = 240e3;

% fir decimator - fs = 240kHz downto 48kHz


obj_decmtr = dsp.FIRDecimator(...
'DecimationFactor', 5,...
'Numerator',
firpm(100,[0,15e3,20e3,(240e3/2)]/(240e3/2),...
[1 1 0 0], [1 1], 20));

else

% link to a physical rtl-sdr


obj_rtlsdr = comm.SDRRTLReceiver(...
rtlsdr_id,...
16

'CenterFrequency', rtlsdr_fc,...
'EnableTunerAGC', false,...
'TunerGain', rtlsdr_gain,...
'SampleRate', rtlsdr_fs, ...
'SamplesPerFrame', rtlsdr_frmlen,...
'OutputDataType', rtlsdr_datatype,...
'FrequencyCorrection', rtlsdr_ppm);

% fir decimator - fs = 2.4MHz downto 48kHz


obj_decmtr = dsp.FIRDecimator(...
'DecimationFactor', 50,...
'Numerator',
firpm(350,[0,15e3,48e3,(2.4e6/2)]/(2.4e6/2),...
[1 1 0 0], [1 1], 20));

end;

% iir de-emphasis filter


obj_deemph = dsp.IIRFilter(...
'Numerator', num,...
'Denominator', den);

% delay
obj_delay = dsp.Delay;

% audio output
obj_audio = dsp.AudioPlayer(audio_fs);

% spectrum analyzers
obj_spectrummod = dsp.SpectrumAnalyzer(...
'Name', 'Spectrum Analyzer Modulated',...
'Title', 'Spectrum Analyzer Modulated',...
'SpectrumType', 'Power density',...
'FrequencySpan', 'Full',...
'SampleRate', rtlsdr_fs);
obj_spectrumdemod = dsp.SpectrumAnalyzer(...
'Name', 'Spectrum Analyzer Demodulated',...
'Title', 'Spectrum Analyzer Demodulated',...
'SpectrumType', 'Power density',...
'FrequencySpan', 'Full',...
'SampleRate', audio_fs);

%% SIMULATION

% if using RTL-SDR, check first if RTL-SDR is active


if offline == 0
if ~isempty(sdrinfo(obj_rtlsdr.RadioAddress))
else
error(['RTL-SDR failure. Please check connection to
',...
'MATLAB using the "sdrinfo" command.']);
17

end
end

% reset run_time to 0 (secs)


run_time = 0;

% loop while run_time is less than sim_time


while run_time < sim_time

% fetch a frame from obj_rtlsdr (live or offline)


rtlsdr_data = step(obj_rtlsdr);

% update 'modulated' spectrum analyzer window with new data


step(obj_spectrummod, rtlsdr_data);

% implement frequency discriminator


discrim_delay = step(obj_delay,rtlsdr_data);
discrim_conj = conj(rtlsdr_data);
discrim_pd = discrim_delay.*discrim_conj;
discrim_arg = angle(discrim_pd);

% decimate + de-emphasis filter data


data_dec = step(obj_decmtr,discrim_arg);
data_deemph = step(obj_deemph,data_dec);

% update 'demodulated' spectrum analyzer window with new data


step(obj_spectrumdemod, data_deemph);
% output demodulated signal to speakers
step(obj_audio,data_deemph);

% update run_time after processing another frame


run_time = run_time + rtlsdr_frmtime;

end
end

Прежде чем детально анализировать алгоритм обработки, посмотрим,


насколько программа успешно декодирует сигналы наших FM радиостанций.
С заданными параметрами даже самая мощная станция плохо прослу-
шивается, но причина здесь не в обработке, а в недостаточном быстродей-
ствии компьютера автора. Отключение вычисления и отображения обоих
спектров (входного сигнала и демодулированного звука) или увеличение бу-
фера приема в 6 раз приводит к нормальному качеству. Однако это только
для двух, самых мощных станций, остальные станции, либо вообще не
слышны, либо немного слышны, но на фоне сильных помех.
Рассмотрим сам алгоритм обработки. Он достаточно простой. Принятые
с приемника комплексные отсчеты задерживаются на один временной такт
(при указанных параметрах, с учетом замечания в предыдущем абзаце, за
18

один раз принимается 38400 комплексных отсчетов, с интервалом


∆t = 1/(2.4МГц)= 0.417мкс). Для этого предварительно создается экземпляр
объекта dsp.Delay() и при обработке созданный объект вызывается ко-
мандой:
discrim_delay = step(obj_delay,rtlsdr_data).

Функция Delay()позволяет задавать величину задержки, по умолча-


нию сдвиг делается на один такт. Далее по принятому массиву создается
комплексно-сопряженный ему массив функцией conj()и производится
комплексное покоординатное умножение двух массивов (перед операцией
умножения стоит точка).
Рассмотрим, что при этом произойдет с сигналом, заданным формулой
1.1:

 tk

sобраб (t k ) = A0 exp j ( 2πf c t k + 2πK fm ∫ si (τ ) dτ )  ×

 
 −∞ 
 t k −1

A0 exp − j ( 2πf c t k −1 + 2πK fm ∫ si (τ ) dτ )  =
 (1.2)
 
 −∞ 
 tk

A0 exp j ( 2πf c ∆t + 2πK fm ∫ si (τ ) dτ ) .
2 
 
 t k −1 
Отметим, прежде всего, что несущая радиочастота f c оставлена здесь
только как величина рассогласования частот передатчика и приемника. По-
сле приема сигнала на частоте радиостанции сигнал смещается на нулевую
частоту, как это видно по спектру сигнала на рисунке 4. Первое слагаемое
под экспонентой в итоговой части формулы 2 является константой, причем
очень маленькой и может не учитываться. Поскольку амплитуда звука на ин-
тервале квантования ∆ t изменяется на ничтожную величину, интеграл во
tk

втором слагаемом ∫ si (τ )dτ ) = si (t k )∆t и окончательно на этом этапе


t k −1
обработки мы имеем сигнал:

sобраб (t k ) ≈ A02 exp( j 2πK fm si (t k )∆t ).


19

Фаза этого сигнала и есть наш исходный звук с некоторым коэффици-


ентом усиления и очень высокой частотой квантования. Поэтому на следую-
щем шаге функцией angle()в программе извлекается искомая фаза. В
большинстве случаев для оцифровки звука используется частота квантования
48 кГц. При выбранных параметрах нам надо снизить частоту квантования в
50 раз (2.4 МГц/48 кГц). Обработку по снижению частоты называют децима-
тором. Обычно его объединяют с фильтрацией сигнала.

1.3. Краткий обзор основ теории фильтрации сигналов


С учетом изучения теории фильтрации по другим дисциплинам, приве-
дем только самые основные сведения этой теории.
В радиотехнике в основном широкое применение нашли линейные
фильтры, для которых разработаны эффективные методы оптимизации их
характеристик. Линейные фильтры делятся на два основных класса — филь-
тры с конечной импульсной характеристикой (КИХ фильтры), в английской
терминологии filters with finite impulse response (FIR Filters). Преобразова-
ние входного сигнала x(t ) КИХ фильтром задается формулой:
P
y (n) = ∑ bi x (n − i ) , (1.3)
i =0

где P — порядок фильтра.


Второй класс фильтров, это фильтры с бесконечной импульсной харак-
теристикой (БИХ фильтры), в английской терминологии filters with infinite
impulse response (IIR Filters). Преобразование входного сигнала x(t ) БИХ
фильтром задается формулой:
P Q +1
y ( n) = ∑ bi x(n − i ) − ∑ a k y ( n − k ) , (1.4)
i =0 k =1

где P — по-прежнему порядок фильтра, Q — порядок обратной связи.


Как мы видим из названий функций и комментариев, в приведенной
программе обработки FM сигналов используются оба типа фильтров.
Подробно рассмотрим выбранный фильтр. Задается он при создании
объекта дециматор (obj_decmtr) функцией dsp.FIRDecimator() пер-
вым аргументом которого является DecimationFactor (во сколько раз
необходимо снизить частоту квантования, в нашем случае в 50 раз), вторым
аргументом является вектор коэффициентов КИХ фильтра. КИХ фильтр рас-
20

считывается функцией firpm(). Эта функция для синтеза фильтра исполь-


зует алгоритм Паркс-Макклеллана (Parks-McClellan algorithm). Данный ме-
тод синтеза фильтров основан на алгоритме замены Ремеза и теории аппрок-
симации Чебышева. Его суть состоит в итерационном поиске фильтра, АЧХ
которого максимально точно совпадает с заданной АЧХ. Степень совпадения
в данном случае определяется максимальным (по модулю) отклонением АЧХ
фильтра от заданной АЧХ. Таким образом, здесь решается минимаксная оп-
тимизационная задача — минимизируется максимальное абсолютное откло-
нение АЧХ конструируемого и заданного фильтров. Фильтры, синтезирован-
ные таким методом, характеризуются равномерными пульсациями АЧХ, по-
этому их иногда называют фильтрами с равномерными пульсациями (equir-
ipple filters). Из-за равномерности пульсаций АЧХ импульсная характеристи-
ка синтезированного фильтра может резко обрываться по краям (в отличие от
фильтров, синтезированных с использованием окон, где края импульсной ха-
рактеристики всегда спадают плавно). Рассмотрим выбранные для синтеза
фильтра аргументы:
firpm(350,[0,15e3,48e3,(2.4e6/2)]/(2.4e6/2),…
[1 1 0 0],[1 1],20));

Первый параметр это порядок фильтра n , вторым аргументом функции


задается вектор частот f, нормированный на частоту Найквиста (половина
частоты квантования), с координатами из интервала [0;1], третий аргумент
— вектор a , содержащий значения желаемой АЧХ для частот из вектора f.
Причем, желаемая АЧХ на частотах между f(k) и f(k+1) при нечетном k
определяется линейной функцией, соединяющей точки (f(k),a(k)) и
(f(k+1),a(k+1)). Желаемая АЧХ на частотах между f(k) и f(k+1)
при четном k считается неопределенной. Эти полосы частот считаются пе-
реходными или неважными. Применительно к нашему случаю, в диапазоне
от нуля до частоты 15 кГц мы хотим иметь максимальный сигнал, без подав-
ления (обычный человек способен слышать звуковые колебания в диапазоне
частот от 16—20 Гц до 15—20 кГц), в диапазоне от 48 кГц до 1.2 МГц мы
хотим полного подавления сигналов. В диапазоне от 15 кГц до 48 кГц — как
получится. Далее для значащих диапазонов указываются весовые коэффици-
енты, в соответствии с которыми обеспечивается приближение к желаемому
АЧХ в каждом диапазоне. Последний аргумент должен быть целым числом и
задает степень приближения к равномерной пульсации. Минимальное значе-
ние 16. Функция возвращает n + 1 симметричных комплексных коэффициен-
тов фильтра, модуль которых графически изображен на рисунке 1.4:
21

Рис. 1.4. Коэффициенты фильтра Паркс-Макклеллана


Построим также амплитудно-частотную характеристику (АЧХ) приме-
няемого фильтра. Работу нам облегчит функция freqz(), которая по задан-
ным коэффициентам фильтра вычисляет его АЧХ в 512 значениях частот
равномерно расположенных в заданном диапазоне:
[h1,f]=freqz(numIn,1,[],2);
figure
plot(f,20*log10(abs(h1)));

Здесь numIn — коэффициенты фильтра, второй аргумент задает мак-


симальное значение АЧХ (1 означает, что АЧХ нормировано на свой макси-
мум), четвертый аргумент является коэффициентом растяжения частотной
оси (значение 2 соответствует нормализованной частоте).
22

Рис. 1.5. АЧХ фильтра Паркс-Макклеллана


Как видим из графика АЧХ, фильтр подавляет сигналы с частотой выше
48 кГц более чем на 80 дБ. Это очень хорошее подавление. Рассмотрим более
подробно вершину АЧХ. Для этого построим график АЧХ в диапазоне 0 - 48
кГц в реальных частотах (рис.1.6):

Рис. 1.6. Вершина АЧХ фильтра Паркс-Макклеллана


23

Как видим, хотя было заказано отсутствие подавления только в диапа-


зоне 0 - 15 кГц, реально до частоты 21 кГц (там, где мы еще что-то можем
слышать), подавление не превышает 1 дБ. Напомним еще раз, что снижение
частоты и рассмотренный КИХ фильтр применяются к фазе принятого сиг-
нала после частотного дискриминатора.
Полученный сигнал с частотой квантования 48 кГц, наиболее часто ис-
пользуемой для оцифровки звуковых сигналов, проходит еще одну фильтра-
цию, но теперь уже применяется БИХ фильтр Баттерворда низких частот
(Low-pass Butterworth IIR filter). Характеристики фильтра различаются часто-
той среза для FM радиостанций Европы и США:
if deemph_region == 'eu' % find de-emphasis filter coeff
[num,den] = butter(1,3183.1/(audio_fs/2));
elseif deemph_region == 'us'
[num,den] = butter(1,2122.1/(audio_fs/2));

Построим АЧХ предложенного фильтра для Европейского стандарта


(рис 1.7):
[h1,f]=freqz(num,den);
nf=length(f);
f1=f*audio_fs/2/pi;
q1=20*log10(abs(h1));
figure
plot(f1,q1);
title('АЧХ БИХ фильтра Баттерворда: ф-я freqz()');
xlabel('Реальная частота');
ylabel('Отклик фильтра (дБ)');
grid on

Рис. 1.7. АЧХ БИХ фильтра Баттерворда 1-го порядка


24

Обратим внимание, что используется простейший фильтр 1-го порядка


(количество обоих типов коэффициентов фильтра при этом равно 2 в соот-
ветствии с формулой 4), поэтому на частоте среза мы уже имеем подавление
около 3 дБ. С той же частотой среза АЧХ фильтр 6-го порядка этого недо-
статка не имеет (рис.1.8):

Рис. 1.8. АЧХ БИХ фильтра Баттерворда 6-го порядка

Для проверки и для более детального изучения фильтра Баттерворда по-


строим его АЧХ самостоятельно. Для этого будем подавать на вход фильтра
гармонический сигнал на различных частотах, и смотреть спектр сигнала на
выходе фильтра:

% Собственное построение АЧХ фильтра:


Fs=audio_fs;
dt=1/Fs;
T=dt*1023; % время генерации в с
t=0:dt:T;

L=length(t);
NFFT = 2^nextpow2(L); % количество фильтров БПФ
dFFT=Fs/NFFT; % Расстановка фильтров БПФ (Гц):
f0=0:dFFT:Fs-dFFT; % разметка частотной оси
for i=1:nf
Fc=f1(i);
OMc=2*pi*Fc;
dataIn = exp(1i*OMc*t);
dataOut = filter(num,den,dataIn);
25

% Амплитудный спектр входного сигнала:


FIn=fft(dataIn,NFFT);
FmodIn=20*log10(abs(FIn)/max(abs(FIn)));
% Амплитудный спектр выходного сигнала:
FOut=fft(dataOut,NFFT);
FmodOut=20*log10(abs(FOut)/max(abs(FIn)));
figure
plot(f0,FmodIn,f0,FmodOut);
grid on

[AmaxIn,fmax]=max(abs(FIn));
AmaxOut=abs(FOut(fmax));
q(i)=20*log10(AmaxOut/AmaxIn);
end
figure
plot(f1,q1,f1,q);
title('АЧХ БИХ фильтра Баттерворда');
xlabel('Реальная частота');
ylabel('Отклик фильтра (дБ)');
legend('Ф-я freqz() Matlab','Cпектр анализатор');

Например, при частоте 3 кГц спектр гармонического сигнала на входе и


выходе нашего фильтра Баттерворда выглядит следующим образом
(рис.1.9):

Рис. 1.9. Прохождение гармонического сигнала


через фильтр Баттерворда
26

Уровень боковых лепестков значительно повышается. Поскольку мы ге-


нерируем идеальный сигнал, разница в уровне боковых лепестков составляет
около 250 дБ (превышение амплитуды одного сигнала над другим по ампли-
туде в 2*1013 раз!). Понятно, что для реальных сигналов такого быть не мо-
жет. Частота 3000 Гц точно соответствует настройке 65 фильтра БПФ. Сме-
щение частоты сигнала от центра фильтра всего на 0.1 Гц уже дает совсем
другую спектральную картину (рис.1.10):

Рис. 1.10. Прохождение смещенного гармонического сигнала


через фильтр Баттерворда

Теперь мы видим разницу примерно в 40 дБ, поскольку на наблюдаемый


спектр влияют боковые лепестки фильтров БПФ. Более реальную картину мы
увидим, если наложим на гармонический сигнал белый шум с отношением
сигнал/помеха 12 дБ (рис.1.11):
27

Рис. 1.11. Прохождение зашумленного гармонического сигнала


через фильтр Баттерворда

Как видим, наш фильтр Баттерворда реально подавляет шумы после ча-
стоты среза. Естественно, максимальное подавление в окрестности частоты
Найквиста (24 кГц) и составляет около 25 дБ, хотя по АЧХ (рис. 1.7) подав-
ление на этой частоте свыше 60 дБ. Объясняется разница различным про-
хождением через фильтр Баттерворда гармонического сигнала и нормального
белого шума.
В заключении отметим, что АЧХ фильтра, построенная сравнением
спектров гармонического сигнала до и после прохождения фильтра Баттер-
ворда, полностью совпадает с АЧХ построенной функцией
freqz()(используются результаты теоретических расчетов), причем АЧХ
не зависит от наложения разумного уровня помех (рис.1.12):
28

Рис. 1.12. Сравнение теоретического и экспериментального


АЧХ фильтра Баттерворда

Что касается оптимальности применяемого фильтра Баттерворда, мы по-


стараемся ответить на этот вопрос после реализации цифровой модели FM
сигнала и при анализе сигналов реальных FM радиостанций.

1.4. Цифровая модель сигналов FM радиостанций.


Моделировать мы будем выходной сигнал RTL-SDR на частоте 2.4 МГц.
Звуковой сигнал будем брать с любого файла, в котором звук записан со
стандартной частотой квантования 48кГц, поэтому первым делом придется
интерполировать его на частоту приемника. Поскольку соседние отсчеты
звука при частоте дискретизации 48 кГц меняются незначительно, достаточ-
но использовать линейную аппроксимацию. В основной цикл приема инфор-
мации с RTL_SDR вставим следующий текст:
model=1;
noise=1;
snr=-4; % отношение сигнал/помеха (signal/noise ratio) в дБ
ks=0;
Fc = 0e3; % Отклонение несущей частоты приемника
% и передатчика (Гц)
dev = 250; % Девиация частоты при частотной модуляции (Гц)
t_rtl = [0:rtlsdr_frmlen-1]'/rtlsdr_fs; % Вектор моментов
% времени для частоты квантования приемника
29

Krtl_s = rtlsdr_fs/audio_fs;
n_s=rtlsdr_frmlen/Krtl_s+1; % количество отсчетов звука на ин-
тервале rtlsdr_frmlen
dt_rtl=1/rtlsdr_fs; % дискрет квантования приемника
dt_s=1/audio_fs; % дискрет квантования звука
t=0:dt_rtl:dt_s;
OMc=2*pi*Fc;
FIs=2*pi*dev;
Ki= 1525;
N1=rtlsdr_frmlen;
sigma=10^(-snr/20)/sqrt(2);

if model == 0
% Получить реальные данные с RTL-SDR:
rtlsdr_data = step(obj_rtlsdr);
else
% Прочитать данные из аудио файла:
samples = [ks*n_s+1,(ks+1)*n_s];
x = audioread('music3_mono48kHz.wav',samples);
ks=ks+1;

% Перевод звука на частоту квантования rtlsdr_fs линейной


% аппроксимацией амплитуд:
for i=1:n_s-1
dx=(x(i+1)-x(i))/dt_s;
for j=1:Krtl_s
x_rtl((i-1)*Krtl_s+j)=x(i)+dx*t(j);
end
end
end

Как уже указывалось (формула 1.1), для модуляции частоты в FM сигна-


лах используется не сам звуковой сигнал, а его интеграл. При цифровом мо-
делировании интеграл заменяют на кумулятивную сумму:
int_x = cumsum(x_rtl)/Ki;
rtlsdr_data = exp(1i*(OMc*t_rtl - FIs*int_x'));
% Наложение помехи:
if noise
gaussnoise=(randn(N1,1)+1i*randn(N1,1))*sigma;
rtlsdr_data = rtlsdr_data+gaussnoise;
end

Кумулятивную сумму вычисляет функция cumsum(), которая возвра-


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

Прослушивание декодированного звука показывает, что он хорошо со-


ответствует исходному звуку. Также можно их нанести на один график
(рис.1.13):

Рис. 1.13. Сравнение исходного звука со звуком, извлеченным


из модели FM-сигнала

Мы видим, что по амплитуде колебаний исходный и декодированный


звуки практически совпадают, что говорит о правильном подборе коэффици-
ента усиления Ki. Интересно, что изменение знака перед кумулятивной
суммой приводит к изменению знака колебаний звука (на восприятие звука
это не влияет) (рис.1.14):
31

Рис. 1.14. Сравнение исходного звука со звуком, декодированным


из модели FM-сигнала с измененным знаком интеграла

Видно, что декодированный звук немного отстает во времени. Для даль-


нейших целей при отображении необходимо провести соответствующую
синхронизацию:
Nsd=5; % Сдвиг демодулированного звука в модели
% относительно исходного звука
if Fplot
Nn=1; % Начальная точка на отображение
dN=n_s-1-Nn; % количество точек на отображение
Nk=Nn+dN-Nsd;
tgr=Nn:Nk;
if model
plot(tgr,x(Nn:Nk),tgr,data_deemph(Nn+Nsd:Nk+Nsd));
legend('sound','decsound');
end
pause(1);
end
Пауза в 1 секунду сделана для возможности просмотра графика.
Для идеального подбора сдвига будем вычислять СКО (среднеквадрати-
ческое отклонение) разницы демодулированного звука от исходного:

if model
n1=length(data_deemph);
D(m)=var(data_deemph(1+Nsd:n1)-x(1:n1-Nsd));
m=m+1;
32

if m == 500
SKO=mean(D)^0.5;
fprintf(Nsd=%d, Ki=%d, md=%.3f\n',Nsd,Ki,md*1e3);
break;
end
end

В каждом такте получения порции информации с SDR-RTL вычисляется


дисперсия отклонения и усреднением дисперсии по заданному количеству
порций вычисляется СКО.
Вычисление СКО при нескольких сдвигах дает следующий результат:
Nsd=4, Ki=305, СКО=0.041
Nsd=5, Ki=305, СКО=0.026
Nsd=6, Ki=305, СКО=0.030

Откуда следует, что декодированный звук задержан на пять 48-ми кило-


герцовых отсчетов. При компенсации сдвига декодированный и исходный
звуки практически совпадают (рис.1.15):

Рис. 1.15. Исходный звук и звук, извлеченный из модели


FM-сигнала после временной синхронизации

Отметим, что в реальности вначале было подобрано смещение и затем,


опять же по СКО, подобран коэффициент усиления Ki.
33

Кратко рассмотрим влияние на демодуляцию звука нормального белого


шума. Зависимость СКО отклонения от отношения сигнал/помеха следую-
щая:
snr=6.0, СКО=0.026
snr=4.0, СКО=0.030
snr=0.0, СКО=0.066

Уже при 6 дБ отношения сигнал/помеха качество декодированного зву-


ка соответствует исходному звуку. При 4 дБ слышны помехи, которые на ам-
плитудном графике выглядят так (рис.1.16):

Рис. 1.16. Исходный и демодулированный звук при воздействии


белого шума с отношением с/п 4 дБ

При отношении сигнал/помеха 0 дБ записанную музыку еще можно


слушать, но с серьезными шумами (рис.1.17):
34

Рис. 1.17. Исходный и демодулированный звук при воздействии


белого шума с отношением с/п 0 дБ

Отметим, что мы измеряем отношение сигнал/помеха на выходе прием-


ника во всей полосе пропускания 2.4 МГц, поэтому и получили небольшие
значения. После обработки сигнала, отношение сигнал/помеха по пику сиг-
нала в собственной полосе 250 кГц для реальных FM радиостанций обычно
варьируется в диапазоне 35-45 дБ, как это видно на рисунке 1.2.
Рассмотрим теперь влияние на качество звука наличия разницы в часто-
тах FM станции и приемника. Установка значительного смещения в 700 кГц
(с таким разделением уже могут работать соседние радиостанции, например,
Kiss FM и Наше радио) совершенно не изменяет измеряемое нами СКО.
Правда, декодированный звук при этом смещается на заметную константу
вниз (рис.1.18):
35

Рис. 1.18. Смещение амплитуды моделируемого звука


при смещении по частоте
Это смещение не отражается на восприятии звука и может быть легко
устранено следующей процедурой:
data_deemph=data_deemph-mean(data_deemph);

Обнаруженное свойство нашего простого алгоритма говорит о его очень


большом недостатке, а именно почти полном отсутствии избирательности. В
этом легко убедится и по сигналам реальных FM радиостанций. На частоте
Нашего радио 102.8 МГц мы продолжаем слышать более мощную станцию
Kiss FM, работающую на частоте 102.1 МГц! Причем декодированный звук
тоже смещен относительно нуля (правда, в положительную строну)
(рис.1.19):
36

Рис. 1.19. Смещение амплитуды реальной FM-станции


при приеме на смещенной частоте.

Заметьте, что величина смещения по модели и по реальной FM радио-


станции примерно одинаковая (~1.85) и отличается только знаком.

1.5. Совершенствование некогерентного дискриминантного


алгоритма обработки FM сигналов
Теперь, когда у нас есть инструмент для изучения влияния различных
методов обработки FM сигналов на качество декодируемого звука, мы можем
приступить к совершенствованию предложенного нам алгоритма.
Прежде всего, сигнал с выхода приемника должен пройти фильтрацию в
полосе принятой для FM сигналов (250 кГц) и, соответственно, при этом ча-
стоту квантования снижают до 240 кГц. Например, такая обработка предла-
гается при стерео приеме FM сигналов в уже знакомой нам книге [2]
(рис.1.20):
37

Рис. 1.20. Схема стерео приема FM радиостанций


Обратите внимание, что в рассматриваемой нами программе предусмот-
рен вариант чтения значений амплитуд в квадратурных каналах из файла, в
который запись проведена с частотой дискретизации 240 кГц.
Рассмотрим три варианта КИХ фильтров – с окном Хемминга, Кайзера,
и уже знакомый нам фильтр, синтезируемый алгоритмом Паркс-
Макклеллана.
Для создания фильтра с окном Хемминга можно использовать функ-
цию fir1(n,W), в которой это окно используется по умолчанию. Функция
предназначена для конструирования фильтров заданного порядка низких и
высоких частот, полосных и многополосных фильтров.
В качестве начального приближения рассмотрим фильтр Хемминга от-
носительно невысокого порядка со следующими параметрами:
n = 45; % порядок фильтра Хемминга
Df=125e3; % половина полосы FM сигналов
W=Df/(rtlsdr_fs/2);
numIn=fir1(n,W); % Окно Хемминга

Фильтр с окном Кайзера более универсальный и задается следующим


образом:
Df=125e3; % половина полосы FM сигналов
fcuts = [Df Df+Df/5]/(rtlsdr_fs/2);
mags = [1 0];
devs = [0.05 0.03];
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs);
numIn = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');

Порядок фильтра не указывается, а вычисляется исходя из заданных


требований к характеристикам фильтра. Срез задается частотой, после кото-
рой необходимо начать подавление и частотой, после которой необходимо
обеспечить максимальное подавление. Как всегда, частоты должны быть
38

нормированы на частоту Найквиста. В векторе mags указывается уровень


амплитуд на интервале пропуска и подавления сигнала. В нашем случае мы
даем фильтру 25 кГц для выхода на максимальное подавление. В векторе
devs указывается в долях степень приближения к заданным амплитудам.
Для заданных параметров порядок фильтра равен 215.
C фильтром Паркс-Макклеллана мы уже знакомы, используем его со
следующими параметрами:
numIn = firpm(300,[0,Df,Df+Df/5,rtlsdr_fs/2]/(rtlsdr_fs/2),...
[1 1 0 0], [1 1], 20);

Порядок фильтра равен 300, и требуем выхода на максимальное подав-


ление за те же 25 кГц, что и в фильтре Кайзера.
АЧХ предложенных фильтров, нанесенные на один график выглядят
следующим образом (рис.1.21, 1.22):

Рис. 1.21 . АЧХ фильтров Хемминга, Кайзера и Паркс-Макклелана


в полосе 1.2 МГц
39

Рис. 1.22 . АЧХ фильтров Хемминга, Кайзера и Паркс-Макклелана


в полосе 200 кГц
Фильтры Кайзера, Паркс-Макклеллана с большим порядком обеспечи-
вают практически вертикальный срез и немного отличаются уровнем боко-
вых лепестков. У фильтра Кайзера они начинаются на уровне -40 дБ и посте-
пенно опускаются до -70 дБ, в то время как у фильтра Паркс-Макклеллана
они сразу выходят на постоянный уровень -58 дБ. У фильтра Хемминга с су-
щественно меньшим порядком, уровень боковых лепестков практически та-
кой же, но значительно более пологий основной лепесток (потери на частоте
среза достигают 6 дБ, а боковые лепестки начинаются с частоты ~ 220 кГц).
Дальнейшую обработку, следуя авторам исследуемой программы, сдела-
ем такой же, как обработку сигнала, записанного в файл с частотой кванто-
вания 240 кГц. КИХ дециматор, применяемый к фазе сигнала примем с пара-
метрами:
obj_decmtr = dsp.FIRDecimator(...
'DecimationFactor', 5,'Numerator',...
firpm(100,[0,15e3,20e3,(240e3/2)]/(240e3/2),...
[1 1 0 0], [1 1], 20));

Уменьшился порядок фильтра Паркс-Макклеллана с 350 до 100, полное


подавление высоких частот начинается с 20 кГц вместо 48 кГц и, естествен-
40

но, фактор децимации равен 240/48=5. АЧХ такого фильтра выглядит так
(рис.1.23):

Рис. 1.23 . АЧХ фильтра Паркс-Макклелана 100-го порядка


в полосе 120 кГц
Как видим, начиная с 20 кГц обеспечивается подавление около 40 дБ.
Теперь оценим, как отразились наши доработки на качество приема сиг-
налов реальных FM станций. Результаты помещены в таблицу 1.2. За 10 бал-
лов принято качество звука, обеспечиваемое программой SDRSharp. Три ко-
лонки в графе с КИХ децимацией соответствуют рассмотренным нами вари-
антам фильтрации (таблица 1.2):
41

Таблица 1.2
КИХ децимация до
Частота FM Обработка на
№ п/п Fs=240 кГц
станции (МГц) Fs=2.4 МГц
1 2 3
1 99.2 3 10 10 10
2 102.1 9 10 10 10
3 102.8 0 7 7 7
4 103.3 0 1 1 1
5 104.1 0 10 10 10
6 105.1 0 9 9 9
7 106.4 0 10 10 10
8 107.8 5 10 10 10

Доработки существенно улучшили возможности прослушивания FM ра-


диостанций. Если в исходном варианте программы комфортно прослушива-
лась одна радиостанция и еще две с трудом, то после предварительной филь-
трации и снижения частоты квантования с 2.4 МГц до 240 кГц хорошая слы-
шимость обеспечивается на 6 радиостанциях, еще одна прослушивается удо-
влетворительно и только одна по-прежнему практически не прослушивается.
Понятно, что на слух уловить разницу между вариантами КИХ фильтров не
удается.
Для более тонкого изучения влияния различных элементов обработки
введем в рассмотренную модель FM сигналов два сигнала с разницей в ча-
стотах в 700 кГц, имитируя ситуацию с Kiss FM и Нашим Радио, когда прием
сигнала нужно обеспечить с одной радиостанции на фоне другой мощной
радиостанции, расположенной рядом по частоте. Оба сигнала будем адди-
тивно смешивать между собой и с генерируемой нормальной помехой. Ам-
плитуду второго сигнала зададим параметром A1, в отличие от первого сиг-
нала, амплитуду которого мы приняли единичной. Обеспечиваемое отноше-
ние сигнал/помеха во всей полосе приема для второго сигнала будет вычис-
ляться по формуле snr1=snr+20*lg(A1). Для анализа будем использо-
вать мелодии различного жанра, которые обеспечивают более широкое ис-
пользование звукового диапазона по сравнению с речью.
42

СКО разницы демодулированного звука и исходного приведено в табли-


це 1.3. Превышение мешающего сигнала на частоте -700 кГц над прослуши-
ваемым составляет 20 дБ (A1=10) (таблица 1.3):
Таблица 1.3

Фильтр
snr snr1
(дБ) (дБ) Паркс-
Хемминга Кайзера
Макклеллана
20 40 0.026617 0.027171 0.025297
6 26 0.026738 0.027277 0.025425
0 20 0.027151 0.027717 0.025866
-4 16 0.030004 0.034175 0.033216

Если за критерий качества фильтра взять величину обратную СКО и за


100% взять фильтр Паркс-Макклеллана, получим более удобную таблицу для
анализа (таблица 1.4):
Таблица 1.4

Фильтр
snr snr1
(дБ) (дБ) Паркс-
Хемминга Кайзера
Макклеллана
20 40 95% 93% 100%
6 26 95% 93% 100%
0 20 95% 93% 100%
-4 16 111% 97% 100%

Таким образом, во всем диапазоне отношения сигнал/помеха, которое


обеспечивает комфортное прослушивание музыкального контента (0-20 дБ),
фильтр Паркс-Макклеллана оказался лучшим. Фильтр Хемминга с относи-
тельно небольшим порядком уступает ему 5%, а фильтр Кайзера 7%. Для
слабых сигналов фильтр Хемминга оказывается лучшим, однако слушать му-
зыку и даже речь с большими хрипами вряд ли сейчас кто-то захочет (в со-
ветское время в коротковолновом диапазоне запрещенные «голоса» так и
приходилось слушать).
43

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


ми привело к еще большему подчеркиванию преимущества фильтра Паркс-
Макклеллана (таблица 1.5):
Таблица 1.5

Фильтр
snr snr1
(дБ) (дБ) Паркс-
Хемминга Кайзера
Макклеллана
20 40 68% 65% 100%
6 26 69% 65% 100%
0 20 71% 68% 100%
-4 16 104% 88% 100%

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


СКО по 500 порциям принятой информации (рис.1.24):

Рис. 1. 24 . СКО разницы демодулированного звука и исходного для филь-


тров Кайзера и Паркс-Макклелана

Отметим что, как и в случае реального приема, без децимации мы демо-


дулируем звук на частоте 700 кГц.
44

В заключение приведем временную реализацию исходного звука, в ко-


тором наблюдаются колебания не ниже 48 кГц, которые для человеческого
слуха абсолютно недоступны (рис. 1.25). Возможно, такие ультразвуки изда-
ют некоторые музыкальные инструменты, возможно, это просто сбои. На
графике хорошо видно, как предложенный алгоритм обработки FM сигналов
их полностью устраняет (рис. 1.25):

Рис. 1. 25 . Устранение высокочастотного шума


при улучшенной обработке

1.6. Задания для лабораторных, курсовых работ


и дипломных проектов
В MATLAB создать модель FM радиосигналов и канал обработки не ко-
герентного дискриминантного алгоритма для выделения моно сигнала. В ка-
честве модулирующего звука использовать любую запись моно звука в фор-
мате WAV с частотой квантования 48 кГц.
Вариант № 1.
Исследовать влияние на качество демодулируемого звука порядка филь-
тра Чебышева, используемого при снижении частоты квантования с 2.4 МГц
до 240 кГц для нескольких значений отношения сигнал/помеха. Найденное
45

оптимальное значение порядка фильтра испытать при приеме реальных FM


радиостанций приемником RTL-SDR, привести для фильтра график АЧХ.

Вариант № 2.
Исследовать влияние на качество демодулируемого звука частоты среза
фильтра Чебышева, используемого при снижении частоты квантования с 2.4
МГц до 240 кГц для нескольких значений отношения сигнал/помеха.
Найденное оптимальное значение частоты среза испытать при приеме реаль-
ных FM радиостанций приемником RTL-SDR, привести для фильтра график
АЧХ.

Вариант № 3.
Исследовать влияние на качество демодулируемого звука частоты среза
фильтра Кайзера, используемого при снижении частоты квантования с 2.4
МГц до 240 кГц для нескольких значений отношения сигнал/помеха.
Найденное оптимальное значение частоты среза испытать при приеме реаль-
ных FM радиостанций приемником RTL-SDR, привести для фильтра график
АЧХ.

Вариант № 4.
Исследовать влияние на качество демодулируемого звука частоты выхо-
да на полное подавление фильтра Кайзера, используемого при снижении ча-
стоты квантования с 2.4 МГц до 240 кГц для нескольких значений отношения
сигнал/помеха. Привести зависимость порядка фильтра от указанной часто-
ты. Найденное оптимальное значение указанной частоты испытать при прие-
ме реальных FM радиостанций приемником RTL-SDR, привести для фильтра
график АЧХ.

Вариант № 5.
Исследовать влияние на качество демодулируемого звука вектора devs
(в долях степень приближения к заданным амплитудам) фильтра Кайзера,
используемого при снижении частоты квантования с 2.4 МГц до 240 кГц для
нескольких значений отношения сигнал/помеха. Привести зависимость по-
рядка фильтра от значений вектора. Найденное оптимальное значение векто-
ра devs испытать при приеме реальных FM радиостанций приемником RTL-
SDR, привести для фильтра график АЧХ.
46

Вариант № 6.
Исследовать влияние на качество демодулируемого звука порядка филь-
тра Паркс-Макклеллана, используемого при снижении частоты квантования с
2.4 МГц до 240 кГц для нескольких значений отношения сигнал/помеха.
Найденное оптимальное значение порядка фильтра испытать при приеме ре-
альных FM радиостанций приемником RTL-SDR, привести для фильтра гра-
фик АЧХ.

Вариант № 7.
Исследовать влияние на качество демодулируемого звука частоты среза
фильтра Паркс-Макклеллана, используемого при снижении частоты кванто-
вания с 2.4 МГц до 240 кГц для нескольких значений отношения сиг-
нал/помеха. Найденное оптимальное значение частоты среза испытать при
приеме реальных FM радиостанций приемником RTL-SDR, привести для
фильтра график АЧХ.

Вариант № 8.
Исследовать влияние на качество демодулируемого звука частоты выхо-
да на полное подавление фильтра Паркс-Макклеллана, используемого при
снижении частоты квантования с 2.4 МГц до 240 кГц для нескольких значе-
ний отношения сигнал/помеха. Найденное оптимальное значение указанной
частоты испытать при приеме реальных FM радиостанций приемником RTL-
SDR, привести для фильтра график АЧХ.

Вариант № 9.
Исследовать влияние на качество демодулируемого звука степень при-
ближения к равномерной пульсации фильтра Паркс-Макклеллана, использу-
емого при снижении частоты квантования с 2.4 МГц до 240 кГц для несколь-
ких значений отношения сигнал/помеха. Найденное оптимальное значение
степени приближения испытать при приеме реальных FM радиостанций при-
емником RTL-SDR, привести для фильтра график АЧХ.

Вариант № 10.
Исследовать влияние на качество демодулируемого звука порядка филь-
тра Паркс-Макклеллана, используемого при снижении частоты квантования с
47

240 кГц до 48 кГц для нескольких значений отношения сигнал/помеха.


Найденное оптимальное значение порядка фильтра испытать при приеме ре-
альных FM радиостанций приемником RTL-SDR, привести для фильтра гра-
фик АЧХ.

Вариант № 11.
Исследовать влияние на качество демодулируемого звука частоты среза
фильтра Паркс-Макклеллана, используемого при снижении частоты кванто-
вания с 240 кГц до 48 кГц для нескольких значений отношения сиг-
нал/помеха. Найденное оптимальное значение частоты среза испытать при
приеме реальных FM радиостанций приемником RTL-SDR, привести для
фильтра график АЧХ.

Вариант № 12.
Исследовать влияние на качество демодулируемого звука частоты выхо-
да на полное подавление фильтра Паркс-Макклеллана, используемого при
снижении частоты квантования с 240 кГц до 48 кГц для нескольких значений
отношения сигнал/помеха. Найденное оптимальное значение указанной ча-
стоты испытать при приеме реальных FM радиостанций приемником RTL-
SDR, привести для фильтра график АЧХ.

Вариант № 13.
Исследовать влияние на качество демодулируемого звука степень при-
ближения к равномерной пульсации фильтра Паркс-Макклеллана, использу-
емого при снижении частоты квантования с 240 кГц до 48 кГц для несколь-
ких значений отношения сигнал/помеха. Найденное оптимальное значение
степени приближения испытать при приеме реальных FM радиостанций при-
емником RTL-SDR, привести для фильтра график АЧХ.

Вариант № 14.
Исследовать влияние на качество демодулируемого звука порядка БИХ
фильтра Баттерворда, используемого для фильтрации звука на частоте 48 кГц
для нескольких значений отношения сигнал/помеха. Найденное оптимальное
значение порядка фильтра испытать при приеме реальных FM радиостанций
приемником RTL-SDR, привести для фильтра график АЧХ.
48

Вариант № 15.
Исследовать влияние на качество демодулируемого звука частоты среза
БИХ фильтра Баттерворда, используемого для фильтрации звука на частоте
48 кГц для нескольких значений отношения сигнал/помеха. Найденное оп-
тимальное значение частоты среза испытать при приеме реальных FM радио-
станций приемником RTL-SDR, привести для фильтра график АЧХ.
49

2. ОТСЛЕЖИВАНИЕ ТРАЕКТОРИЙ ПОЛЕТА


ВОЗДУШНЫХ СУДОВ
2.1. Общая информация о методах передачи сообщений
воздушными судами
В настоящее время для наблюдения движения воздушных судов с хоро-
шей точностью (около 30 м по местоположению) используется технология
ADS-B – (automatic dependent surveillance-broadcast, в примерном переводе на
русский язык: автоматическое зависимое наблюдение-вещание).
Вне зависимости от поступления запроса от наземного радара, несколь-
ко раз в секунду самолетом передается короткое или расширенное сообще-
ние (вместо термина «сообщение» используется также термин «сквиттер» —
«squitter»).
Информация всегда передается на частоте 1090 МГц с использованием
амплитудной модуляции. Время передачи одного информационного бита со-
ставляет 1 мкс. Одна посылка состоит из 56 или 112 бит данных. Посылка
начинается с синхроимпульса (преамбулы) длительностью 8 мкс и затем сле-
дует информационная часть. Значение бита «0» передается отсутствием из-
лучения на первой половине микросекунды и наличием его во второй поло-
вине, значение бита «1» — наоборот, наличием в первой половине и отсут-
ствием сигнала во второй половине. Общая схема передачи приведена на ри-
сунке 2.1:

Рис. 2.1. Общая схема передачи сообщения в технологии ADS-B

56 бит короткого сообщения распределяются следующим образом: 5 бит


— номер формата затем идут 27 информационных бит, эти 32 бита закрыва-
ются 24 битным кодом CRC (рис. 2.2):
50

Рис. 2.2. Структура короткого сообщения

Длинное сообщение отличается от короткого тем, что информационных


бит становится 83 (рис. 2.3).

Рис. 2.3. Структура длинного сообщения

Перечисленные параметры передачи информации относятся к режиму


Mode-S (режимы Mode-A и Mode-C используются для связи с наземными
службами).

2.2. Структура передаваемых сообщений


Наиболее полное описание передаваемой информации приведено в [3,4].
Для длинного сообщения номер формата (Downlink Format - DF) равен 10001
в двоичном представлении, для короткого — 01011. В десятичном представ-
лении DF=17 и DF=11. Следующие 3 бита несут дополнительную информа-
цию, смысл которой может меняться в зависимости от конкретной системы и
равны обычно 101 или 111. Таким образом, 8 бит полного формата могут
быть равны либо 8D или 8F в шестнадцатеричном представлении для длин-
ного сообщения и 5D или 5F — для короткого.
Короткое сообщение содержит только номер судна в соответствии с ре-
гистрацией ICAO (International Civil Aviation Organization - Международная
организация гражданской авиации), который передается сразу за форматом
(биты 9-32, соответственно полубайты 3-8). Номер ICAO в документах все-
гда записывается в 16-ричном виде.
В длинном сообщении номер ICAO передается на этих же позициях, но
структура сообщения значительно сложнее. Оно может содержать информа-
51

цию о расположении судна относительно поверхности земли или скоростные


характеристики борта или номер рейса. Высота полета выдается как по баро-
метру, так и по данным GNSS (Global Navigation Satellite Systems). Все сооб-
щение можно поделить на 5 информационных групп (таблица 2.1):
Таблица 2.1
Номера Коли-
Условное
битов со- чество Передаваемая информация
обозначение
общения бит
Формат типа связи (Downlink format,
1-5 5 DF
для Mode-S 10001 або 01011))
6-8 3 CA (Capability - additional identifier)
Номер борта по регистрации ICAO
9-32 24 ICAO
(ICAO aircraft address)
33-88 56 DATA Данные (Data)
89-112 24 PI Код CRC-24 (Parity/Interrogator ID)

Для определения типа сообщения используются биты с 33 по 37 (9-ый


полубайт и старший бит 10-го полубайта), соответствие значений которых
конкретным типам сообщений задается таблицей 2.2:
Таблица 2.2
Значение битов
Поступающая информация
с 33 по 37
От 00001 до 00100 Номер рейса (Flight identification)

От 00101 до 01000 Нет описания (Surface position)


Географические координаты и высота по барометру
От 01001 до 10010 (Airborne position - w/Baro Altitude)

10011 Скоростные характеристики (Airborne velocities)


Географические координаты и высота по данным
От 10100 до 10110 GNSS (Airborne position - w/GNSS Height)

От 10111 до 11111 Резерв для других нужд (Reserved for other uses)

В библиотеке файлов уже отмечавшейся книги [2] приведена с откры-


тым кодом программа ADSBAirplaneTrackingwithRTLSDR, которая позво-
52

ляет получать и декодировать сообщения от пролетающих воздушных суден


в радиусе до 100 км. Зону приема бортовых сигналов в Николаеве ежедневно
пересекает более 2 десятков воздушных суден.
Подробно рассмотрим, каким образом передается номер рейса на при-
мере сообщения, выданного 27 апреля 2017 года:
Time = 19:30:36
Decoded Message = 8D4BB84623407534CB7820 (код СRС удален)
AircraftID = 4BB846
FlightID = PGT427

Видим, что номер ICAO присутствует в явном виде. Начиная с 33 раз-


ряда в двоичном виде сообщение выглядит следующим образом:
00100 011 010000 000111 010100 110100 110010 110111 100000 100000

Видим, что передается номер рейса. Далее следуют 3 бита несущие ин-
формацию о типе борта (тяжелый, большой, маленький, легкий, планер и т.д.,
расшифровка в [2] отсутствует). Остальные биты разбиваются по 6 и несут
информацию в соответствии со следующей кодировкой литеров:
Латинские литеры A – Z десятичный код 1 – 26, цифры 0 - 9: код 48 –
57, пробел – код 32.
В десятичном виде шестерки бит имеют значения:
16 7 20 52 50 55 32 32, что соответствует номеру рейса
PGT427.
Отметим, что по обоим номерам сайт flightradar24.com выдает допол-
нительную информацию о воздушном судне и рейсе. Ввод номера рейса
PGT427 позволяет узнать, что это рейс турецкой авиакомпании Pegasus Air-
lines Харьков — Стамбул, который значится теперь под номером PC427 (ви-
димо произошел переход на новую нумерацию рейсов, но бортовые передат-
чики остались на старой нумерации) (рис. 2.4):
53

Рис. 2.4. Соответствие номера рейса передаваемого в режиме Mode-S


номеру рейса в расписании полетов

Также можно узнать информацию о предстоящих и ранее выполненных


полетах по этому рейсу (рис. 2.5):

Рис. 2.5. Расписание полетов по рейсу PGT427 (PC427)

После ввода номера борта узнаем, что судно летает из Турции в различ-
ные города мира (рис. 2.6):
54

Рис. 2.6. Расписание полетов борта 4BB846 (TC-NBF)

Также можно увидеть траекторию полета рейса при получении сооб-


щений. Видно, что полет проходил очень близко над Николаевым (рис. 2.7):

Рис. 2.7. Маршрут полета рейса PGT427 27 апреля 2017 года


55

2.3. Информация о местоположении воздушного судна


Информация о местоположении воздушного судна в сообщениях ADS-B
кодируется в формате Compact Position Reporting (CPR - компактный формат
передачи местоположения). Цель CPR заключается в том, чтобы кодировать
большее число знаков в географических координатах, используя меньшее ко-
личество бит. Представляется, что сейчас жесткая экономия бит не актуаль-
на, но так исторически сложилось.
Основная идея CPR заключается в разбиении земной поверхности на зо-
ны и передаче номера зоны вместо географических координат. Количество
зон по широте от экватора до полюса NZ=15 для режима Mode-S. Количество
зон по долготе NL зависит от широты (lat) и задается формулой:

(2.1)

Количество зон по долготе меняется от 1 для полярных широт и до 59


для экваториальных широт.
Расположение информации в режиме передачи координат определяется
таблицей 2.3:
Таблица 2.3
Номера Коли-
Условное
битов со- чество Передаваемая информация
обозначение
общения бит
1-5 5 DF Формат типа связи (Downlink format,
для ADS-B 10001 или 10010)
33-37 5 TC Тип сообщения
38-39 2 SS Статус отслеживания состояния (Sur-
veillance status)
40 1 NICsb Точность оценки местоположения
(Navigation Integrity Category - NIC
supplement B)
41-52 12 ALT Высота (Altitude)
53 1 T Время (Time)
56

Номера Коли-
Условное
битов со- чество Передаваемая информация
обозначение
общения бит
54 1 F Четность сообщения в CPR формате
(CPR odd/even frame flag)
55-71 17 LAT-CPR Широта в CPR-формате (Latitude in
CPR format)
72-88 17 LON-CPR Долгота в CPR-формате (Longitude in
CPR format)

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


ческим координатам оно генерирует два сообщения – четное и нечетное. В
дальнейшем, зная предыдущее местоположение судна, информацию о гео-
графических координатах можно извлекать из каждого сообщения.
Вначале рассмотрим глобальную привязку судна к географическим ко-
ординатам.
1. Полученные данные LatcprEven , LatcprOdd , LoncprEven , LoncprOdd
переводятся в формат с плавающей точкой и нормируются на 2^17;
2. Вычисляется индекс широты:

3. Вычисляется относительная широта:

,
где использованы две константы

.
4. Для обеспечения принадлежности широты диапазону [-900, 900] при
необходимости нужно скорректировать вычисленные значения:
57

5. В качестве окончательного значения широты используется более


позднее сообщение:

6. Необходимо вычислить номера зон по долготе для обоих значений


широты NL ( Lat Even ) и NL ( Lat Odd ) по формуле 2.1. Если они
разные, то вычисление глобальной долготы не возможно и надо
ждать следующей пары сообщений.
7. При совпадении номеров зон по долготе для четного и нечетного со-
общения можно приступать к вычислению глобальной долготы:
Если время четного сообщения больше времени нечетного сообще-
ния, то вычисления следующие:

В противном случае:

8. В заключение корректируем значения долготы превышающие


1800:

.
Информация о высоте судна над уровнем моря поступает в том же со-
общении, что и географические координаты и вычислить по ней значение
58

высоты достаточно просто. Вычисления не зависят от четности сообщения и


всегда приводятся в футах. В поступивших данных содержится информация
о точности измерения высоты на судне. Эту информацию несет 48-ой, так
называемый Q-бит, если его значение равно 0, то дискретность высоты discr
равна 100, иначе 25. Q бит необходимо удалить и полученное значение N пе-
ресчитать в футы:
Alt=N∗discr−1000 (футов).

В соответствии с приведенной формулой и количеством разрядов, несу-


щих информацию о высоте полета (11 бит), диапазон высот, который может
быть закодирован, составляет от -1000 до (2^11-1)*25-1000=50175
футов или от -305 до 15293 метров для Q бита=1.
Локальная привязка судна к географическим координатам предполагает
знание опорной точки, в окрестности которой заведомо находится судно. Это
могут быть данные корректно полученные из предыдущих сообщений или
данные о местонахождении приемной антенны. При этом может быть ис-
пользовано сообщение с любой четностью.
1. Вычислить широту:

,
где

Lat ref , Lonref — широта и долгота опорной точки.

2. Вычислить долготу:

,
где
59

2.4. Информация о скорости воздушного судна


В соответствии с таблицей 2.2. тип сообщения, содержащего скоростные
характеристики судна, равен 10011 или 19 в десятичном виде. Эти сообщения
могут быть 4 подтипов, при подтипе 1 и 2 передается скорость относительно
Земли (surface velocity or ground speed), при подтипе 3 и 4 передается Воз-
душная скорость (airspeed). Причем подтипы 2 и 4 предназначены для сверх-
звуковых самолетов и их структурой в ближайшее время можно не интересо-
ваться. В [2] отмечается, что сообщения 3-го подтипа составляют всего 0.3%
от сообщений 1-го типа. Подтип передается в битах 38-40. Размещение мно-
гочисленных составляющих вектора скорости для подтипа 1 приведены в
таблице 2.4:

Таблица 2.4
Номера Коли-
Условное
битов со- чество Передаваемая информация
обозначение
общения бит
33-37 5 TC Тип сообщения (Type code)
38-40 3 SТ Подтип сообщения (Subtype)
Флаг изменения намерения (Intent
41 1 IC
change flag)
42 1 RESV_A Резерв (Reserved-A)
Неопределенность скорости (Velocity
43-45 3 NAC
uncertainty - NAC)
Знак скорости в направлении Восток-
46 1 S_ew
Запад (East-West velocity sign)
Скорость в направлении Восток-Запад
47-56 10 V_ew
(East-West velocity)
Знак скорости в направлении Север-
57 1 S_ns
Юг (North-South velocity sign)
Скорость в направлении Север-Юг
58-67 10 V_ns
(North-South velocity)
60

Номера Коли-
Условное
битов со- чество Передаваемая информация
обозначение
общения бит
Метод получения вертикальной ско-
68 1 VrSrc
рости (Vertical rate source)
Знак вертикальной скорости (Vertical
69 1 S_vr
rate sign)
70-78 9 Vr Вертикальная скорость (Vertical rate)
79-80 2 RESV_B Резерв (Reserved-B)
Отличие от данных по барометру, знак
81 1 S_Dif
(Diff from baro alt, sign)
Отличие от данных по барометру (Diff
82-88 7 Dif
from baro alt)

Из приведенной таблицы мы видим, что вектор скорости разложен на


компоненты Север-Юг и Восток-Запад. Знак скорости S_ns =1 означает по-
лет с Севера на Юг, S_ns=0 — полет с Юга на Север, аналогично, S_ew=1
— полет с Востока на Запад, S_ew=0 — полет с Запада на Восток.
Вычисление вектора горизонтальной скорости осуществляется по сле-
дующим формулам:

Скорость измеряется в узлах (1 узел = 1,852 км/час), направление скоро-


сти h — в градусах, arctan2( ) — известная функция, реализованная во мно-
гих программных средах [5].
61

Вертикальную скорость принято мерить в футах/минуту, и она связана с


принятым значением простой формулой:
Vr (футов / мин) = (Vrbits − 1) ⋅ 64
Если S_vr=1 судно увеличивает высоту полета, иначе — уменьшает.
Разряд VrSrc определяет метод измерения вертикальной скорости, если
VrSrc=1, то скорость получена измерениями геометрической высоты, иначе
— измерениями высоты по барометру.
В случае если скорость относительно Земли недоступна, в сообщениях
борта передается Воздушная скорость. Подтип сообщения, как отмечалось
выше, при этом равен 3. Размещение составляющих этой скорости во многом
аналогичны подтипу 1 и приведены в таблице 2.5:
Таблица 2.5
Номера Коли-
Условное
битов со- чество Передаваемая информация
обозначение
общения бит
33-37 5 TC Тип сообщения (Type code)
38-40 3 SТ Подтип сообщения (Subtype)
Флаг изменения намерения (Intent
41 1 IC
change flag)
42 1 RESV_A Резерв (Reserved-A)
Неопределенность скорости (Velocity
43-45 3 NAC
uncertainty - NAC)
Статус направления полета (Heading
46 1 S_hdg
status)
Направление полета – пропорция
47-56 10 Hdg
(Heading - proportion)
Тип воздушной скорости (Airspeed
57 1 AS-t
Type)
58-67 10 AS Воздушная скорость (Airspeed)
Метод получения вертикальной ско-
68 1 VrSrc
рости (Vertical rate source)
Знак вертикальной скорости (Vertical
69 1 S_vr
rate sign)
62

Номера Коли-
Условное
битов со- чество Передаваемая информация
обозначение
общения бит
70-78 9 Vr Вертикальная скорость (Vertical rate)
79-80 2 RESV_B Резерв (Reserved-B)
Отличие от данных по барометру, знак
81 1 S_Dif
(Diff from baro alt, sign)
Отличие от данных по барометру (Diff
82-88 7 Dif
from baro alt)

Разряд S_hdg=1 показывает доступность данных по направлению поле-


та и их можно перевести в градусы по формуле:

Воздушная скорость может быть двух типов: индикаторная (Indicated


airspeed - IAS), считываемая непосредственно с индикатора, и истинная (true
airspeed - TAS), относительно воздушных масс вокруг самолета. При AS-t=0
передается индикаторная скорость. Значение скорости в узлах получается
простым переводом в десятичную систему 10 бит значения AS.
Вычисление вертикальной скорости остается таким же, как и для подти-
па 1.
В заключение раздела отметим, что в сообщении также доступна точ-
ность измерения параметров движения самолета. Для этого используются
службы навигационной системы GPS:
• NIC - Navigation Integrity Category — целостность кода навигации;
• NAC - Navigation Accuracy Category — точность кода навигации.
Например, в данных о местоположения судна в таблице 2.3 есть разряд
NICsb, который вместе с типом сообщения TC показывает точность измере-
ний в метрах (таблица 2.6):
63

Таблица 2.6
ТС NICsb Ошибка измерения (м), не более
9 0 7.5
10 0 25
1 74
11
0 185
12 0 370
1* 556
13 0 925
1** 1111
14 0 1852
15 0 3704
1 7408
16
0 14800
17 0 37000
18 0 Более 37 км или неизвестна

* NIC Supplement-A = 0
** NIC Supplement-A = 1
В таблице используется дополнительная информация о разряде NIC
Supplement-A, который вместе с разрядом NIC Supplement-С передается при
TC=31 (таблица 2.2— строка «Резерв для других нужд»), такое сообщение
получило название «Сообщение об эксплуатационном статусе самолета»
(Aircraft Operational Status Message). К сожалению, в [3,4] структура такого
сообщения не приведена.

2.5. Алгоритм обнаружения бортовых сигналов воздушных суден


После детального рассмотрения методов передачи и кодирования ин-
формации в сообщениях, мы можем перейти к наиболее интересной части
раздела, а именно к рассмотрению алгоритма обнаружения таких сигналов по
выходу приемника RTL-SDR.
64

Как уже отмечалось во вводной части раздела, в приложении к книге [2]


приведена программа с открытым кодом
ADSBAirplaneTrackingwithRTLSDR, которая решает поставленную задачу
(авторские права на программу принадлежат корпорации MathWorks).
Рассмотрим, прежде всего, какие программа устанавливает параметры
на приемник:
%% PARAMETERS (edit)
% идентификатор устройства (stick ID):
rtlsdr_id = '0';
% Рабочая частота приемника в Гц (tuner center frequency in Hz):
rtlsdr_fc = 1090e6;
% Усиление приемника в дБ (tuner gain in dB):
rtlsdr_gain = 60;
% Частота квантования входного сигнала – тактовая частота (tuner
sampling rate), максимальное значение 3.2e6
rtlsdr_fs = 2.4e6;
% Корректировка частоты (tuner parts per million correction):
rtlsdr_ppm = 0;
% Размер запрашиваемого за 1 раз объема входной информации —
фрейма(output data frame size):
rtlsdr_frmlen = 2^18;
% Формат выходных квадратур (output data type single) - аналог
float (4 байта):
rtlsdr_datatype = 'single';

Как отмечалось выше, частота излучения сигналов для всех самолетов


равна 1090 МГц. Следующий очень важный параметр — это частота кванто-
вания входных сигналов. В штатных системах приема бортовых сообщений
ADSB используется частота квантования 12 МГц, которая обеспечивает по-
лучение 12 отсчетов на длительности передачи 1 бита. У нас же установлена
частота квантования 2.4 МГц, это соответствует 2.4 отсчета на бит. Во-
первых, дробное количество отсчетов приведет к неодинаковому количеству
отсчетов на бит (2 или 3 отсчета). Во-вторых, это заведомо мало. Однако
возможности увеличения частоты для данной модели RTL–SDR ограничены
величиной 3.2 МГц, причем предупреждается, что при превышении частоты
квантования 2.8 МГц возможны потери отсчетов. Конечно, есть приемники
позволяющие снимать информацию с более высокой частотой квантования,
например, приемник BladeRF - the USB 3.0 Super speed Software Defined Ra-
dio корректно работает до частоты 40 МГц. Однако его стоимость составляет
от $420 до $650, тогда как простейшие RTL-SDR доступны по цене около
$20. В рассматриваемой программе после приема информации ее интерполи-
руют на ту же стандартно принятую частоту 12 МГц. Интерполяцию, без-
условно, невозможно сделать без ощутимой потери качества алгоритма. Эти
потери в дальнейшем будут оценены. Длина фрейма (размер запрашиваемого
за 1 раз объема входной информации) достаточно велик и составляет 262144
65

комплексных отсчетов. Один комплексный отсчет занимает 8 байт в прием-


ном буфере. Как отмечалось во введении к методическим рекомендациям,
Принятые от АЦП приемника RTL-SDR 8 битные значения квадратур пре-
образуются в тип single — переменную с плавающей запятой и занимающую
4 байта на каждую квадратуру. Таким образом, один фрейм занимает 2048 Кб
во входном буфере. Время его формирования составляет около 0.109 с.
Программа ADSBAirplaneTrackingwithRTLSDR достаточно объемная.
Текст программы размещен в 18 файлах и содержит около 50 функций. Со-
стоит она из трех основных частей. В первой части по обнаруженному сигна-
лу формируется сообщение в 16-ричном виде, во второй части из него извле-
каются параметры полета и третья часть обеспечивает текстовое и графиче-
ское отображение полученных данных.
Наиболее интересна, естественно первая часть, поскольку оптималь-
ность алгоритмов обнаружения реальных сигналов всегда может быть по-
ставлена под сомнение и предложены усовершенствования алгоритма, улуч-
шающие его характеристики обнаружения. Связано это с тем, что оптималь-
ные алгоритмы обнаружения удается синтезировать для очень узкого класса
вероятностных распределений полезного сигнала и воздействующих на него
помех. Еще более существенно, что любая предложенная статистическая мо-
дель сигналов и помех никогда не будет полностью адекватной реальности.
Для подробного анализа предложенного алгоритма выделения бортовых
сигналов ADSB, перепишем его в виде одного модуля с минимальными из-
менениями самого алгоритма:
function ReceiveAirplaneInf
%% PARAMETERS (edit)
rtlsdr_id = '0'; % stick ID
rtlsdr_fc = 1090e6; % tuner centre
frequency in Hz %1.6570293e9; 623.225e6
rtlsdr_gain = 60; % tuner gain in
dB
rtlsdr_fs = 2.4e6; % tuner sampling
rate, max 3.2e6
rtlsdr_ppm = 0; % tuner parts
per million correction
rtlsdr_frmlen = 2^18; % output data
frame size (multiple of 5)
rtlsdr_datatype = 'single'; % output data
type single - аналог float (4 байта)
ADCRate=rtlsdr_fs;
%% SYSTEM OBJECTS (do not edit)

RealInf=0; % признак приема входной информации 0 - из файла, 1 -


RTL-SDR
% link to a physical rtl-sdr
if RealInf
66

obj_rtlsdr = comm.SDRRTLReceiver(...
rtlsdr_id,...
'CenterFrequency', rtlsdr_fc,...
'EnableTunerAGC', false,...
'TunerGain', rtlsdr_gain,...
'SampleRate', rtlsdr_fs, ...
'SamplesPerFrame', rtlsdr_frmlen,...
'OutputDataType', rtlsdr_datatype,...
'FrequencyCorrection', rtlsdr_ppm);

% Проверяем активность RTL-SDR:


if isempty(sdrinfo(obj_rtlsdr.RadioAddress))
error(['RTL-SDR failure. Please check connection to ',...
'MATLAB using the "sdrinfo" command.']);
end
end

% Интерполяция:
interpolationFactor = 5;
hInterp = dsp.FIRInterpolator(interpolationFactor);
samplingRate = interpolationFactor*ADCRate;
searchThr = 5.0; % порог по амплитуде относительно среднего
уровня
% помех для поиска синхроимпульса

% Вычисляем время приема одного фрейма


% (calculate time for 1 frame of data):
rtlsdr_frmtime = rtlsdr_frmlen/rtlsdr_fs;

% set rec_time and reset run_time to 0 (secs):


rec_time = 3600; % время работы программы (с)
run_time = 0; % текущий счетчик времени работы (с)

dataDuration = 112e-6; % Длительность полного сообщения в секун-


дах (112 мкс)
% Параметры сигнала и обработки после интерполяции
% количество отсчетов полного сообщения (1344=112*12):
messageLength = dataDuration * samplingRate;
% отступ перед синхроимпульсом (5 мкс, 60 отсчетов):
samplesBeforeSyncPulse = round(samplingRate*5e-6);
% отступ после сообщения (10 мкс, 120 отсчетов):
samplesAfterMessage = round(samplingRate*10e-6);
% общая длина зоны поиска сигнала (1524 отсчета):
totalSegmentLength = samplesBefore-
SyncPulse+messageLength+samplesAfterMessage;
% индекс начала поиска во фрейме (61):
startIdx = samplesBeforeSyncPulse+1;
messageLength1 = messageLength + samplesAfterMessage - 1;

corrThreshold = 0.60; %0.68; % порог по коэффициенту корреляции


67

% синхроимпульс, привязанный к половине времени излучения


% одного бита (0.5 мкс - 6 отсчетов):
syncSeq = 2*([1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0])-1;
% половина времени излучения одного бита (0.5 мкс):
halfSymbolTime = 0.5e-6;
% количество отсчетов на половине времени излучения бита (6 от-
счетов):
samplesPerHalfSymbol = halfSymbolTime * samplingRate;
% синхроимпульс, привязанный к одному отсчету:
sync = rectpulse(syncSeq, samplesPerHalfSymbol);
% количество отсчетов на синхроимпульсе (96 отсчетов):
syncLength = length(sync);
% нормировочный коэффициент синхроимпульса:
syncNorm = norm(sync);
% интервал поиска синхроимпульса (180 отсчетов):
numSamples = 15*samplingRate*1e-6;
% индекс последнего отсчета от начала зоны поиска
% для вычисления корреляции с синхроимпульсом:
jEnd = numSamples-syncLength+1;
% массив для коэффициентов корреляции:
normCorr = zeros(jEnd,1);
longMessageLength = 112; %us - мкс
shortMessageLength = 56; %us - мкс
% количество отсчетов на бит (12) :
samplesToBit = samplingRate*1e-6;
% массив для хранения декодированных бит:
decodedBits = false(longMessageLength,1);

% шаблон сообщения в 16-ом виде:


rxMsg = '8D00000000000000000000000000';
% структура для декодированных параметров полета:
Data.ReceivedMessage = rxMsg;
Data.AircraftID = '';
Data.Speed = [];
Data.Direction = '';
Data.UpDownVelocity = [];
Data.Altitude = [];
Data.Latitude = [];
Data.Longitude = [];
Data.FlightID = '';
Data.CRC_OK = false;
Data.normCorr = 0;

messageTypeFlag.Detected = 0;
messageTypeFlag.Long = 0;
messageTypeFlag.Short = 0;
numMessageLong=0;
numMessageShort=0;

% путь к файлу с записью данных RTL-SDR:


68

fileID = fopen('d:\MatLab\RTL-SDR\AIRPLANES\20171123-
24\Frame20171124.bin');
% номер фрейма в записи:
nFrame=0;

% цикл до истечения времени работы программы


% (loop while run_time is less than rec_time)
while run_time < rec_time
% прием фрейма от RTL-SDR
% (fetch a frame from obj_rtlsdr):
tic
if RealInf
rawData = abs(step(obj_rtlsdr));
else
% чтение фрейма из файла:
[rawData,count]=fread(fileID,rtlsdr_frmlen,'single');
if count < rtlsdr_frmlen
fprintf('nFrame=%d, numMessageLong=%d,…
numMessageShort=%d\n',nFrame,…
numMessageLong,numMessageShort);
error('End of file!');
end
end

% интерполяция принятой информации фрейма:


capturedData = abs(step(hInterp,rawData));
% конечный индекс обработки внутри фрейма:
endIdx = length(capturedData) - messageLength1-1;

if mod(nFrame,100) == 0
fprintf('numMessageLong=%3d,numMessageShort=%3d\n',…
numMessageLong,numMessageShort);
end
nFrame=nFrame+1;

% Ищем амплитуды, превышающие средний уровень помех в


% заданное количество раз (установлено в 5 раз - 14 дБ)
% (Find values in the data set that stick up above the
% noise floor)
Athr= searchThr*mean(capturedData);
i=startIdx;
while i <= endIdx
if capturedData(i) >= Athr
% Отбираем амплитуды из зоны возможного
% присутствия сообщения:
msgSamples = capturedData(i - samplesBefore-
SyncPulse:...
i + messageLength1);
% Операция не влияет на коэффициент
корреляции normCorr!!!
% msgSamples = msgSamples - mean(msgSamples);
69

% Проверяем возможность присутствия синхроимпульса


% в первых 180 отсчетах отобранной информации -
% вычисление коэффициента корреляции
% (Check the first 180 samples to see if the sync
% pulse is present.
% Normalized correlation computation):
for j = 1:jEnd
msg = msgSamples(j:j+syncLength-1);
msg = msg - mean(msg);
num = sync*msg;
msgNorm = norm(msg);
den = syncNorm*msgNorm;
normCorr(j) = num/den;
end
if any(normCorr > corrThreshold)
[~,ind] = max(normCorr);
decodeIndex = ind+syncLength;
if decodeIndex > numSamples
decodeIndex = numSamples;
end

% От отсчета с максимальной корреляцией выбираем


% амплитуды на интервале длинного сообщения,
% отступив от синхроимпульса:
msgBuffer =
msgSamples(decodeIndex:decodeIndex+messageLength-1);
fprintf('normCorr=%.2f\n',normCorr(ind));

% Извлечение битовой информации – «1» кодируется 6


% отсчетами (0.5 мкс) со включенным сигналом и
% затем 6 отсчетами с выключенным сигналом,
% «0» - наоборот (Bit «1» is represented with 1/2
% usec ON and 1/2 usec OFF,
% while bit «0» is vise versa.
k1=0;
for k = 1:samplesToBit:messageLength
k1=k1+1;
if sum(msgBuffer(k:k+5)) <
sum(msgBuffer(k+6:k+11))
decodedBits(k1) = false;
else
decodedBits(k1) = true;
end
end

% Объединение полученных данных по 4 бита и перевод


% в десятичный и 16-ый виды:
c = reshape(decodedBits,4,numel(decodedBits)/4);
d = bin2dec(num2str(c'));
rxBytes = dec2hex(d)';
70

fprintf('AllMessage=%s\n',rxBytes);

msgType = 0;
Data.CRC_OK=false;
messageTypeFlag.Detected = 0;
messageTypeFlag.Long = 0;
messageTypeFlag.Short = 0;
% Проверка кода CRC в предположении получения
% длинного сообщения:
[decodedBits,err] = crc24f(decodedBits);
if err == 0
msgType = 1;
messageTypeFlag.Long = 1;
numMessageLong = numMessageLong+1;
rxBytes = rxBytes(1:22);
else % если код CRC не совпал, проверяем гипотезу
% о получении короткого сообщения:
[decodedBits,err] = crc24f(decodedBits(1:
shortMessageLength));
if err == 0
msgType = 2;
messageTypeFlag.Short = 1;
numMessageShort = numMessageShort+1;
rxBytes = rxBytes(1:8);
end
end
decodeIndexInFrame=i-samplesBeforeSyncPulse
+decodeIndex;
fprintf('nFrame=%d, decodeIndexInFrame=%d\n',
nFrame,decodeIndexInFrame);
fprintf('msgType=%d\n',msgType);
if msgType == 1 || msgType == 2
messageTypeFlag.Detected = 1;
Data.ReceivedMessage = rxBytes;
Data.AircraftID = rxBytes(3:8);
Data.CRC_OK=true;
Data.normCorr =normCorr(ind);
adsbLogDataToFile1(Data);
i=i+totalSegmentLength-1;
end
i=i+jEnd+1;
end % if any(normCorr > corrThreshold)
end % if capturedData(i) >= Athr
i=i+1;
end % if i <= endIdx
toc
% update run_time after processing another frame
run_time = run_time + rtlsdr_frmtime;

end
71

end

% Функция для проверки кода CRC:


function [y,err] = crc24f(m)

persistent hcrc;
if isempty(hcrc)
g=logical([1 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1]);
gflip = fliplr(g);
hcrc = comm.CRCDetector(gflip);
end

reset(hcrc);
[y,err] = step(hcrc,m);
end

Обратим внимание, прежде всего на то, что информация с выхода при-


емника сразу же пропускается через квадратичный детектор (комплексные
2 2
отсчеты z = x + jy заменяются на амплитуды abs( z ) = x + y ). Де-
тектирование сигнала в самом начале обработки не является бесспорной. Во
многих системах обнаружения сигналов с известной модуляцией (в нашем
случае необходимо обнаружить синхроимпульс) проводят корреляционную
обработку в квадратурах. Для рассматриваемых сигналов целесообразность
квадратичного детектирования на входе требует отдельного исследования.
В программе проведена доработка, позволяющая проводить запись ам-
плитуд фреймов, в которых произошло превышение порога по корреляции с
синхроимпульсом, соответственно, в приведенной программе есть возмож-
ность получать амплитуды из файла. Безусловно, для анализа алгоритма при-
ема бортовых сообщений эта возможность абсолютно необходима. Обратите
внимание, что запись производится после детектирования, а не исходных
квадратур. Объем фрейма при этом уменьшается в 2 раза и составляет 1024
КБ.
Амплитуды на выходе квадратичного детектора поступают на интерпо-
ляцию для повышения частоты квантования с 2.4 МГц до 12 МГц, т.е. между
каждыми двумя отсчетами вставляются еще 4 вычисленных отсчета. Зани-
мается этим довольно интересная функция dsp.FIRInterpolator().
Дополнительные отсчеты строятся на базе реконструкционного или восста-
навливающего КИХ-фильтра (reconstruction or anti-imaging FIR-filter). При
подаче на вход интерполятора обычной синусоиды мы получаем небольшое
смещение во времени, сжатие сигнала по амплитуде (коэффициент сжатия в
данном случае совпадает с фактором интерполяции равном 5) и небольшие
высокочастотные биения (рис. 2.8):
72

Рис. 2.8. Результат интерполяции гармонического сигала

При интерполяции реального сигнала мы видим похожую картину (ри-


сунки 2.9, 2.10):

Рис. 2.9. Результат интерполяции реального сигнала (выборка 1)


73

Рис. 2.10. Результат интерполяции реального сигнала (выборка 2)

При интерполяции возникает задержка выходного сигнала относитель-


но входного примерно на 7 отсчетов (на графиках эта задержка убрана, сиг-
налы также приведены к одному масштабу амплитуды). Видим, что на ин-
тервалах постоянства исходного сигнала интерполяция проводится колеба-
тельным процессом. Ясно, что попытка угадать промежуточные значения
входного модулированного сигнала (сигнал постоянно гасится на половине
длительности передачи одного бита) заранее обречена на серьезные ошибки.
Тем не менее, алгоритм, построенный на такой интерполяции, дает вполне
удовлетворительные характеристики обнаружения бортовых сообщений.
Естественно, возникает вопрос об эффективности других вариантов интерпо-
ляции, например, гораздо более простой линейной интерполяции или интер-
поляции неизвестных значений ближайшим измеренным значением сигнала.
Как уже указывалось выше и пояснено в комментариях к тексту про-
граммы, после интерполяции мы имеем частоту квантования 12 МГц, коли-
чество отсчетов во фрейме равно 1310720, на интервале 1 мкс передачи одно-
го бита мы имеем 12 отсчетов. Изображенная графически информация фрей-
ма выглядит, например, так (рисунки 2.11-2.13):
74

Рис. 2.11. Один из фреймов сеанса за 13.07.2017 года

Рис. 2.12. Один из фреймов сеанса за 22.11.2017 года


75

Рис. 2.13. Один из фреймов сеанса за 24.11.2017 года

На графиках фреймов красной вертикальной линией отмечено начало


бортового сигнала, который был успешно декодирован (совпал код CRC).
Как видим, наши сигналы по амплитуде не слишком примечательны, уровень
помех резко не равномерный. Невозможно сказать, какова природа мощных
сигналов, которые мы наблюдаем на графиках. Возможно, это тоже сигналы
ADS-B того же борта, сигал которого достоверно присутствует, других бор-
тов или каких то других систем.
Обнаружение бортовых сигналов, как мы видим из текста программы,
начинается с выделения отсчетов, превышающих средний помеховый фон на
14 дБ — вычисляется средний уровень амплитуды по всему фрейму и отби-
раются отсчеты, амплитуда которых не менее чем в 5 раз превышает среднее
значение (параметр searchThr). Безусловно, оптимальность выбранного
значения параметра searchThr требует исследования. Для таких отсчетов
формируется зона возможного присутствия сигнала с отступом на
samplesBeforeSyncPulse=60 отсчетов перед выбранным отсчетом и на
samplesAfterMessage=120 отсчетов после ожидаемого длинного сооб-
щения. Количество отсчетов в расширенной зоне 1524 (длина синхроимпуль-
са 96 отсчетов, в длинном сообщении 1248 отсчетов). Для первых 85 отсче-
тов этой зоны вычисляется стандартный выборочный коэффициент корреля-
76

ции с известным синхроимпульсом. Излученный и реально принятые син-


хроимпульсы выглядит так (рисунки 2.13-2.15):

Рис. 2.14. Излученный и реально принятые синхроимпульсы


в сеансе за 24.11.2017 года (фрейм 1, коэффициент
корреляции=0.64, сообщение декодировано)

Рис. 2.15. Излученный и реально принятые синхроимпульсы


в сеансе за 24.11.2017 года (фрейм 2, коэффициент
корреляции=0.67, сообщение декодировано)
77

Рис. 2.16. Излученный и реально принятые синхроимпульсы


в сеансе за 24.11.2017 года (фрейм 3, коэффициент
корреляции=0.68, сбой по CRC)

Видим, что принятые синхроимпульсы достаточно сильно искажены


(обычно, коэффициент корреляции не превосходит 0.7). Является ли изобра-
женный на рисунке 2.16 сигнал синхроимпульсом или это случайное совпа-
дение — ответить трудно. Отметим, что целесообразность обнаружения син-
хроимпульса по коэффициенту корреляции не является очевидной. Во мно-
гих системах вместо вычисления коэффициента корреляции используют
свертку принятого сигнала с опорным импульсом, и как отмечалось выше,
свертка проводится отдельно в каждом квадратурном канале.
В рассматриваемом алгоритме, если максимальный среди вычисленных
коэффициентов корреляции превосходит заданный порог
corrThreshold=0.68, то этот отсчет принимается за начало синхроим-
пульса и проводится выделение битов на интервале длинного сообщения.
Формируется «1», если сумма первых 6 отсчетов превосходит сумму следу-
ющих 6 отсчетов, в противном случае формируется «0». Нулевые и единич-
ные биты на принятой информации выглядят так (рис. 2.17):
78

Рис. 2.17. Кодировка первых четырех бит одного из сообщений


в сеансе за 24.11.2017 года

На рисунке 2.17 синим цветом изображены первые 48 отсчетов принято-


го бортового сигнала, следующие непосредственно за синхроимпульсом. Ло-
маная кривая соответствует средним значениям, вычисленным по 6 отсчетам.
Цвет линии красный, если среднее значение на первых 6 отсчетах больше
среднего значения на следующих 6 отсчетах (передана «1») и зеленый, если
наоборот (передан «0»). Видим, что передана комбинация бит «1000», что
соответствует цифре «8». Все сообщение декодировано как
«8D50824A90A572F3A95B3ABC02DB» с совпадением кода CRC (последние
6 символов).
Еще раз отметим, что независимо от длины переданного сообщения, оно
декодируется как длинное. Сообщение переводится в 16-ный вид и проверя-
ется код CRC, если он совпал, то гарантируется принятие длинного сообще-
ния, если же не совпал, то принятые символы обрезаются до 56 бит (14 сим-
волов) и проверяется гипотеза о получении короткого сообщения новым вы-
числением кода CRC. Для проверки кода CRC используется функция
crc24f(), реализующая 24 битный CRC на базе универсальной функции
comm.CRCDetector().
Подчеркнем основополагающую роль кода CRC в обеспечении работо-
способности рассматриваемой и всех других систем передачи информации.
79

Вероятность случайного совпадения 24 битного кода CRC, независимо от


1 −8
длины защищаемого сообщения, равна 24
≈ 6 ⋅ 10 , что практически га-
2
рантирует безошибочное декодирование всех сообщений. Реально эта веро-
ятность еще ниже, поскольку для совпадения кода CRC необходимо полное
изменение передаваемой информации (BER — bit error ratio около 0.5). По-
нятно, что реальные системы передачи информации с таким BER не работа-
ют. Автор участвовал в создании систем связи, в частности на базе КВ ра-
диостанций [5], и даже для 16 битного CRC быть свидетелем сбойного блока
информации, для которого код CRC не детектировал ошибку, не довелось.
Однако рассматриваемая система существенно отличается от систем не-
прерывной передачи больших объемов информации. Код CRC приходится
считать и по помеховой ситуации, для которой коэффициент корреляции
превысил порог, причем доля таких ситуаций велика. Например, в сеансе за
12.01.2018 года доля вычисленных коэффициентов корреляции, превосходя-
щих порог 0.68 (значение установлено в штатной программе), но код CRC
детектировал ошибку, составляет около 75%. Тем самым можно утверждать,
что предварительное обнаружение синхроимпульса не существенно снижает
приведенное значение вероятности случайного совпадения кода CRC. Автору
показалось, что такое случайное совпадение кода CRC на реальной информа-
ции системы ADS-B удалось зафиксировать. По записи информации сеанса
за 24.11.2017 года была запущена программа, вычисляющая код CRC по от-
счетам фрейма, превышающим ранее заданный порог, независимо от корре-
ляции с синхроимпульсом. В одном из фреймов было обнаружено короткое
сообщение с правильным кодом CRC:
Time = 16:45:56
CRC OK = 1.000000
Decoded Message = BAA10495
AircraftID = A10495

Как уже указывалось во введении к разделу, в режиме Mode-S короткие


сообщения обязаны начинаться с 5D или 5F. Проверка бортового номера на
www.flightradar24.com не слишком прояснила ситуацию:
80

Рис. 2.18. Ответ от flightradar24 на поиск бортового номера


в сообщении не соответствующем режиму Mode-S

Вероятность наличия случайного бортового номера в БД реальных са-


молетов составляет 0.03 (на flightradar24 заявлено, что в БД около 500000
самолетов, всего номеров 166). Эта вероятность не слишком большая, но и не
такая, чтобы удивляться, если событие произойдет. Все разрешилось чуть
позднее, когда было обнаружено, что сообщений с этим бортовым номером
на небольшом интервале времени 19 штук (в дальнейшем такие сообщения
были во множестве обнаружены во всех записях, начало сообщения «BA»
или «BE»). Понятно, что это полностью исключает случайное совпадение ко-
да CRC. Скорее всего, фиксируются сигналы самолетов малой или военной
авиации.

2.6. Обзор экспериментов по приему бортовых сигналов


Радиус приема сигналов воздушных суден на маленькую 15 см штыре-
вую антенну (рис. 1), как отмечалось выше, около 100 км. В связи с заметным
затуханием гигагерцовых волн в помещении, реальная зона приема со сто-
роны стен уменьшается. Часть экспериментов проводилось при подключении
приемника RTL-SDR к домашнему ПК автора с окном на Запад, часть — при
подключении к серверу в корпусе Института автоматики и электротехники с
окнами на Восток. В первом случае больше сообщений принималось от са-
молетов, пролетавших между Николаевом и Одессой, во втором случае —
между Николаевым и Херсоном. Ежесуточно в зоне контроля оказываются 2-
3 десятка самолетов. Для примера в таблице 2.7 приведены данные за сеанс
наблюдения 12-13 января 2018 года (дислокация приемника в учебном кор-
пусе) (таблица 2.7):
81

Таблица 2.7
Кол-во сооб- Путь за
№ борта Кол-во Номер
щений (рейс Первое Последнее Время Скорость время
№ п/п (AircraftID) наблю- рейса
прямой/ об- сообщение сообщение наблюдения (км/час) наблюдения
дений (FlightID)
ратный) (км)
1 740738 447 1 RJA177 12:43:25 12:51:19 0:07:54 817 108
2 508340 161 1 ANR5117 12:59:17 13:02:48 0:03:31 765 45
3 50818D 84 2 13:51:35 13:56:00 0:04:25
4 181 16:58:29 17:07:12 0:08:43
5 4B9065 523 1 PGT427 17:32:34 17:38:53 0:06:19 800 84
6 5081EE 7 1 AUI780 17:44:47 17:49:14 0:04:27
7 4B84E9 709 2 UJX251 15:50:28 15:59:36 0:09:08 835 127
8 561 UJX250 18:26:52 18:31:48 0:04:56 835 69
9 50839B 7 1 16:29:15 16:32:40 0:03:25 793 45
10 51407D 1 1 16:46:09 16:46:09 0:00:00 837 0
11 8990BF 9 1 18:37:55 18:40:48 0:02:53 883 42
12 4BAA7A 443 2 THY1475 18:58:58 19:04:10 0:05:12 817 71
13 125 THY1476 21:38:52 21:44:03 0:05:11 817 71
14 50816F 170 2 21:25:24 21:30:08 0:04:44 66
15 116 7:11:35 7:22:03 0:10:28 135
16 5082EA 260 2 22:14:59 22:18:19 0:03:20 837 47
17 132 3:41:38 3:47:25 0:05:47 837 81
18 4BB846 776 2 PGT432 0:00:49 0:09:02 0:08:13 828 113
82

Кол-во сооб- Путь за


№ борта Кол-во Номер
щений (рейс Первое Последнее Время Скорость время
№ п/п (AircraftID) наблю- рейса
прямой/ об- сообщение сообщение наблюдения (км/час) наблюдения
дений (FlightID)
ратный) (км)
19 616 PGT433 2:53:39 3:02:06 0:08:27 828 117
20 4B906C 820 1 PGT429 2:33:15 2:41:06 0:07:51 789 103
21 508371 10 1 6:27:33 6:30:37 0:03:04 800 41
22 508379 11 1 6:57:22 7:00:26 0:03:04 811 41
23 508279 1 1 7:23:30 7:23:30 0:00:00
24 5083C9 18 1 AUI722 7:24:19 7:28:05 0:03:46 785 49
25 508366 3 1 7:39:32 7:40:04 0:00:32 806 7
26 508395 27 1 7:48:50 7:50:26 0:01:36 798 21
Всего 6218 26
83

В таблице данные приведены только в соответствии с полученными со-


общениями, поэтому номера рейсов указаны не для всех самолетов. Они мо-
гут быть получены через сайт www.flightradar24.com по бортовому номеру и
времени полета. То же самое относится к скорости полета. От части самоле-
тов получены только короткие сообщения. В частности, это касается бортов
50818D и 50816F, которые являются представителями самолетов Embraer ERJ
145 — семейства региональных реактивных самолётов производ-
ства Embraer, Бразилия. Пассажиров всего 50, максимальная скорость 834
км/ч. Видимо, ихняя бортовая аппаратура устроена попроще, и такие пара-
метры, как географические координаты, скорость движения, направление по-
лета и другие параметры либо не измеряются, либо не включаются в сообще-
ния ADS-B.
Всего за неполные сутки наблюдения получено 6218 сообщений. Наибо-
лее длительный интервал наблюдения зафиксирован для борта 50816F, вы-
полнявшего рейс Киев-Херсон (4 минуты 44 секунды) и Херсон-Киев (10
минут 28 секунд). Данные по этим рейсам приведены на рисунках 2.19, 2.20:

Рис. 2.19. Данные flightradar24 о рейсе Киев-Херсон (борт 50816F)


84

Рис. 2.20. Данные flightradar24 о рейсе Херсон-Киев (борт 50816F)

Рекордная длительность наблюдения, видимо, связана с облетом Нико-


лаева с Юга и Запада. Взяв скорость полета 775 км/час (реальная скорость
неизвестна, максимальная скорость 834 км/час) получаем, что путь за время
наблюдения составил около 135 км.
Наибольшее количество сообщений (820) получено от борта 4B906C,
выполнявшего рейс PGT429 (PC429) Харьков-Стамбул. Данные по нему при-
ведены на рисунке 2.21:
85

Рис. 2.21. Данные flightradar24 о рейсе PGT429 (PC429) Харьков-Стамбул


(борт 4B906C)

Как видим, самолет действительно пролетел очень близко от Николаева.


Как указывалось выше, важнейшим параметром программы является
порог по коэффициенту корреляции corrThreshold, оптимальное значение
которого необходимо подобрать экспериментально. Действительно оказа-
лось, что значение 0.68, установленное авторами программы, не является оп-
тимальным. Все приведенные выше данные в реальном времени получены
при пороге 0.60 (получено 6218 сообщений). Воспроизведение записи ампли-
туд с порогом 0.68 позволило получить только 4767 сообщений, т.е. 1455 со-
общений были потеряны, что составляет 23.4%. Таким образом, для значи-
86

тельного числа сообщений c корректным кодом CRC коэффициент корреля-


ции с опорным синхроимпульсом находится в пределах 0.60-0.68. Дальней-
шее снижение порога по коэффициенту корреляции до значения 0.55 дает не-
значительный прирост количества принятых корректных сообщений. Так в
сеансе приема бортовых сигналов за 17-18.01.2018 года (время с 20:00:32 до
10:08:02) со значением corrThreshold = 0.55 было получено 6616 сооб-
щений. Обработка записи со значением corrThreshold = 0.60 позволило
выделить 6508 сообщений. Таким образом, указанное снижение порога при-
вело к увеличению количества сообщений на 108, или на 1.6%. Понятно, что
снижение рассматриваемого порога в среднем увеличивает объем вычисле-
ний. Для приведенной выше переписанной программы получены следующие
оценки времени работы. При пороге 0.68 среднее время обработки одного
фрейма, при заведомом присутствии хотя бы одного сигнала ADS-B, занима-
ет примерно 2.5 с (на ПК средней мощности), уменьшение порога до 0.60
увеличивает время счета до 3.5 с. Отсюда, прежде всего, следует, что в ре-
альном времени будут обрабатываться далеко не все фреймы. Несколько
неожиданно выяснилось, что штатная программа считает быстрее. Обработка
одного фрейма в реальном времени в среднем занимает около 0.2 с (порог
0.60). В этой же ситуации доработанная программа на фрейм в среднем тра-
тит около 2 с. При этом количество выделенных сообщений по одной и той
же информации примерно одинаково (по записи сеанса 12-13.01.2018 года
доработанной программой к 6218 обнаруженным в реальном времени сооб-
щениям добавлено всего 4 новых). Таким образом, требуют исследования 2
задачи. Найти причины, по которым доработанная программа работает на
порядок медленнее, и изучить возможность сокращения потерь фреймов в
реальном времени штатной программы (сейчас пока обрабатывается один
фрейм, информация на длине двух фреймов пропускается).

2.7. Задания для лабораторных, курсовых работ


и дипломных проектов
Вариант 1.
В Matlab или на языке С++ написать программу, определяющую по со-
общению в 16-ом виде номер рейса. Программа должна брать данные из тек-
стового файла протокола сообщений штатной и доработанной программ.
Вариант 2.
В Matlab или на языке С++ написать программу, определяющую по со-
общению в 16-ом виде его четность и нечетность. Программа должна брать
данные из текстового файла протокола сообщений штатной и доработанной
программ.
Вариант 3.
87

В Matlab или на языке C++ написать программу, определяющую по чет-


ному и нечетному сообщениям в 16-ом виде текущие глобальные географи-
ческие координаты и высоту полета судна. Программа должна брать данные
из текстового файла протокола сообщений штатной и доработанной про-
грамм.
Вариант 4.
В Matlab или на языке C++ написать программу, определяющую по со-
общению в 16-ом виде текущие локальные географические координаты и
высоту полета, предполагая известной опорную точку, в окрестности которой
заведомо находится судно. Программа должна брать данные из текстового
файла протокола сообщений штатной и доработанной программ.
Вариант 5.
В Matlab или на языке C++ написать программу, определяющую по со-
общению в 16-ом виде текущую скорость судна (относительно Земли или
воздушную). Программа должна брать данные из текстового файла протоко-
ла сообщений штатной и доработанной программ.
Вариант 6.
В Matlab или на языке C++ написать программу, определяющую по со-
общению в 16-ом виде, содержащем данные о местоположения судна, точ-
ность измерения. Программа должна брать данные из текстового файла про-
токола сообщений штатной и доработанной программ.
Вариант 7.
Исследовать эффективность линейной интерполяции и интерполяции
неизвестных значений ближайшим измеренным значением сигнала.
Вариант 8.
Провести доработку программы записи информации с приемника RTL-
SDR и программы чтения этих файлов, обеспечивающие привязку фреймов к
текущему реальному времени.
Вариант 9.
В Matlab или на языке C++ написать программу, создающую из тексто-
вого файла протокола сообщений штатной программы интегральную таблицу
анализа сообщений по сеансу наблюдений воздушных суден (по примеру
таблицы 2.7).

Вариант 10.
88

Провести исследования эффективности поиска синхроимпульса в сооб-


щениях ADS-B по квадратурным каналам приема информации.
Вариант 11.
Найти причины, по которым доработанная программа работает на поря-
док медленнее штатной программы, и устранить их.
Вариант 12.
Исследовать возможность сокращения потерь фреймов в реальном вре-
мени штатной программы.
Вариант 13.
Провести доработку программы для приема нестандартных сообщений
(режим ADS-B отличный от Mode-S), начинающихся с символов «BA» или
«BE» (предположительно сообщения самолетов малой или военной авиации).
89

3. ОТСЛЕЖИВАНИЕ ДВИЖЕНИЯ
МОРСКИХ СУДОВ
Технология для отслеживания движения морских судов получила назва-
ние AIS (Automatic Identification System – автоматическая идентификацион-
ная система морских судов). В ней для передачи информации выбраны сиг-
налы с гауссовой частотной модуляцией с минимальным сдвигом (GMSK -
Gaussian Minimum Shift Keying), которые также широко используется в дру-
гих системах связи.

3.1. Общие сведения о GMSK сигналах


Прежде всего, отметим, что кроме технологии AIS, модуля-
ция GMSK используется в современных системах цифровой радиосвязи GSM
(Global System for Mobile Communications), GPRS (General Packet Radio Ser-
vice) и других и обеспечивает высокое качество передачи в относительно уз-
кой полосе, занимаемой сигналом.
GMSK сигналы это сигналы минимальной частотной манипуляцией с
гауссовой огибающей. Поэтому вначале коротко рассмотрим
лы минимальной частотной манипуляции (MSK) .
Основным параметром при частотной манипуляции является индекс ча-
стотной манипуляции m , который задает девиацию частоты манипуляции:

ω∂ = π ⋅ Br ⋅ m ,
где Br — скорость передачи информации. MSK модуляция должна
обеспечить ортогональность сигналов передающих «0» и «1» цифровой ин-
формации при минимально возможном индексе m . Другими словами, MSK
сигнал — сигнал с минимальным разносом частот «0» и «1» (т.е. с мини-
мальной девиацией), при котором эти частоты можно различить на интервале
T передачи одного символа. Из условия ортогональности можно вывести,
что минимальное допустимое значение m = 0.5 .
Схема MSK модулятора выглядит следующим образом (рис. 3.1):
90

Рис. 3.1. Структурная схема формирования MSK


на основе FM модулятора

Полная фазовая диаграмма представлена на рисунке 3.2:

Рис. 3.2. Полная фазовая диаграмма при MSK для 4-х бит информации

Таким образом, передача «1» приводит к увеличению фазы сигнала на


π π
, а передача «0» — к ее уменьшению на .
2 2
Сигналы с минимальной частотной манипуляцией (MSK) обеспечивают
минимальную ширину главного лепестка спектра равную 1.5 Br . Однако
постоянное уплотнение радиочастотного спектра привело к необходимости
91

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


Это можно достичь сглаживанием фронтов импульсов модулирующего
цифрового сигнала. На рисунке 3.3 показана фазовая диаграмма MSK без
сглаживания и со сглаживанием фронтов входного цифрового сигнала.
Сглаженному сигналу bg (t ) соответствует фазовая диаграмма Φ g (t ) , ко-
торая не имеет точек перелома.

Рис. 3.3. Фазовая диаграмма MSK без сглаживания и со сглаживанием


фронтов входного цифрового сигнала

Для GMSK сигналов сглаживание входного цифрового сигнала осу-


ществляется гауссовым фильтром [6]. ФНЧ (фильтр нижних частот) Гаусса
задается импульсной характеристикой вида:

гдеBT - безразмерная величина равная B−3дБ ⋅ T , B− 3дБ — полоса


фильтра Гаусса по уровню -3дБ, T , как и прежде, длительность передачи
одного символа. Таким образом, параметр BT показывает во сколько раз
полоса фильтра Гаусса B− 3дБ , отличается от скорости передачи информа-
ции Br , выраженной в единицах измерения частоты. Легко показать, что

∫ g (t )dt = 1.
−∞

Тем самым, ФНЧ Гаусса на нулевой частоте имеет коэффициент переда-


чи равный 1 для любых BT . На рисунке 3.4 показаны импульсные характе-
ристики g (tн ) фильтра Гаусса при T = 1с и различных параметрах BT .
92

Рис.3.4. Импульсные характеристики фильтра Гаусса при T=1 c


и различных BT

На рисунке 3.5 приведена нормированная АЧХ фильтра Гаусса c нор-


мировкой частоты f н = f ⋅ T . Тем самым нормированная частота f н = 1
соответствует частоте Br = 1 / T Гц.
93

Рис.3.5. Нормированная АЧХ фильтра Гаусса


при различных параметрах BT

Из рисунка хорошо видно (обозначено пунктирными линиями), что


нормированная полоса фильтра Гаусса по уровню -3дБ равна BT .
Рассмотрим структурную схему GMSK модулятора, показанную на ри-
сунке 3.6:

Рис. 3.6. Структурная схема GMSK модулятора


94

Входной цифровой сигнал b(t ) нормируется по амплитуде и получается


сигнал b0 (t ) с нулевым средним и не превышающий по модулю 1. После
b0 (t ) подается на сглаживающий фильтр Гаусса G(ω ) на выходе которого
имеем сглаженный сигнал bg (t ) . Этот сглаженный сигнал будет модулиру-
ющим сигналом частотного модулятора. Частота девиации при модуляции
соответствует частоте девиации MSK ω∂ = 0.5 ⋅ π ⋅ Br рад/с. В результате
получим сигнал SGMSK (t ) на несущей частоте ω 0 .
Отрицательной стороной применения Гауссова фильтра является меж-
символьная интерференция, которая тем больше, чем меньше BT . На ри-
сунках 3.7-3.10 приведены осциллограммы сглаженного сигнала bg (t ) при
различных значениях BT и скорости передачи данных Br = 20кбит / c .

Рис. 3.7. Сигнал на выходе фильтра Гаусса приBT=1


95

Рис. 3.8. Сигнал на выходе фильтра Гаусса приBT=0.7

Рис. 3.9. Сигнал на выходе фильтра Гаусса приBT=0.5


96

Рис. 3.10. Сигнал на выходе фильтра Гаусса приBT=0.3

Из рисунков 3.7-3.10 хорошо видно, что уменьшение BT приводит к


расширению эффективной длительности импульсной характеристики филь-
тра и увеличению межсимвольной интерференции.
На рисунке 3.11 показан спектр MSK сигнала и GMSK сигналов при
различных BT, при той же скорости передачи, что и выше.
97

Рис. 3.11. Сравнение спектров MSK и GMSK сигналов при различных BT

Из рисунка 3.11 хорошо видно, что в спектре GMSK при уменьшении BT


уменьшаются уровни боковых лепестков, кроме того значительно возрастает
скорость убывания спектра. Так максимальный уровень бокового лепестка
GMSK при BT=0.3 на 15 дБ меньше чем у MSK сигнала, а скорость убыва-
ния линейно зависит от частоты, что обусловлено применением Гауссова
фильтра.

3.2. Исследование сигналов GMSK в Matlab.


В Matlab сигналы GMSK генерирует comm-функция
comm.GMSKModulator(). Функция имеет следующие параметры:
• BitInput — логический параметр, определяющий представление
бит в форме 0,1 (true) или +1,-1, по умолчанию BitIn-
put=false;
• BandwidthTimeProduct — параметр BT введенный в разделе 1
(произведение ширины фильтра Гаусса на длительность передачи
одного символа);
• PulseLength — длина Гауссова импульса (фильтра) в количе-
ствах интервалов передачи одного символа. Значение по умолча-
нию равно 4;
98

• SymbolPrehistory — предыстория бит в представлении +1,-1,


не может превышать по длине PulseLength-1, по умолчанию
один бит равный 1;
• InitialPhaseOffset — начальное смещение по фазе в радиа-
нах;
• SamplesPerSymbol — количество формируемых отсчетов на
длине одного символа;
• OutputDataType — тип возвращаемых комплексных сигналь-
ных отсчетов, по умолчанию используется тип double.

Для демодуляции GMSK сигналов служит comm-функция


comm.GMSKDemodulator(). У нее такие же аргументы, как и у модули-
рующей функции, с добавлением параметра:
• TracebackDepth — глубина возврата назад в алгоритме дина-
мического программирования Витерби.
Как и в большинстве comm-функций, вызов указанных
функций только создает объект соответствующего класса.
Для реальных операций служат методы класса, в частности
метод Y=step(H,X) в первой функции выполняет модули-
рование. Здесь H имя созданного объекта, X — входной ин-
формационный битовый массив для передачи, обязательно должен быть век-
тором столбцом (во многих comm-функциях Matlab входная информация с
несколькими столбцами воспринимается как многоканальная, в рассматрива-
емых функциях многоканальность не поддерживается), Y — сформирован-
ный для передачи сигнал GMSK. Во второй функции X — принятый ком-
плексный GMSK сигнал, Y — декодированный поток бит.
Основным недостатком реализованной модели GMSK сигнала является
отсутствие рассогласования по несущей частоте между передатчиком и при-
емником, которое в реальных системах с использованием GMSK сигнала все-
гда присутствует. Отсутствие блока оценки смещения по частоте и ее кор-
рекции приводит к полной неработоспособности канала связи, в чем мы убе-
димся при исследовании реальных сигналов AIS.
Проведем сравнение GMSK сигнала с сигналом с двоичной фазовой ма-
нипуляцией (BPSK) для обеспечения одинаковой максимальной скорости
передачи информации. Методику сравнения и структуру программы заим-
ствуем из [5]. Будем использовать параметры сигнала GMSK, принятые в
технологии AIS для морских судов:
% Программа для исследования характеристик сигналов GMSK
99

close all;

% Параметры соответствуют принятым в AIS


Vt=9600;% Скорость передачи бит/с
dt=1/Vt; % Длительность символа в с (104,17 мкс)
dtf=dt/SamPerS; % интервал дискретизации (с)
SamPerS=24; % количество отсчетов на длительности одного символа
PulseLength=3;
BT=0.3;

snr=-8; % отношение сигнал/помеха (дБ)


N=10^3; % количество передаваемых бит

% Генерирование случайного информационного вектора


data = randi([0 1],N,1);
hMod = comm.GMSKModulator('BitInput', true, 'SamplesPerSym-
bol',SamPerS, 'PulseLength', PulseLength, 'BandwidthTimePro-
duct',BT);
hDemod = comm.GMSKDemodulator('BitOutput', true, 'SamplesPerSym-
bol',SamPerS, ...
'PulseLength', Pulse-
Length,'BandwidthTimeProduct',BT);
% Создание объекта для вычисления BER (bit error ratio - частота
% сбоя бит)с учетом задержки в алгоритме Витерби
hError = comm.ErrorRate('ReceiveDelay', hDemod.TracebackDepth);

modSignal = step(hMod, data);


LS=length(modSignal);

% Подготовка бит для отображения:


for i=0:N-1
data1(SamPerS*i+1:SamPerS*(i+1))=data(i+1);
end

t=1:LS/50;
Ph=angle(modSignal(t));
Ph=unwrap(Ph);
figure
plot(t,data1(t),t,Ph(t));
title('Битовая информация и развернутая фаза GMSK сигнала');

% Дополнительное смещение сигнала по частоте:


df=0*10^3; % смещение по частоте (Гц)
omeg=2*pi*df;
t=(0:dtf:dt*N-dtf)';
modSignal = modSignal.*exp(1i*omeg*t);

% Амплитудный спектр сигнала:


Fs=1/dtf; % частота квантования (Гц) – полоса сигнала
NFFT = 2^nextpow2(LS); % количество фильтров БПФ
FM=fft(modSignal,NFFT);
100

dFFT=Fs/NFFT; % Расстановка фильтров БПФ (Гц):


f=0:dFFT:Fs-dFFT; % разметка частотной оси

FMmod=abs(FM);
%plot(f,FMmod);

% Вычисление смещения спектра:


[~,nfmax]=max(FMmod);
dfest=nfmax*dFFT;
fprintf('%.3f %.3f %.3f\n',df,dfest,dfest-df);

% Пропускаем сигнал через AWGN-канал


% noisySignal = step(hAWGN, modSignal);
sigma=10^(-snr/20)/sqrt(2);
gaussnoise=(randn(LS,1)+1i*randn(LS,1))*sigma;
noisySignal = modSignal+gaussnoise;

% Вычисление отношения сигнал/помеха:


Ps=sum(abs(modSignal).^2);
Pn=sum(abs(gaussnoise).^2);
qizm=10*log10(Ps/Pn);
fprintf('snr=%.2f qizm=%.2f\n',snr,qizm);

% Спектр после наложения помех:


FMnoise=fft(noisySignal,NFFT);
FMnoisemod=abs(FMnoise);
figure
plot(f,FMnoisemod);

receivedData = step(hDemod, noisySignal);


errorStats = step(hError, data, receivedData);

fprintf('Количество ошибочных бит = %d, BER = %f\n', ...


errorStats(2),errorStats(1));

В программе после генерирования GMSK сигнала по случайной после-


довательности бит, вставлен блок смещения сигнала на заданную частоту.
Затем вычисляется спектр сигнала с помощью функции fft() (Fast Fourier
transform — быстрое преобразование Фурье). На сигнал накладывается белый
Гауссов шум, при этом мощность помехи вычисляется по заданному отноше-
нию сигнал/помеха в предположении единичной мощности генерируемого
сигнала GMSK, что действительно обеспечивается функцией
comm.GMSKModulator(). Для контроля реального отношения с/п реализо-
вано его измерение по суммарной мощности сигнала и помехи. Отметим, что
такое измерение вычисляет отношение с/п не в реальной полосе сигнала, а во
всей полосе частоты квантования. Сигнал после наложения помех поступает
на декодирование и вычисляется количество сбойных бит и частота сбоев
(BER – bit error ratio). Например, для отношения с/п -8 дБ получим:
101

snr=-8.00 qizm=-8.05
Количество ошибочных бит = 8, BER = 0.008130
Как видим, заданное и измеренное отношение с/п сов-
падают.
На рис 3.12 приведена развернутая фаза сигнала вместе с входной бито-
вой информацией до наложения помех (отображаются все 24 отсчета на дли-
тельности символа):

Рис. 3.12. Битовая информация и развернутая фаза GMSK сигнала


до наложения помех

Здесь для устранения скачков фазы связанных с переходом ± π исполь-


зована функция unwrap().
После наложения помех (отношение с/п 0 дБ) фаза значительно иска-
жается (рис. 3.13):
102

Рис.3.13. Битовая информация и развернутая фаза GMSK сигнала


после наложения помех

Несмотря на значительные изменения фазы после наложения помех,


обеспечивается безошибочное декодирование битовой информации (BER
менее 10-6).
Рассмотрим теперь спектр GMSK сигнала и сравним его со спектром
BPSK сигнала (модуляция фазы на два положения).
Для удобства анализа сигналы сместим на 50 кГц, а амплитуду сигнала
будем нормировать на максимум и значения откладывать в логарифмическом
масштабе:
[Amax,~]=max(FMnoisemod);
FMnoisemod=20*log10(FMnoisemod/Amax);
figure
plot(f,FMnoisemod);
ylim([-50 0]);
title('Спектр GMSK сигнала (смещение на 50 кГц)');
xlabel('Частота (Гц)');
ylabel('Амплитуда (дБ)');
103

Для моделирования сигнала BPSK используется функция pskmod()[5],


в которой отсутствует параметр определяющий количество отсчетов на дли-
тельности одного символа. Введем его самостоятельно, следуя [8]:
% Повтор комплексных амплитуд:
for k=1:N
yp((k-1)*SamPerS+1:k*SamPerS)=y(k); % length(yp)=N*SamPerS
end
Здесь вектор y комплексный сигнал на выходе функции pskmod().
Соответственно, перед декодированием необходимо будет оставить один от-
счет на символе процедурой выбора максимального по амплитуде отсчета на
длине каждого символа:
% Оставляем максимальный отсчет на символе:
for k=1:N
[~,imax]=max(abs(WGNy(SamPerS*(k-1)+1:SamPerS*k)));
y(k)=WGNy(SamPerS*(k-1)+imax);
end
Здесь WGNy BPSK сигнал после наложения помех.
Убедимся, прежде всего, что наши измерения спектра согласуются с
теоретическими данными, приведенными в разделе 3.1. В соответствии с ри-
сунком 3.11 ширина спектра GMSK сигнала при BT=0.3 по уровню -20
дБ составляет примерно 20 кГц при скорости передачи 20 кГц/с. При
этих же параметрах реализация спектра в нашей модели выглядит следую-
щим образом (рис. 3.14, отношение с/п 25 дБ):
104

Рис.3.14. Спектр GMSK сигнала при скорости передачи 20 Кбит/с

Из рисунка видно, что реализация спектра в целом соответствует теоре-


тическому спектру. Мы можем легко вычислять ширину спектра по заданно-
му уровню с помощью замечательной функции find():
% Измерение ширины спектра по заданному уровню:
Q=-20;
idxf=find(FMnoisemod >= Q,1,'first');
idxl=find(FMnoisemod >= Q,1,'last');
df=(idxl-idxf)*dFFT/10^3;
fprintf('Ширина спектра по уровню %d дБ = %.3f кГц\n',Q,df);
Результат измерения следующий:
Ширина спектра по уровню -20 дБ = 20.570 кГц
Вернемся к параметрам GMSK сигнала, используемым в AIS и вначале
построим спектр обоих сигналов фактически без помех (отношение с/п 25
дБ) (рисунки 3.15 и 3.16):
105

Рис. 3.15. Спектр GMSK сигнала при отношении с/п 25 дБ

Рис. 3.16. Спектр BPSK сигнала при отношении с/п 25 дБ


106

Из рисунков хорошо видно значительное преимущество сигнала GMSK


над BPSK. Во-первых, спектр BPSK сигнала уже по уровню -30 дБ забива-
ет всю полосу квантования, тогда как со спектром GMSK сигнала это проис-
ходит только при –45 дБ. Сравнительная ширина спектров обоих сигналов
по различным уровням приведена в таблице 3.1:
Таблица 3.1
Уровень, дБ Ширина спектра GMSK Ширина спектра BPSK
сигнала, кГц сигнала, кГц

-5 4.729 8.297
-10 7.118 13.711
-20 10.003 67.198
-30 11.703 Полоса квантования
-40 17.685 Полоса квантования

Понятно, что различия в спектре не только приведут к различной воз-


можности заполнения частотного диапазона, но и существенно скажутся на
качестве передачи информации.
Спектры обоих сигналов для рабочих отношений сигнал/помеха, напри-
мер, для -8 дБ выглядят следующим образом (рис. 3.17, 3.18):
107

Рис. 3.17. Спектр GMSK сигнала при отношении с/п -8 дБ

Рис. 3.18. Спектр BPSK сигнала при отношении с/п -8 дБ

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


дут визуально обнаруживаться (сигнал присутствует только на 0.1 развертки
в середине, рис. 3.19):
108

Рис. 3.19. Амплитудная развертка GMSK сигнала


при отношении с/п -8 дБ

Для визуального обнаружения необходимо увеличить отношение с/п хо-


тя бы до 0 дБ (рис. 3.20):
109

Рис. 3.20. Амплитудная развертка GMSK сигнала


при отношении с/п 0 дБ

Мы видим, что отношение с/п в полосе GMSK сигнала составляет около


10 дБ, для BPSK сигнала — около 7 дБ. Однако выигрыш GMSK сигнала су-
щественно больше. Для оценки выигрыша необходимо обратится к основной
характеристике канала связи — зависимости BER от отношения с/п. Для
предварительной оценки достаточно провести измерения в обоих каналах для
нескольких значений отношения с/п. По модели GMSK сигнала получаем
(смещение по частоте убрано):
snr=-8.00 qizm=-8.01
Количество ошибочных бит = 4, BER = 0.004065
В модели BPSK сигнала проведем измерения BER для 2-х значений от-
ношения с/п:
snr=-8.00 qizm=-7.98
Количество ошибочных бит = 117, BER = 0.11700
snr=0.00 qizm=0.01
Количество ошибочных бит = 5, BER = 0.00500
Получили, что при отношении с/п -8 дБ GMSK сигнал обеспечивает
приемлемый уровень сбоев, который может быть полностью устранен,
например, использованием корректирующих кодов, тогда как в канале связи
110

с BPSK сигналом передача информации уже практически не возможна (сбоит


каждый 10-ый бит). Для обеспечения примерно такого же уровня BER, как в
канале с GMSK, пришлось увеличить отношение с/п на 8 дБ.
Из полученных данных не следует, что во всех реальных системах связи
можно работать с сигналами меньшими по мощности, чем фоновая мощность
помех. Например, в технологии наблюдения движения воздушных судов
ADS-B и в технологии автоматической идентификации морских судов AIS
используется импульсная передача небольшого объема информации (длина
сообщения ADS-B – не более 112 мкс, AIS – 27 мс, раздел 2.1) с частотой до
нескольких сообщений в секунду. В этом случае временное положение сиг-
нала на приемной стороне не известно и первичное определение интервала
наличия сигнала, как правило, осуществляется по амплитудной развертке и
требует значительного отношения с/п. Кроме того, как отмечалось выше, в
Matlab реализована упрощенная модель сигнала, в частности не реализовано
смещение по частоте между приемником и передатчиком, которое всегда
присутствует в реальных системах и требует адаптивной оценки и устране-
ния.
Завершим раздел приведением кривой зависимости BER от отношения
сигнал/помеха для GMSK и BPSK сигналов. Для этого нам достаточно реали-
зовать циклическое вычисление BER для отношения с/п из заданного диапа-
зона с заданным шагом. После удаления демонстрационной печати и графи-
ки, программа выглядит вполне лаконично:
% Программа для исследования характеристик сигналов GMSK
clear all;

% Параметры соответствуют принятым в AIS


Vt=9600;% Скорость передачи бит/с
dt=1/Vt; % Длительность символа в с (104,17 мкс)
SamPerS=24; % количество отсчетов на длительности одного символа
dtf=dt/SamPerS; % интервал дискретизации (с)
PulseLength=3;
BT=0.3;

N=4*10^5; % количество передаваемых бит


LS=N*SamPerS; % общее количество отсчетов сигнала

hMod = comm.GMSKModulator('BitInput', true, 'SamplesPerSym-


bol',SamPerS, ...
'PulseLength', Pulse-
Length,'BandwidthTimeProduct',BT);
hDemod = comm.GMSKDemodulator('BitOutput', true, 'SamplesPerSym-
bol',SamPerS, ...
'PulseLength', Pulse-
Length,'BandwidthTimeProduct',BT);
% Создание объекта для вычисления BER
% (bit error ratio - частота сбоя бит)
111

% с учетом задержки в алгоритме Витерби


hError = comm.ErrorRate('ReceiveDelay', hDemod.TracebackDepth);

qmin=-12; % минимальное отношение с/п (дБ)


qmax=-3.5; % максимальное отношение с/п (дБ)
dq=0.5; % шаг по отношению с/п (дБ)
snr=qmin:dq:qmax;
n=length(snr);
BER(1:n)=0;
fprintf('snr (дБ) Ко-во ошибок BER \n');
for i=1:n
data = randi([0 1],N,1); % генерирование случайного информа-
ционного вектора
modSignal = step(hMod, data);

% Пропускаем сигнал через AWGN-канал


sigma=10^(-snr(i)/20)/sqrt(2);
gaussnoise=(randn(LS,1)+1i*randn(LS,1))*sigma;
noisySignal = modSignal+gaussnoise;

% Демодуляция:
receivedData = step(hDemod, noisySignal);
errorStats = step(hError, data, receivedData);
reset(hError);
BER(i)=errorStats(1);
if BER(i) == 0
BER(i)=10^(-5);
end
fprintf('%5.1f %4d %.5f\n',
snr(i),errorStats(2),BER(i));
end
figure
plot(snr,log10(BER));
title('Зависимость BER от отношения с/п');
xlabel('Отношение с/п (дБ)');
ylabel('lg(BER)');
grid on
hold on

Для сигнала BPSK аналогичная программа выглядит так:


%% Программа для исследования характеристик сигналов
% с фазовой манипуляцией (PSK)
%clear all;
M = 2; % размер алфавита, должен быть степенью числа 2.
symbol_order='gray';% 'bin'(default)/'gray'
ini_phase0=0;% начальная фаза в радианах до передачи
N=4*10^5; % количество символов во входном массиве
SamPerS=24;

tic
% Генирируем N случайных M-арных символов:
112

msg = randi([0 M-1],N,1);

% Генирируем PSK-сигнал:
y = pskmod(msg,M,ini_phase0,symbol_order);

% Повтор комплексных амплитуд:


for k=1:N
yp((k-1)*SamPerS+1:k*SamPerS)=y(k); % length(yp)=N*SamPerS
end
N1=N*SamPerS;

% Для сигналов AIS:


Vt=9600;% Скорость передачи бит/с
dt=1/Vt; % Длительность символа в с (104,17 мкс)

qmin=-4; % минимальное отношение с/п (дБ)


qmax=5.0; % максимальное отношение с/п (дБ)
dq=0.5; % шаг по отношению с/п (дБ)
snr=qmin:dq:qmax;
n=length(snr);
BER(1:n)=0;
fprintf('snr (дБ) Ко-во ошибок BER \n');
for i=1:n
% Пропускаем сигнал через AWGN-канал
sigma=10^(-snr(i)/20)/sqrt(2);
gaussnoise=(randn(1,N1)+1i*randn(1,N1))*sigma;
WGNy = yp+gaussnoise;

% Оставляем максимальный отсчет на символе:


for k=1:N
[~,imax]=max(abs(WGNy(SamPerS*(k-1)+1:SamPerS*k)));
y(k)=WGNy(SamPerS*(k-1)+imax);
end

% Декодирование принятого сигнала:


ini_phase1=0; % начальная фаза в радианах после приема
WGNz = pskdemod(y,M,ini_phase1,symbol_order);

% Вычисляем количество и интенсивность сбоев


% (BER - bit error rate):
[numErr,BER(i)] = biterr(msg,WGNz);
if BER(i) == 0
BER(i)=10^(-5);
end
fprintf('%5.1f %4d %.5f\n',
snr(i),numErr,BER(i));
end
plot(snr,log10(BER));
legend('GMSK','BPSK');
113

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

Рис. 3.21. Зависимость BER от отношения сигнал/помеха


для GMSK и BPSK сигналов

Отметим, что опция hold on в Matlab позволяет на один график нане-


сти данные нескольким программам.
Полученные графики подтверждают выше приведенные данные о выиг-
рыше около 8 дБ для малых уровней BER (10-3-10-5). Для более высоких
уровней BER выигрыш на 1-2 дБ меньше.
114

3.3. Общая информация о методах передачи сообщений


морскими судами
Как и воздушные судна, морские суда постоянно передают сигналы со
своими данными. При движении судна интервал передачи составляет от 2 до
10 секунд и 3 минуты при стоянии на якоре. В зависимости от класса, суда
комплектуются двумя видами передающей аппаратуры. К классу А (AIS A)
отнесены судна с валовой вместимостью свыше 300, совершающие междуна-
родные рейсы, судов валовой вместимостью 500 и более, не совершающих
международные рейсы, и все пассажирские суда. Для них выделен канал свя-
зи на частоте 161.975 МГц. Мощность передатчика 12.5 Вт. Другие судна
отнесены к классу B (AIS B) и они должны передавать свои сигналы на ча-
стоте 162.025 МГц. Мощность передатчика в пять раз ниже. Скорость пере-
дачи всегда 9600 Кбит/с, соответственно, длительность передачи одного сим-
вола около 104 мкс.
Для передачи информации используется GMSK модуляция с BT = 0.3 и
длиной импульса (pulse length) = 3. Основное сообщение имеет следующую
структуру:
• Время разгона (Ramp-up time) — 8 бит;
• Синхроимпульс (Training sequence) — 24 бита;
• Флаг начала сообщения (Start flag) — 8 бит;
• Информация о судне — 168 бит;
• Код CRC — 16 бит;
• Флаг конца сообщения (End flag) — 8 бит;
• Буфер (Buffer) — 24 бита.
Вся длина сообщения составляет 256 бит. Для некоторых типов сообще-
ний общая длина может достигать 512 бит.
Start flag = End flag = 0x7E. Для предотвращения образования ложных
флагов, после каждых 5 последовательных «1» вставляется 0. Синхроим-
пульс задается последовательностью 101010101010101010101010. В каждом
байте передача начинается с младших бит (transmit LSB first). Дополнитель-
но используется кодирование NRZI (Non Return to Zero Inverted), заключаю-
щееся в замене «1» на предыдущий символ и «0» на инверсию предыдущего
символа.
В соответствии с [9], структура информационной части сообщения для
AIS класса A приведена в таблице 3.2.
115

Таблица 3.2.
Параметр Количество Краткое описание
бит
Номер сообщения 6 1,2 или 3
(Message ID)
Индикатор по- 2 Количество повторений сообщения 0-3, 3
вторения (Repeat- – не повторять (используется репитером)
indicator)
Идентификатор 30 MMSI (Maritime Mobile Service Identity)
судна (User ID) number — идентификатор морской по-
движной службы (ИМПС)
Навигационный 4 0 = в пути с использованием двигателя, 1
статус (Naviga- = на якоре, 2 = не под командой, 3 = огра-
tional status) ниченная маневренность, 4 = ограничения
по тяге, 5 = пришвартовано, 6 = на мели, 7
= занято промыслом, 8-15 = резерв и до-
полнительная информация
Скорость разво- 8 0 до +126 = поворот на право до 708
рота (Rate of turn град/мин; 0 до -126 = поворот на лево до
- ROTAIS) 708 град/мин (ROTAIS = 4.733
SQRT(ROTsensor) град/мин, где ROTsensor –
показания индикатора поворота);
+127 = поворот на лево более чем 10
град/мин; -127 = поворот на право более
чем 10 град/мин; -128 = информация о
развороте не доступна.
Скорость движе- 10 Скорость движения в 1/10 долях узла (0-
ния (Speed over 102.2 узла); 1 023 = не доступно, 1 022 =
ground – SOG) 102.2 узла или выше
Точность измере- 1 1 = высокая (<= 10 м)
ния позиции 0 = низкая (> 10 м)
(Position accuracy)
Долгота (Longi- 28 Долгота в 1/10000 долях минуты от -180
tude) до +180 градусов, Восточная долгота -
положительные числа, Западная долгота -
отрицательные числа; 181градус =
6791AC0h = недоступно
Широта (Latitude) 27 Широта в 1/10000 долях градуса от -90
до +90 градусов, Северная широта - поло-
жительные числа, Южная широта - отри-
116

Параметр Количество Краткое описание


бит
цательные числа. 91градус = 3412140h =
недоступно
Курс по земле 12 Курс в 1/10 долях градуса (0-3599).
(Course over 3600 = E10h = недоступно
ground – COG)
Истинное 9 В градусах от 0 до 359, 511 = недоступно
направление
движения
(True heading)
Метка времени 6 Секунды формирования сообщения по
(Time stamp) UTC – времени электронной системой ко-
ординат (EPFS) в диапазоне от 0-59, 60-63
в нештатных ситуациях
Индикатор спе- 2 0 = недоступно,
циального манев- 1 = нет специального маневра
ра (Special ma- 2 = в режиме специального маневра
neuver indicator)
Резерв (Spare) 3 Не используется, резерв для будущих до-
работок
RAIM-flag 1 Флаг наличия устройства электронного
позиционирования судна, 0 = не использу-
ется, 1 = используется
Состояние связи 19 Состояние связи в сообщениях AIS класса
(Communication A. Используется при планировании сле-
state) дующей передачи, чтобы избежать взаим-
ных помех
Всего бит (Num- 168
ber of bits)

Основное сообщение AIS класса B по структуре не сильно отличается


от приведенной структуры для класса A. Длина сообщения те же 168 бит,
номер сообщения всегда равен 18. Отсутствуют поля «Навигационный ста-
тус», «Скорость разворота» и «Индикатор специального маневра» (всего 14
бит). Вместо них добавлено 7 флажков и резерв увеличен с 3 до 10 бит.
Начиная с поля «Курс по земле» поля немного смещены по номерам бит
[10].
При сравнении с технологией ADS-B наблюдения движения воздушных
судов видим, что разработчики AIS биты не экономили и вся информация
размещается практически в исходном виде. Если технология ADS-B корнями
117

уходит в послевоенные годы, то AIS сравнительно новая технология, практи-


ческая эксплуатация ее началось только в 2000 году.

3.4. Исследование реальных сигналов AIS


3.4.1. Алгоритм обнаружения сигналов AIS
После детального рассмотрения методов передачи и кодирования ин-
формации в сообщениях, мы можем перейти к наиболее интересной части
раздела, а именно к рассмотрению алгоритма обнаружения таких сигналов по
выходу приемника RTL-SDR.
Как и в случае с сигналами ADS-B, в приложении к книге [2] приведена
программа с открытым кодом aisLiveData, которая решает поставленную за-
дачу (авторские права на программу принадлежат корпорации MathWorks).
Рассмотрим, прежде всего, какие программа устанавливает параметры
на приемник:
% Рабочая частота приемника в Гц (tuner center frequency in Hz):
rtlsdr_fc = 161.975e6; % для AIS A
% Усиление приемника в дБ (tuner gain in dB):
rtlsdr_gain = 60;
% Частота квантования входного сигнала – тактовая частота (tuner
sampling rate), максимальное значение 3.2e6 Гц
rtlsdr_fs =9600*24=230400;
% Размер запрашиваемого за 1 раз объема входной информации —
фрейма(output data frame size):
rtlsdr_frmlen = 2^18;
% Формат выходных квадратур (output data type single) - аналог
float (4 байта):
rtlsdr_datatype = 'single';
Как указывалось в разделе 3.1, скорость передачи сигналов AIS состав-
ляет 9600 бит/с, что соответствует длине передачи одного символа около 104
мкс и это на 2 порядка ниже скорости передачи сигналов ADS-B. Как видим,
используется частота квантования, обеспечивающая на длительности симво-
ла ровно 24 отсчета. Количество отсчетов одного фрейма такая же, как при
обнаружении сигналов ADS-B (длительность ~1.14c).
Прежде всего, в программе отдельной функцией генерируется синхро-
импульс GMSK, соответствующий используемой последовательности бит:
function syncIdeal = syncGen(samplesPerSymbol)
% Generate ideal AIS sync waveform

% Copyright 2016, The MathWorks, Inc.

% Set up training sequence


tr1=logical([1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0]); % 24 bits
118

% Set up GMSK Modulator


mod=comm.GMSKModulator;
mod.BandwidthTimeProduct=.3;
mod.SamplesPerSymbol=samplesPerSymbol;
mod.BitInput=true;
mod.PulseLength=3;
mod.SymbolPrehistory=[1 -1];

% Apply NRZI (Non-return-to-zero inverted) encoding


for ii=2:length(tr1)
if tr1(ii)==1
tr1(ii)=tr1(ii-1);
else
tr1(ii)=~tr1(ii-1);
end
end

% Generate GMSK waveform for training sequence


syncIdeal = step(mod,tr1');

Как видим, генерация производится функцией


comm.GMSKModulator(), которую мы использовали для исследования ха-
рактеристик GMSK сигналов в разделе 3.2. Как указывалось начале настоя-
щего раздела, в AIS используется кодирование NRZI (Non Return to Zero In-
verted), заключающееся в замене «1» на предыдущий символ и «0» на инвер-
сию предыдущего символа. Такое преобразование приводит к следующей
последовательности бит, которая и подается на вход модулятора:
100110011001100110011001. Обратите внимание, что значение предыдущего
символа могло быть ранее изменено.
Полученный в модуляторе сигнал проходит многоступенчатую обработ-
ку для получения фазового образа идеального синхроимпульса:
syncCalc = syncGen(samplesPerSymbol);
syncIdeal =
unwrap(diff(angle(syncCalc(1:samplesPerSymbol*20+1))));
Прежде всего, обратим внимание, что синхроимпульс обрезается на 4
бита. Как мы увидим позже по имеющимся экспериментальным данным, это
позволяет немного увеличить корреляцию идеального и реального синхро-
импульсов. Выделяется фаза сигнала, затем она заменяется на прирост фазы
(функция diff()выдает разности S(i+1)-S(i+1), размерность выходно-
го массива на 1 уменьшается). Функция unwrap()разворачивает фазу сиг-
нала, устраняя скачки вызванные переходом фазы ± π . В данном случае
операция лишняя. На рисунке 3.22 изображена фаза идеального синхроим-
119

пульса с использованием и без использования функции diff()(выход


diff()умножен на коэффициент 20):

Рис. 3.22. Фаза и прирост фазы идеального синхроимпульса

Как видим, два варианта фазы синхроимпульса отличаются только вре-


менным смещением, масштабом и на аддитивную константу (коэффициент
корреляции практически равен 1). Поэтому вполне можно обойтись без рас-
чета прироста фазы.

3.4.2. Исследование записей сигналов AIS от судов


в окрестности г. Бостона
Параллельно с описанием используемого алгоритма выделения сигналов
AIS рассмотрим и имеющиеся экспериментальные данные. Вместе с про-
граммой авторы предоставили записи сигналов AIS судов на Восточном по-
бережье США вблизи г. Бостон. Записано всего 2 фрейма с сигналами от 6
суден. Амплитудная развертка фреймов выглядит следующим образом (ри-
сунки 3.23, 3.24):
120

Рис. 3.23. Амплитудная развертка фрейма 1

Рис. 3.24. Амплитудная развертка фрейма 2


121

Расстояние от судов до приемника не указано, но судя по мощности сиг-


налов, оно небольшое. Приведем сразу результаты обработки фреймов штат-
ной программой:
Фрейм 1
corr=0.649
msgType = 1
MMSI:367164250 Latitude:42.38 Longitude:-71.0421
045789ED68200006BACB889840016C8BFFDC0860101600

corr=0.788
msgType = 1
MMSI:367432220 Latitude:42.3749 Longitude:-71.0477
04579A4870200006BAC4FF183F43393EFFDC0906B0187B

Фрейм 2
corr=0.319
msgType = 1
MMSI:367513020 Latitude:42.3804 Longitude:-71.0421
04579F36F3E00006BACB8C184011001DFFF401401A2593

corr=0.499
msgType = 1
MMSI:367513050 Latitude:42.3803 Longitude:-71.0425
04579F376B200016BACB0B98400E59A5FF80014031F6DD

corr=0.889
msgType = 1
MMSI:366941020 Latitude:42.3845 Longitude:-71.0596
04577C4D7000000EBAB7131840AC8AC45B760008A08D89

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


MMSI судна, географические координаты и полученное сообщение в 16-
ричном виде (только данные и код CRC – 184 бита). Дополнительно введено
вычисление коэффициента корреляции идеального и принятого синхроим-
пульса на интервале его обнаружения программой, а также выведен номер
сообщения. Сигналы в программе анализируются в порядке следования их
мощности, начиная с наиболее мощного.
Видим, что все сигналы получены от судов класса А. К сожалению, тре-
тий по мощности сигнал в первом фрейме, хорошо видный на амплитудной
развертке (рис. 3.24, отношение сигнал/помеха около 10 дБ во всей полосе
частоты квантования) не обнаружен, что может свидетельствовать об ошиб-
ках в алгоритме или программе. Полученные коэффициенты корреляции для
рассматриваемых мощных сигналов могут указывать на те же причины.
Аналогично сайту www.flightradar24.com для отслеживания воздушных
судов, в США функционирует сайт www.marinetraffic.com для отслеживания
движения морских судов (возможно и речных тоже). Введя полученные
идентификаторы MMSI, получаем следующую информацию о судах, пере-
давших в эфир изучаемые нами сигналы (рисунки 3.26-3.28):
122

Рис. 3.25. Информация о судах, сигналы которых записаны во фрейме 1


(MMSI 367164250 и 367432220)
123

Рис. 3.26. Информация о судах, сигналы которых записаны во фрейме 2


(MMSI 367513020 и 367513050)
124

Рис. 3.27. Информация о судне, сигнал которого записан во фрейме 2


(MMSI 366941020)

На сайте также можно получить информацию на карте о последних пе-


ремещениях судна.
Продолжим описание и исследование рассматриваемого алгоритма вы-
деления сигналов. Рассмотрим основную часть программы, завершающуюся
нахождением синхроимпульса:
% После задания параметров на RTL-SDR или открытия файла с
% квадратурной информацией и вычисления фазы идеального
% синхроимпульса:

% Создание объекта для вычисления кода CRC (16 битный HDLS FCS)
crcGen = comm.CRCGenerator('Polynomial',
[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1],...
'InitialConditions',1,'DirectMethod',true,'FinalXOR',1);
125

% Создание объекта для гауссовой фильтрации


% (Gaussian Filter Design)
BT=.3;
pulseLength=3;
gx = gaussdesign(BT,pulseLength,samplesPerSymbol);

% Создание объекта для извлечения развернутой фазы -


эквивалентно unwrap((angle(z))
phaseCalc=dsp.PhaseExtractor;

% Цикл по количеству обрабатываемых фреймов (Loop for nCaptures)


for nn=1:nCaptures
% Цикл до получения не корректного сообщения (Loop until
% find invalid message)
validCRC=1;
% Поучение информации от RTL-SDR или из файла
if liveFlag
data = step(RX);
else
data=double(data);
end
while validCRC
% Нахождение наиболее мощного сигнала во фрейме
% разбиением фрейма на сегменты по 128 отсчетов (Find
% strongest RX signal in capture)
windowLen = RX.SamplesPerFrame/128;
l=floor(length(data)/windowLen);
m=sum(reshape(abs(data(1:l*windowLen)),windowLen,l));
d=diff(m);

[mx,inx]=max(d(1:l-1));
md=mean(abs(d(1:l-1)));
inx = max(2,inx);
inx = min(inx,l-2);

% Поиск сегмента для дальнейшей обработки имеющего


% наибольший прирост суммарной амплитуды
% относительно предыдущего сегмента. Максимальный
% прирост амплитуда сегмента должна превышать средний
% уровень приростов в 8 раз. Такой сегмент принимается
% за начало сигнала
% (Search the data set for a transition from low to high
% power. The max needs to be 8x greater than the mean in
% a segment to be a transition. Then trim the waveform
% from the start of the transition until the end)
if mx>8*md
a1=d(inx)-d(inx-1);
a2=d(inx)-d(inx+1);
if a1>a2
startPt = inx*windowLen;
126

else
startPt = max(1,(inx-1)*windowLen);
end
else
startPt = 1;
end
% Вычисляется длина выборки из расчета приема самого
% длительного сигнала – 480 бит
% (Trim waveform. Messages can be from 184 bits long
%(including CRC) to 440 bits long. There are also some
% ramp up bits, 24 sync bits and and an 8 bit start
% flag. Capture enough samples to get longest message,
% which is the window length plus
% 480bits*samplesPerSymbol)
endPt = min(length(data),
startPt+windowLen+480*samplesPerSymbol);
dataSlice=data(startPt:endPt);
aisIdx=[startPt endPt];

% Первичное (грубое) устранение смещения по частоте


% между приемником и передатчиком по спектру сигнала
% (Coarse Frequency Correction)
Y=abs(fftshift(fft(dataSlice)));
idx=find(Y==max(Y));
frShift=(floor(length(dataSlice)/2)-
idx)*RX.SampleRate/length(Y);
hc=comm.PhaseFrequencyOffset('FrequencyOffset',
frShift,'SampleRate',RX.SampleRate);
dataShifted=step(hc,dataSlice);

% Уточнение границ сигнала


% (Find Start and End Points)
newStart=21;
newEnd=length(dataShifted)-20;
m=mean(abs(dataShifted));
idx1=find(abs(dataShifted)>m,1,'first');
idx2=find(abs(dataShifted)>m,1,'last');
idxStart=max(newStart,idx1);
idxEnd=min(newEnd,idx2);
aisSig=dataShifted(idxStart:idxEnd);

% GMSK Filter
rxf = filter(gx,1,aisSig);

% Устранение смещения по частоте по измерениям фазы.


% Не реализовано!
% Fine Frequency Correction with
% comm.FrequencySynchronizer (отсутствует в используемой
% версии MATLAB)
rxfShifted = rxf;
127

% Поиск синхроимпульса по свертке с идеальным


% (Find max correlation to preamble)
rxAngles = step(phaseCalc,rxfShifted);
syncCorr=zeros(length(rxAngles)-length(syncIdeal),1);
if (length(rxAngles) > samplesPerSymbol*50 +
length(syncIdeal))
for ii=1:samplesPerSymbol*50
syncCorr(ii)=syncIdeal'*
rxAngles(ii:ii+length(syncIdeal)-1);
end
else
syncCorr(1)=1;
end

% Привязка начала сигнала к концу синхроимпульса


% (Compute best sample phase for making bit decisions)
[~,idx]=max(abs(syncCorr));
samplePhase =
mod(idx,samplesPerSymbol)+floor(samplesPerSymbol/2);

Приведенные комментарии разработчиков программы и их вольный пе-


ревод позволяют разобраться с алгоритмом обработки. Начало алгоритма
сильно усложнено. В алгоритме обработки сигналов ADS-B, каждая ампли-
туда, превысившая средний уровень амплитуд фрейма в заданное количество
раз, рассматривается как возможное начало бортового сигнала, т.е. сигналы
выделяются последовательно во времени. Здесь же предложена сильно
усложненная обработка, направленная на выделение сигналов, начиная с са-
мых мощных. Весь фрейм разбивается на 128 сегментов (windows). В каче-
стве критерия выбрано не отношение амплитуды к среднему значению, а
прирост амплитуды относительно предыдущего сегмента. Результат обоих
видов обработки, безусловно, будет близким, но любое неоправданное
усложнение обработки может нести в себе непредсказуемое поведение в от-
дельных случаях. При выборе интервала присутствия сигнала AIS разработ-
чики исходят из максимально возможной длины сообщения, хотя на ампли-
тудных развертках границы сигнала очень четкие и могут быть легко вычис-
лены. Процедура уточнения границ сигнала у авторов есть, но важнейший
блок устранения смещения частоты между приемником и передатчиком, без
которого невозможно выделение информации из фазы сигнала (см. алгорит-
мы адаптации к смещению по частоте для сигналов с фазовой модуляцией
[8]), подключается до уточнения границ.
Оценка смещения по частоте в соответствии с классикой проводится по
спектру сигнала. Подключим отображение спектров и оценим частоту мак-
симума спектра (рисунки 3.28 -3.33). Для вычисления спектров в программе
всегда используется 13569 отсчетов, все выделенные сигналы AIS занимают
128

не более 6144 отсчетов (вместе с временем разгона). Напомним, что полоса


сигнала равна 9600*24=230400 Гц.

Рис. 3.28. Спектр сигнала от судна 367164250 (фрейм 1),


смещение -6537 Гц

Рис. 3.29. Спектр сигнала от судна 367432220 (фрейм 1)


смещение -56763 Гц
129

Рис. 3.30. Спектр сигнала от 3-го судна (фрейм 1, сбой по CRC) ,


смещение -57578 Гц

Рис. 3.31. Спектр сигнала от судна 367513020 (фрейм 2) ,


смещение -6554 Гц
130

Рис. 3.32. Спектр сигнала от судна 367513050 (фрейм 2) ,


смещение -56865 Гц

Рис. 3.33. Спектр сигнала от судна 366941020 (фрейм 2) ,


смещение -6469 Гц
131

Наблюдается значительные смещения частоты корабельных передатчи-


ков и приемника, которые для некоторых суден достигают почти 60 кГц и
во всех случаях наблюдается отрицательное смещение. Судя по коммента-
риям, в программе предполагался 2-ой уровень компенсации частотного
смещения по фазе сигнала с помощью функции
comm.FrequencySynchronizer()(похоже, ее нет во всех версиях
MATLAB, есть функция comm.CarrierSynchronizer(), но работает
она только с видами модуляции BPSK, QPSK, 8PSK, QAM или PAM). Каче-
ство компенсации смещения рассмотрим на развертке фазы выделенных сиг-
налов, после компенсации измеренного смещения, уточнения длительности
сигнала и гауссовой фильтрации (рис. 3.34 – 3.39):

Рис. 3.34. Развернутая фаза сигнала от судна 367164250 (фрейм 1)


132

Рис. 3.35. Развернутая фаза сигнала от судна 367432220 (фрейм 1)

Рис. 3.36. Развернутая фаза сигнала от 3-го судна


(фрейм 1, сбой по CRC)
133

Рис. 3.37. Развернутая фаза сигнала от судна 367513020 (фрейм 2)

Рис. 3.38. Развернутая фаза сигнала от судна 367513050 (фрейм 2)


134

Рис. 3.39. Развернутая фаза сигнала от судна 366941020 (фрейм 2)

На всех рисунках хорошо виден знакомый нам, практически идеальный,


синусоидальный синхроимпульс, исключение составляет первый сигнал
фрейма 2, где наблюдаются небольшое искажение (рис. 3.37). Только для
этого сигнала удалось почти полностью компенсировать смещение по часто-
те. Для всех остальных сигналов хорошо видно линейное изменение фазы на
синхроимпульсе и других частях сигнала без информационных скачков фазы,
что говорит о неполной компенсации смещения, которое и привело к низким
значениям коэффициентов корреляции (см. результаты обработки фреймов
штатной программой). Наблюдается остаточное смещение по частоте как по-
ложительное (фаза возрастает), так и отрицательное (фаза убывает). Наибо-
лее неудачно выглядит фаза необнаруженного сигнала (третий сигнал фрей-
ма 1, рис. 3.36). Здесь и интервал существования сигнала завышен почти в 2
раза и остаточное смещение выше.
Полученные результаты заставляют заняться нам устранением выявлен-
ных недостатков штатной программы. Прежде всего, введем уточнение гра-
ниц сигнала до построения спектра и компенсации смещения, поскольку по-
строение спектра с захватом зоны отсутствия сигнала, которая превосходит
по ширине зону сигнала, может приводить к заметным искажениям спектра:
% Уточнение границ сигнала
dataAbs=abs(dataSlice);
c=2.0;
135

p=c*mean(dataAbs);
idxStart=find(dataAbs > p,1,'first');
idxEnd=find(dataAbs > p,1,'last');
dataSlice=dataSlice(idxStart:idxEnd);

Блок выглядит прозрачно и лаконично при использовании мощной и по-


лезной функции find(), которая может находить индексы в массиве, ам-
плитуды которых удовлетворяют заданным условиям. В данном случае мы
ищем первый и последний отсчеты, амплитуды которых превышают средний
уровень в 2 раза. Например, для необнаруженного сигнала графически это
выглядит так (рис. 3.40):

Рис. 3.40. Схема уточнения границ сигнала на примере


необнаруженного сигнала

На рисунке вся развертка соответствует интервалу построения спектра


штатной программой, красная линия — порог по которому оценивается про-
тяженность сигнала. Хорошо видно, что границы сигнала оцениваются точ-
но. Исключение из интервала построения спектра сигнала помеховых отсче-
тов позволяет несколько лучше оценить частотное смещение сигнала, однако
этого не достаточно. Модуляция сигнала информационными битами приво-
дит к значительным случайным флюктуациям максимума спектра. Если для
сигналов с фазовой модуляцией и амплитудно-фазовой модуляцией (PSK,
PAM, QAM) удается легко освободиться от модуляции фазы путем возведе-
ния сигнала в степень, соответствующую размеру алфавита символов [8], то
136

для GMSK сигналов эта процедура бесполезна. Видимо, можно немного


улучшить оценку смещения проводя ее не по одному, а нескольким отсчетам.
В любом случае очевидна необходимость повторной оценки смещения непо-
средственно по фазе сигнала. Графики развернутой фазы сигналов (рис. 3.34-
3.39) наталкивают, по крайней мере, на два способа измерения частотного
смещения. Первый способ — провести прямую методом наименьших квадра-
тов (МНК) на интервалах незначительной флюктуации фазы. Визуальный
выбор таких интервалов достаточно очевиден и приведет к хорошим резуль-
татам, реализация алгоритма потребует усложнения логики алгоритма. Вто-
рой способ — провести прямую по всем отсчетам и затем, исключив отсчеты
фазы, далеко отстоящие от проведенной прямой, повторить МНК. Приведем
реализацию и результаты работы второго способа:
function df = FineFreqSynchr1(ph, SampleRate)
% Функция для оценки смещения частоты по фазе для GMSK сигналов.
% Проводится линейное МНК на всем интервале, затем повторное МНК
% с исключением отсчетов удаленных от полученной прямой на
% заданную величину
% ph - массив фаз после удаления биений в окрестности
% плюс(минус)ПИ (развернутая фаза)
% SampleRate - частота квантования в герцах
% df - смещение в герцах

dph=4; % порог при исключении отсчетов при повторном МНК

% Приведение средней фазы к нулю:


ph=ph-mean(ph);

Lph=length(ph);
dt=1/SampleRate;
t=(0:dt:dt*(Lph-1))';

p=polyfit(t,ph,1); % линейный МНК


phLS=p(1)*t+p(2); % полученная прямая

% Повторное МНК с исключением удаленных значений фаз:


Ind=find(abs(ph-phLS) <= dph);
p=polyfit(t(Ind),ph(Ind),1); % линейный МНК
df=p(1)/(2*pi); % оценка смещения частоты в Гц

Опять же благодаря функции find()реализация повторного МНК по-


лучилась весьма лаконичной. На рисунке 3.41 приведен результат обработки
необнаруженного сигнала из фрейма 1:
137

Рис. 3.41. Графическая интерпретация оценки частотного смещения


по фазе сигнала от 3-го судна (фрейм 1, сбой по CRC)

Во-первых, мы видим, что оценка смещения по спектру сигнала срабо-


тала лучше. На рис. 3.36 на длительности сигнала фаза меняется на ~120 ра-
диан, здесь это ~60 радиан. Синхроимпульс и сам сигнал теперь выглядят
ничуть не хуже остальных 5 обнаруженных сигналов. Развернутая фаза того
же сигнала после устранения измеренного частотного смещения выглядит
так (рис. 3.42):
138

Рис. 3.42. Развернутая фаза сигнала от 3-го судна после окончательного


устранения частотного смещения (фрейм 1, сбой по CRC)

Ясно, что такой сигнал будет успешно декодирован. Действительно по


этому сигналу мы получаем следующее сообщение:
corr=0.979, msgType = 3
MMSI:367367470 Latitude:42.3597 Longitude:-71.0464
0C579654B81FC35EBAC675183D06E3302DDC0020C0348C

Коэффициент корреляции синхроимпульса превысил ранее зафиксиро-


ванные коэффициенты корреляции по всем пяти остальным обнаруженным
сигналам и вплотную приблизился к 1. По выданному идентификатору MMSI
на сайте www.marinetraffic.com узнаем информацию о судне (рис. 3.43):
139

Рис. 3.43. Данные о судне, сигнал которого не обнаружен


штатной программой

Это тоже судно класса A, номер сообщения, в отличие от 5 других су-


ден, третий.
Процедура оценки и устранения частотного смещения без использова-
ния функций fftshift(), comm.PhaseFrequencyOffset(), становит-
ся более прозрачной:
df = FineFreqSynchr1(rxAngles,SampleRate);
omeg=-2*pi*df;
dt=1/9600; % интервал передачи одного символа (с)
dtf=dt/samplesPerSymbol; % интервал дискретизации (с)
N1=length(rxAngles);
t=(0:dtf:dtf*(N1-1))';
rxfShifted = dataShifted.*exp(1i*omeg*t);

Далее следует гауссова фильтрация:


% GMSK Filter
rxfShifted = filter(gx,1,rxfShifted);
140

Необходимо особо отметить, что применение такого фильтра к сигналам


с большими частотными смещениями разрушает фазовую структуру сигнала.
Использование его до оценки смещения по спектру сигнала для изучаемых
сигналов полностью их разрушает (не одно сообщение не выделяется), ис-
пользование перед второй ступенью оценки смещения незначительно
уменьшает корреляцию с синхроимпульсом.
Рассмотрим теперь блок поиска синхроимпульса штатной программы. К
нему тоже есть серьезные замечания. В соответствии с приведенным текстом
принятие решения производится не по коэффициенту корреляции, а по
свертке, но это не всегда эквивалентно. На рисунке 3.44 приведены зависи-
мости значения скользящей свертки и коэффициента корреляции идеального
синхроимпульса с реализациями развернутой фазы для одного из обнару-
женных сигналов (зависимости приведены к одному масштабу делением
свертки на коэффициент 15):

Рис. 3.44. Сравнение результатов свертки и коэффициента корреля-


ции для судна 367513020 (1 сигнал фрейма 2)

Как видим, отсчеты соответствующие максимальным значениям свертки


и коэффициента корреляции могут сильно отличаться. Еще более важно, что
для используемого в AIS синусоидального синхроимпульса поведение обоих
статистик тоже носит синусоидальный характер, поэтому привязка к инфор-
мационной части сигнала только по синхроимпульсу очень часто может при-
водить к ошибкам декодирования. В блоке поиска синхроимпульса имеется
141

еще ошибка, видимо, механическая — поиск максимума проводится по мо-


дулю свертки, т.е. в некоторых случаях возможна привязка к отсчету, отно-
сительно которого реальный и идеальный синхроимпульсы находятся в про-
тивофазе. Не очень понятна также привязка к синхроимпульсу только внутри
границ символа (от отсчета с максимальной корреляцией вычисляется мо-
дуль по количеству отсчетов на символе):
[~,idx]=max(syncCorr);
samplePhase=mod(idx,samplesPerSymbol)+floor(samplesPerSymbol/2);

Представляется, что абсолютная привязка предпочтительнее:


samplePhase=idx + samplesPerSymbol/2;

Отметим, что использование коэффициента корреляции, поскольку это


нормированная величина, позволяет выставлять порог для дальнейшего про-
должения обработки, тем самым уменьшая время обработки фрейма.
Рассмотрим оставшиеся операции программы до получения всего сооб-
щения в двоичном виде:
% Решения о принятых битах – изменение фазы более pi/4 % прини-
маем за «1» (Make bit decisions - phase change greater
% than pi/4 is logical 1)
abits=zeros(size(rxfShifted(samplePhase:samplesPerSymbol:end)));
idx=find(abs(diff(step(phaseCalc,
rxfShifted(samplePhase:samplesPerSymbol:end))))>pi/4);
abits(idx)=1;

sb=1; % Номер первого бита после StartByte


% Среди первых 50 бит ищем StartByte flag (Search the first 50
% bits for the StartByte flag - 0x7E)
if length(abits)>56
for ii=2:50
if (sum(abits(ii:ii+5))==6 && abits(ii-1)==0 &&
abits(ii+6)==0 && sb==1)
sb=ii+7;
end
end
end

% Чтение номера сообщения и отправка бит в соответствующую


% функцию декодирования (Read the message type and route the
% bits to the correct decode function)
msgType=0;
if length(abits) >= sb+7
msgType=(2.^(0:5)*abits(sb+2:sb+7));
end
fprintf('msgType = %d\n',msgType);
142

% Следуя спецификациям AIS удаляем «0» после 5 последовательных


% «1». Это изменит также End flag (Follow AIS spec to unstuff
% after 5 consecutive 1's. This will unstuff everything, in-
cluding the end flag in the AIS message)
ubits=aisUnstuff(abits(sb:end));

% Декодирование сообщения в соответствии с его номером. Проверка


% кода CRC, переворот байтов и декодирование сообщения. (Decode
% message based on detected message type. Compute the checksum,
% compare to the received message bits, and if the checksum
% passes flip the bytes and decode the message.
switch msgType
case 1
if length(ubits)>=184
checkSum = step(crcGen,ubits(1:168));
if isequal(checkSum(169:184),ubits(169:184))
flippedData=aisFlipBytes(ubits(1:184));
cs=aisDecodeMsg1(flippedData);
validCRC=1;
else
validCRC=0;
end
else
validCRC=0;
end
case 2,3,4,5,18,19,21
end
% Удаление обработанного сигнала из исходных квадратур фрейма
% (Remove signal from data set)
data=[data(1:aisIdx(1));data(aisIdx(2):end)];

Как видим, формирование битового массива по полученной развернутой


фазе сигнала достаточно простое. Готовится нулевой массив необходимой
длины (количество отсчетов фазы деленное на 24), начиная от индекса при-
вязки к синхроимпульсу (samplePhase) с шагом 24 выбирается по одному
среднему отсчету на каждом символе, и если фаза изменилась более чем на
π / 4 , в битовый массив записывается 1. Имеет смысл исследовать варианты
принятия решения по сумме или максимуму среди нескольких средних от-
счетов символа.
Таким образом, мы дошли до места алгоритма, в котором будет задей-
ствована палочка-выручалочка технологии AIS, а именно до синхронизации
битового массива по Start Byte. Это позволяет успешно нивелировать огрехи
привязки по синхроимпульсу. Значение Start Byte равно 0x7E, что в двоич-
ной системе равно 01111110, комбинация симметричная относительно
младших и старших бит байта. Поэтому без переворачивания байт можно ис-
кать Start Byte. (напомним, что в AIS байт передается, начиная с младших
бит). Если бы он не был симметричен, то возникли бы проблемы, поскольку
на этом этапе границы байт неизвестны. При нахождении Start Byte форми-
143

руется параметр sb равный номеру первого бита после Start Byte. Приведем
результаты поиска синхроимпульса и Start Byte для штатной и доработанной
программ (таблица 3.3):
Таблица 3.3
Коэффициент Коэффициент
Sb Sb
№ фрейма № сигнала корреляции корреляции
Штатная программа Доработанная программа
1 0.649 39 0.990 27
1 2 0.788 37 0.992 27
3 Сбой CRC - 0.979 27
1 0.319 37 0.966 33
2 2 0.499 35 0.866 30
3 0.889 38 0.965 31

После доработок коэффициент корреляции реального и идеального син-


хроимпульсов вышел на значения близкие к 1 (не менее 0.97 для всех сигна-
лов, кроме 2-го сигнала во втором фрейме, где значение составило 0.87). Раз-
личные значения привязки к Start Byte (параметр sb) говорят о привязке к
синхроимпульсу со смещением. Только для первого фрейма выданы дорабо-
танной программой одинаковые значения sb. Таким образом, действительно,
без привязки к Start Byte, процент правильно декодированных сообщений,
даже для мощных сигналов, значительно бы сократился. Очень возможно,
что использование не периодического синхроимпульса позволило бы более
точно привязываться к нему, однако с учетом привязки к Start Byte общие
характеристики декодирования вряд ли бы заметно улучшились.
Отметим, что по имеющимся записям сигналов AIS необходимость в
двухступенчатом устранении смещения по частоте приемника и передатчика
отсутствует. Отключение первичной оценки смещения по спектру сигнала с
точностью до трех знаков после запятой приводит к тем же коэффициентам
корреляции, которые приведены в таблице 3.3. В таблице 3.4 приведены
смещения рассматриваемых сигналов судов по частоте до и после их коррек-
ции спектральным методом (указаны так же на рис. 3.28-3.33), которые
успешно устраняются фазовым методом:
144

Таблица 3.4
Смещение по-
Смещение без
сле спек-
№ фрейма № сигнала спектрального
трального ме-
метода (Гц)
тода (Гц)
1 -580 -6537
1 2 -209 -56763
3 449 -57578
1 16 -6554
2 2 -8 -56865
3 -115 -6469

Как видим, фазовый метод вполне справляется с частотным смещением,


по крайней мере, до 57 кГц.
После привязки к Start Byte определяется номер сообщения. Обратите
внимание, что перевод номера сообщения в десятичный вид осуществляется
с переворачиванием бит. Далее сформированные биты, начиная с первого би-
та после Start Byte, записываются в другой массив с исключением всех «0»
следующих после 5 подряд идущих «1». Напомним, что при формировании
сообщения для предотвращения образования ложных флагов, после каждых
5 последовательных «1» вставляется 0. Далее по типу сообщения определяет-
ся длина сообщения и проверяется код CRC, в случае совпадения, в каждом
байте переворачиваются младшие и старшие биты и полученный поток бит
поступает на извлечение параметров судна. Отсюда следует, что при форми-
ровании сообщения переворачивание битов происходит до формирования
кода CRC, а лишние «0» добавляются после. Как уже указывалось выше,
разработчики программы ограничились только печатью основных парамет-
ров судна.
Завершим раздел исследованием возможностей обнаружения более сла-
бых сигналов AIS, нежели записи имеющихся сигналов. Поскольку пока от-
сутствуют записи слабых сигналов на фоне реальных помех, будем умень-
шать отношение сигнал/помеха добавлением к реальной помехе хорошо зна-
комого нам белого нормального шума.
Прежде всего, проведем измерение отношения сигнал/помеха по име-
ющимся записям. Для этого вставим в доработанную программу, сразу после
уточнения границ сигнала, блок измерения отношения сигнал/помеха:
% Измерение отношения с/п:
didx=idxEnd-idxStart+1;
145

Ps=sum(abs(dataSlice(idxStart:idxEnd).^2))/didx;
Lds=length(dataSlice);
idxNS1=max(1,idxStart-didx);
idxNE1=max(1,idxStart-1);
idxNS2=min(Lds,idxEnd+1);
idxNE2=min(Lds,idxEnd+didx);
Pn1=sum(abs(dataSlice(idxNS1:idxNE1)).^2)/
(idxNE1-idxNS1+1);
Pn2=sum(abs(dataSlice(idxNS2:idxNE2)).^2)/
(idxNE2-idxNS2+1);
qizm=10*log10(2*Ps/(Pn1+Pn2));
fprintf('qizm=%.2f\n',qizm);

Блок измеряет мощность сигнала (квадрат амплитуды) на вычисленном


интервале существования сигнала, мощность помехи оценивается на двух
интервалах такой же длины справа и слева от сигнала. Вычисления ведутся
по массиву квадратур до сужения сигнала по уточненным границам. По-
скольку возможно сужение интервалов оценки помех длиной выбранного
массива, введена соответствующая процедура вычисления индексов, не поз-
воляющая им выйти за пределы массива. В результате работы блока получе-
ны следующие значения отношения сигнал/помеха для рассматриваемых
сигналов (таблица 3.5):
Таблица 3.5
Отношение
№ фрейма № сигнала сигнал/помеха
(дБ)
1 25.5
1 2 17.3
3 10.5
1 19.5
2 2 15.7
3 10.1

Приведенные значения в целом соответствуют, тому мы видим на ри-


сунках 3.23 и 3.24, если учесть, что при нанесении больших массивов на гра-
фик отсчеты сливаются, и мы видим максимальный уровень отсчетов, а не
средний. Например, из рисунка 3.23 средний уровень помех визуально оце-
нивается примерно как 0.15. Нанесенные на график 100 помеховых отсчетов
амплитуды в окрестности наиболее мощного сигнала выглядит так:
146

Рис. 3.45. Уровень помех возле сигнала 1 фрейма 2 при возможности


наблюдения величин всех отсчетов

Из рисунка хорошо видно, что реальный уровень помех около 0.05.


Теперь рассмотрим, при каких уровнях помехи исследуемые алгоритмы
смогут выделить корректные сообщения из имеющихся сигналов.
Наложение помех на реальную информацию реализуем сразу после по-
лучения отсчетов фрейма:
% Наложение белого шума:
snr=6; % отношение сигнал/помеха (signal/noise ratio) в дБ
sigma=10^(-snr/20)/sqrt(2);
NN=length(data);
gaussnoise=(randn(NN,1)+1i*randn(NN,1))*sigma;
data = data + gaussnoise;

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


(СКО) датчика нормальных случайных чисел, что и при моделировании дру-
гих сигналов в [5,8], исходя из единичной мощности сигнала и наложения
только белого нормального шума. При наложении белого шума на реальную
помеху ситуация меняется, корректной формулой является следующая:
ps
q = 10 lg .
pn + p g
147

Здесь ps — мощность сигнала, p n — мощность реальной помехи, p g —


мощность гауссова белого шума, все в линейных единицах. Отсюда СКО бе-
лого шума для получения отношения с/п q (дБ) должна вычисляться по фор-
муле:

σ g = 0.5 p s (10 − q − 10 − q0 ) . (3.1)

Здесь q0 — отношение сигала к реальной помехе в дБ, нормировка на


2 , как и в случае воздействия на сигнал только белого шума, возникает из-
за наличия двух квадратурных каналов. Понятно, что для получения исход-
ного отношения с/п q0 СКО белого шума должно быть равно 0 и его даль-
нейшее повышение невозможно. Это же хорошо видно и по приведенной
формуле. Для рассматриваемого наиболее мощного сигнала первого фрейма
p s = 1.237, q0 = 25.5 дБ (по результатам работы блока измерения отношения
с/п).
Результаты корректного выделения первого сигнала из первого фрейма
для штатной программы (ошибка с поиском синхроимпульса по модулю
свертки исправлена) и доработанной программы, приведены в таблице 3.6:
Таблица 3.6
Отношение сигнал/помеха (дБ)
Программа 4 5 6 7 14.5 15.5 16.5
Частота выделения сообщения
Штатная 0 0 0 0 0.5 0.6 1
Доработанная 0.4 0.7 0.8 1 1 1 1

Вычисление СКО белого шума выполнено в соответствии с формулой


3.1. Частота выделения сообщения приведена по 10 запускам программ для
каждого отношения с/п, что не обеспечивает достаточную точность, но
вполне позволяет сделать необходимые выводы. Мы можем теперь рассмот-
ренные выше недостатки штатной программы оценить в единицах отноше-
ния с/п для заданного уровня частоты выделения сообщения. Для частоты
близкой к 0.9 потери составляют около 10 дБ. На рисунке 3.46 приведена
реализация амплитудной развертки для отношения с/п 4 дБ, при котором
частота выделения сообщения после доработок около 0.5. Красная линия со-
ответствует порогу для уточнения зоны присутствия сигнала. Хорошо видим,
что предложенная простая процедура уточнения зоны присутствия сигнала,
148

хорошо работающая по мощным сигналам (рис. 3.40), приведет к сильному


расширению зоны за счет случайных помеховых выбросов:

Рис. 3.46. Интерпретация работы блока уточнения зоны


сигнала для малых значений отношения с/п

Таким образом, одно из основных направлений дальнейшего совершен-


ствования алгоритма выделения сообщений, должно заключаться в совер-
шенствовании метода определения зоны присутствия сигнала. Причем мы
легко можем оценить предельное значение выигрыша в этом случае. Для это-
го проведем выделение сигнала, указав в программе зону сигнала, вычисляе-
мую при воздействии на сигнал только реальных помех. Для отношения с/п
-2 дБ частота выделения сигнала равна 0.7, а для -1 дБ — 1.0. Таким
образом, предельное значение выигрыша от совершенствования блока опре-
деления зоны присутствия сигнала, составляет около 8 дБ. Понятно, что ви-
зуальное наблюдение сигнала при отношении с/п -1 дБ на амплитудной
развертке не возможно, но фаза сигнала еще хорошо сохраняется, что под-
тверждается коэффициентом корреляции 0.975 с синхроимпульсом и ри-
сунком 3.47 (сравните с рис. 3.34, в отличие от него здесь смещение частоты
убрано фазовым методом):
149

Рис. 3.47. Развернутая фаза 1-го сигнал фрейма 1


(судно 367164250) при дополнительном воздействии
белого шума с итоговым отношением с/п -1 дБ

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


( p s = 1.269, q0 = 19.5 дБ) для обеих программ приведены в таблице 3.7:
Таблица 3.7
Отношение сигнал/помеха (дБ)
Программа -1 0 1 2 3 4 5 6 7 8
Частота выделения сообщения
Штатная 0.5 0.6 0.8 0.8 0.9 0.9 0.9 0.9 0.9 0.9
Доработанная 0.5 0.6 0.7 0.9 1 1 1 1 1 1
150

Как видим из таблиц 3.6 и 3.7, для уверенного обнаружения первого


сигнала из второго фрейма требуется примерно на 4 дБ меньшее отношение
с/п, чем при обнаружении первого сигнала из первого фрейма, причем ре-
зультаты обоих программ почти сравнялись. В первую очередь это объясня-
ется значительно меньшим смещением по частоте сигнала из второго фрейма
(-6.5 кГц вместо -57 кГц, таблица 3.4). Недостатки штатной программы
проявились в отсутствии выхода на единичный уровень частоты выделения
сигнала по крайней мере до отношения с/п 8 дБ.

3.4.3. Исследование сигналов судов в акватории Бугского лимана


Рассмотрим теперь результаты обнаружения сигналов судов в акватории
Бугского лимана. К сожалению, в аудиториях Института автоматики и элек-
тротехники, сигналы крупных судов класса А, постоянно в большом количе-
стве находящихся в акватории Бугского лимана от Черноморского завода су-
достроительного завода до предприятия «Нибулон», сильно ослабляются го-
родскими застройками, и выделить их на фоне шумов не удается. Эти кораб-
ли очень редко проходят выше по течению в сторону судостроительного за-
вода им. 61 коммунара. Однако, особенно летом, там ходят небольшие про-
гулочные и прочие судна класса B. Минимальное расстояние до таких судов
от здания Института автоматики и электротехники составляет всего около 1
км и это пространство мало застроено. Оказалось, что сигналы таких судов
вполне хорошо могут быть декодированы рассмотренными программами. В
таблице 3.8 приведены сводные результаты сеансов обнаружения сигналов
AIS, полученные в конце июля 2018 года (названия судов приведены в соот-
ветствии с латинской транскрипцией, передаваемыми самими суднами в типе
сообщения 5):
151

Таблица 3.8
Количество полученных сообще-
Дальность
ний
Дата Время MMSI Название судна до судна
В штатной про- В доработан-
(км)
грамме ной программе
19.07.2018 22:17:22-22:19:52 272160100 Lubov Ivanova 1 3 1,11-1,29
20.07.2018 20:59:49-21:08:50 272158400 Nodari Chanturiia 10 29 1,21-1,45
24.07.2018 16.26.47-16:59:58 272157700 Yurii Makarov 21 75 1,24-1,93
24.07.2018 17:39:07-18:04:38 272157700 Yurii Makarov 17 58 1,18-1,58
24.07.2018 19:59:18-20:08:18 272160100 Lubov Ivanova 2 2 1,15-1,39
24-25.07.2018 22:39:29-00:58:28 272158400 Nodari Chanturiia 45 148 1,35-1,89
26.07.2018 14:48:58-15:15:07 272160300 Mykolaivets 6 31 1,24-1,96
Всего 101 343
152

Ввод на сайте www.marinetraffic.com указанных в таблице номеров


MMSI привел к получению следующих данных по этим судам (рис. 3.48-
3.52):

Рис. 3.48. Данные о судне Lubov Ivanova


(MMSI 272160100 ) за 19.07.2018

Рис. 3.49. Данные о судне Nodari Chanturiia


(MMSI 272158400) за 20.07.2018
153

Рис. 3.50. Данные о судне Yurii Makarov


(MMSI 272157700) за 24.07.2018

Рис. 3.51. Данные о судне Nodari Chanturiia


(MMSI 272158400) за 24-25.07.2018
154

Рис. 3.52. Данные о судне Mykolaivets


(MMSI 272160300) за 26.07.2018

Отметим, прежде всего, что на рис.3.49-3.51 мы действительно видим


значительное количество суден находящихся в акватории Бугского лимана от
Черноморского завода судостроительного завода до предприятия «Нибулон»
(отображаются на карте цветными кружками).
Нанесение на карту географических координат, переданных судном, еще
раз подтверждают нахождение судна в момент получения от него сигналов
AIS, в части акватории Бугского лимана ближайшей к приемной антенне
(здание Института автоматики и электротехники). Например, для судна No-
dari Chanturiia в сеансе наблюдения за 20.07.2018 его координаты на карте
расположены следующим образом (рис. 3.53):
155

Рис. 3.53. Переданные судном Nodari Chanturiia


координаты в сеансе наблюдения 20.07.2018

Расстояние от судна до приемной антенны при получении первого сиг-


нала составило 1.38 км, при получении последнего — 1.45 км, минимальное
расстояние — 1.21 км.
От этого же судна в ночь с 24 на 25 июля получено 145 сообщений в те-
чение более двух часов с 22:39:29 до 0:58:28 с перерывом с 22:56:59 до
23:47:12, очевидно связанном с выходом и возвращением судна в зону прие-
ма сигналов AIS. На карте полученные координаты выглядят следующим об-
разом (при отсутствии изменений переданных координат они не наносились):
156

Рис. 3.53. Переданные судном Nodari Chanturiia


координаты в сеансе наблюдения 24-25.07.2018

Здесь красные метки соответствуют полученным данным до выхода из


зоны контроля, зеленые – после повторного возвращения. Как видим, судно
останавливало движение и некоторое время дрейфовало недалеко от берега.
Расстояние от судна до приемной антенны при получении первого сигнала
составило 1.48 км, при получении последнего — 1.87 км, минимальное рас-
стояние — 1.35 км. Таким образом, дальность приема сигналов AIS от суден
класса B составляет около 2 км при сравнительно не плотной застройке капи-
тальными строениями пути распространения сигналов.
В процессе наблюдения больше всего получено сообщений 1-го типа, в
несколько раз меньше сообщений 3 типа, судно Lubov Ivanova передавало
только 18-го типа сообщения (длина всех таких сообщений 168 бит без кода
CRC), а также практически от всех суден получены расширенные сообщения
5-го типа (длина сообщения 424 бита), которые после декодирования выгля-
дят так:
MMSI:272158400 Call Sign:UXEH@@@ Ship Name:NODARI_CHANTURIIA@@@
Ship Type:52 Destination:NIKOLAEV_______@@@@@
MMSI:272157700 Call Sign:UXDZ@@@ Ship Name:YURII_MAKAROV@@@@@@@
Ship Type:52 Destination:NIKOLAEV_@@@@@@@@@@@
157

Рассмотрим теперь сами полученные радиосигналы. Они ощутимо сла-


бее сигналов, записанных в окрестностях Бостона. Максимальные значения
отношения сигнал/помеха достигают 14 дБ (при измерении во всей полосе
сигнала) и на амплитудной развертке выглядят, например, так (рис 3.54,
красным цветом показана зона выделения сигнала):

Рис. 3.54. Амплитудная развертка сигнала во всем фрейме


от судна Nodari Chanturiia в сеансе наблюдения
20.07.2018 (время 21:08:30)

Как видим, зона сигнала примерно в 2 раза завышена, рассмотренная


выше процедура уточнения зоны присутствия сигнала (см. рис. 3.40) и здесь
позволяет точно определить границы сигнала (рис. 3.55):
158

Рис. 3.55. Амплитудная развертка сигнала в первоначально определенной


зоне от судна Nodari Chanturiia в сеансе наблюдения
20.07.2018 (время 21:08:30)

Спектр сигнала имеет относительно небольшое отрицательное смещение


-9.3 кГц (рис 3.56):

Рис. 3.56. Спектр сигнала в уточненной зоне


от судна Nodari Chanturiia в сеансе наблюдения
20.07.2018 (время 21:08:30)
159

Как видим, отношение сигнал помеха в максимуме спектральной мощ-


ности достигает 35 дБ. Естественно, в этих условиях фаза сигнала должна
выглядеть идеально, что подтверждается рисунком 3.57:

Рис. 3.57. Развернутая фаза сигнала от судна Nodari Chanturiia


в сеансе наблюдения 20.07.2018 (время 21:08:30)

Смещение по частоте полностью убрано, коэффициент корреляции с


идеальным синхроимпульсом 0.975.
Минимальные отношения сигнал/помеха по корректно выделенным со-
общениям приближаются к 0 дБ. Такие сигналы на амплитудной развертке
визуально практически не детектируются. Например, один из сигналов полу-
ченный от судна Lubov Ivanova, выглядит так (рис. 3.58):
160

Рис. 3.58. Амплитудная развертка сигнала во всем фрейме


от судна Lubov Ivanova в сеансе наблюдения
19.07.2018 (время 22:17:22)

Измеренное отношение сигнал/помеха во всей полосе сигнала составило


0.4 дБ. Чуть более заметен сигнал в вычисленной зоне (рис. 3.59):

Рис. 3.59. Амплитудная развертка сигнала в первоначально


определенной зоне от судна Lubov Ivanova в сеансе наблюдения
19.07.2018 (время 22:17:22)
161

Как видим, для таких слабых сигналов уточнить зону присутствия сиг-
нала не удается. Тем не менее, в спектральной области сигнал хорошо виден
(рис 3.60):

Рис. 3.60. Спектр сигнала от судна Lubov Ivanova


в сеансе наблюдения 19.07.2018 (время 22:17:22)

Смещение сигнала по частоте значительно выше, чем у предыдущего


рассмотренного сигнала, и составило -59 кГц. Развернутая фаза сигнала в
этом случае выглядит так (рис. 3.61):
162

Рис. 3.57. Развернутая фаза сигнала от судна Lubov Ivanova


в сеансе наблюдения 19.07.2018 (время 22:17:22)

Несмотря на двукратное превышение зоны присутствия сигнала, смеще-


ние по частоте удалось измерить практически точно и безошибочно опреде-
лить значения всех бит в сообщении.
В заключение сопоставим различные данные, полученные в данном раз-
деле. Прежде всего, вернемся к таблице 3.8, где приведено, что при обнару-
жении сигналов AIS в акватории Бугского лимана доработанной программой
всего выделено 343 сообщения с корректным кодом CRC, тогда как по запи-
сям квадратурных каналов штатная программа корпорации MathWorks выде-
ляет всего 101 сообщение. Таким образом, частота обнаружения после пред-
ложенных доработок увеличилась более чем в 3 раза.
В подразделе 3.2 мы получили кривую зависимости BER от отношения
с/п для GMSK сигнала с параметрами, которые используются в технологии
AIS (рис 3.21). Из рисунка в частности следует, что для достижения BER 10-4
достаточно отношение сигнал/помеха около -5 дБ, измеренное во всей полосе
сигнала. Это обеспечит обнаружение коротких сообщений AIS длиной 168
бит с частотой 0.98. Для обнаружения половины сигналов достаточно иметь
BER 10-2.5 , соответственно, отношение с/п должно быть около -7 дБ. Однако
это получено для идеализированной модели. Выше отмечалось (с. 110), что
реализованная в MATLAB модель канала передачи информации с модуля-
цией GMSK сильно упрощена, что не позволит подтвердить указанные ха-
рактеристики в реальных каналах связи. Упрощение, прежде всего, относится
к предположению идеальной временной синхронизации и отсутствию сме-
163

щения по частоте между передатчиком и приемником. После знакомства с


реальными сигналами AIS и алгоритмами их обнаружения, мы хорошо знаем,
что решение этих двух проблем являются ключевым для успешного функци-
онирования всей технологии. Временная синхронизация должна присутство-
вать во всех без исключения системах связи, а необходимая точность сведе-
ния частот зависит от вида используемой модуляции. Так для технологии
ADS-B, используемой для сопровождения воздушных суден, нам не понадо-
билось цифровое сведение частот из-за использования амплитудной модуля-
ции, которая гораздо менее чувствительна к рассогласованию частот, нежели
сигнал GMSK переносящий информацию в фазе.
Действительно, измерения возможностей обнаружения реальных сигна-
лов AIS на фоне белого шума в п. 3.4.2. показало, что при обнаружении сиг-
нала со значительным смещением частоты для обнаружения примерно поло-
вины сигналов AIS необходимо отношение с/п около 4 дБ (таблица 3.6), то-
гда как при малых смещениях для этого достаточно -1 дБ (таблица 3.7). Еди-
ничное обнаружение сигнала от судна Lubov Ivanova с отношением с/п 0.4 дБ
и значительным смещением по частоте не противоречит полученным дан-
ным. Точное же измерение частоты обнаружения от отношения с/п для сиг-
налов AIS на фоне реальных помех достаточно сложно, поскольку необходи-
мо будет как-то фиксировать наличие сигнала судна в условиях не совпаде-
ния кода CRC.
164

3.5. Задания для лабораторных, курсовых работ


и дипломных проектов

Вариант 1.
Исследовать в Matlab эффективность демодулятора
comm.GMSKDemodulator(), использующего алгоритм динамического
программирования Витерби, для демодуляции сигналов AIS.
Вариант 2.
Исследовать возможность использования записей сигналов судов, вы-
ложенных в Интернет, для отработки алгоритмов обнаружения сигналов AIS
(например, по адресу: https://github.com/freerange/ais-on-sdr/wiki/Capturing-
raw-AIS-data-using-rtl_fm-and-decoding-using-aisdecode)
Вариант 3.
На языке С++ или в Matlab написать программу выделяющую из 16-
ричного сообщения AIS следующие параметры:
• Индикатор повторения (Repeatindicator);
• Навигационный статус (Navigational status);
• Скорость разворота (Rate of turn - ROTAIS).

Вариант 4.
На языке С++ или в Matlab написать программу выделяющую из 16-
ричного сообщения AIS следующие параметры:
• Скорость движения (Speed over ground – SOG);
• Точность измерения позиции (Position accuracy);
• Курс по Земле (Course over ground – COG).

Вариант 5.
На языке С++ или в Matlab написать программу выделяющую из 16-
ричного сообщения AIS следующие параметры:
• Истинное направление движения (True heading);
• Метка времени (Time stamp);
• Индикатор специального маневра (Special maneuver indicator).
165

Вариант 6.
На языке С++ или в Matlab написать программу выделяющую из 16-
ричного сообщения AIS следующие параметры:
• RAIM-flag;
• Состояние связи (Communication state).

Вариант 7.
Исследование эффективности методов оценки частотного смещения на
модели сигнала GMSK в Matlab.
Вариант 8.
Исследование влияния гауссова фильтра на сигналы GMSK с большим
смещением по частоте.
Вариант 9.
Реализация и оценка эффективности последовательного во времени ал-
горитма обнаружения сигналов AIS.
Вариант 10.
Сравнительная оценка эффективности различных вариантов отбора од-
ного отсчета на длительности символа для принятия решения (отсчет с мак-
симальной амплитудой сигнала, среднее значение нескольких отсчетов, один
средний отсчет).
Вариант 11.
Исследование на моделях эффективности использования не периодиче-
ских синхроимпульсов в технологии AIS.
Вариант 12.
Исследование устойчивости рассмотренных алгоритмов обнаружения
сигналов AIS к наложению на реальные сигналы морских судов белого гаус-
сова шума различной мощности.
Вариант 13.
Проведение работ по приему сигналов AIS от морских судов в аквато-
рии Бугского лимана.
166

4. ИССЛЕДОВАНИЕ РЕАЛЬНЫХ СПУТНИКОВЫХ СИГНАЛОВ


К сожалению, частоты, на которых ретранслируют цифровую информа-
цию большинство спутников, находятся за пределами рабочего диапазона
дешевых приемников RTL-SDR (25 МГц – 1.75 ГГц). Спутниковое вещание
ведется в двух основных диапазонах — C-Band и Ku-Band. В диапазоне C (4
ГГц) вещают в основном американские и российские спутники, в диапазоне
Ku (10.700-12.750 ГГц) — европейские. В настоящее время в диапазоне С
спутниковые сигналы можно принимать с помощью программно-
определяемых радиосистем USRP (Universal Software Radio Peripheral). Та-
кие радиоустройства обеспечивают диапазон частоты до 6 ГГц с мгновенной
шириной полосы пропускания до 56 МГц, однако, их стоимость начинается
после $1000. В настоящем пособии мы ограничимся анализом записи спут-
никового сигнала, имеющегося в распоряжении авторов после проведения
одной из НИР в 2006-2008 годах.
4.1. Стандарт передачи Интернет данных через
спутниковые каналы связи
Прежде всего, отметим, что стандарт передачи цифровой информации
по спутниковым каналам в США и Европейских странах очень подробно
описан и доступен. Таким стандартом в США занимается Ассоциация теле-
коммуникационной промышленности - Telecommunications Industry Associa-
tion (TIA).
На рисунке 4.1 приведен титульный лист этого стандарта (версия 2006
года) [11]:
167

Рис. 4.1. Стандарт передачи данных через


спутниковые каналы связи

В документе на 247 страницах очень обстоятельно и подробно описаны


способы формирования цифровой информации для передачи по спутниковым
каналам, начиная с физического уровня.
Прежде всего, посмотрим, какие виды манипуляции заложены в спутни-
ковые каналы связи. Полный набор видов манипуляции и корректирующих
кодов верхнего уровня для режима DVB-S2 (digital video broadcasting via sat-
ellite, second generation — цифровое телевизионное вещание через спутник,
второе поколение) приведен в таблице 4.13.12.1-2 стандарта (рис. 4.2):
168

Рис. 2.2. Варианты манипуляции и коды верхнего


уровня в режиме DVB-S2

Как видим, в цифровом телевидении второго поколения используются


знакомые нам виды манипуляции QPSK и 8-PSK [5], а также манипуляция
APSK (amplitude and phase-shift keying — амплитудно-фазовая модуляция),
которая очень близка опять же знакомой нам QAM манипуляции. В отличие
от QAM манипуляции, при APSK манипуляции комплексную плоскость де-
лят не параллельными осям линиями, а концентрическими окружностями,
как показано на рисунке 4.3 для 16-APSK:
169

Рис. 4.3. Фазовый портрет (созвездие) сигнала 16-APSK

К преимуществам APSK манипуляции в сравнение с QAM относят


меньшее количество уровней изменения амплитуды, меньшую мощность
сигнала и большее уменьшение BER при использовании Грей кодировки то-
чек созвездия. В то же время отмечают преимущество QAM при больших ко-
личествах точек созвездия. К сожалению, в MATLAB модулятор и демоду-
лятор сигналов APSK не реализован в том виде, который мы использовали
для рассмотренных нами видов манипуляции. Правда, на сайте компании
MathWorks можно найти программы, так или иначе моделирующие APSK
сигналы.
Из этой же таблицы мы видим, что на верхнем уровне протокола ис-
пользуются знакомые нам коды БЧХ и коды LDPC (Low-Density Parity-
Check) — код с малой плотностью проверок на чётность. Это блоко-
вый линейный код с проверкой чётности. Особенностью является малая
плотность значимых элементов проверочной матрицы, за счёт чего достига-
ется относительная простота реализации средств кодирования. Его также
называют кодом Галлагера, по имени автора первой работы на тему LDPC-
кодов.
Информационный битовый массив перед передачей тем или иным видом
модуляции, подвергается большому количеству преобразований, которые
обеспечивают при надлежащей обработке безошибочное восстановление ис-
ходного информационного потока. Сразу отметим, что в стандарте отсут-
ствуют какие-либо рекомендации по обработке принимаемых сигналов.
Для примера рассмотрим схему верхнего уровня подготовки потока
цифровой информации для передачи от удаленных терминалов к основному
концентратору системы (inroute transmissions), приведенной на рисунке 3.5-1
стандарта (рис. 4.4):
170

Рис. 4.4. Схема верхнего уровня подготовки потока


информации в режиме inroute

Обработка немного отличается для терминалов классов А и В. Для тер-


миналов класса А сохранность пакетов обеспечивается 16-битным CRC, для
терминалов класса В — кодами БЧХ. В обоих случаях используется скрем-
блирование, причем коды CRC добавляются в пакет до скремблирования, ко-
ды БЧХ — после скремблирования. Далее применяется турбо-код и инфор-
мация подвергается табличному перемежению. После перемежения вначале
блока пакетов вставляются контрольные слова и битовый поток накладыва-
ется на несущую одним из методов манипуляции.
Основой турбо-кода является сверточный код (2,3), схема которого при-
ведена на рисунке 7.5:
171

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


сверточного кода

Как видим, код систематический и задается не полиномами, а уравнени-


ями рекурсии. Для повышения скорости кода применяется несколько схем
выкалывания.
На базе рассмотренного кода реализуется помехоустойчивый парал-
лельно-каскадный сверточный турбо-код Р2С3, широко используемый в
спутниковых системах связи (рисунок 4.6):
172

Рис. 4.6. Диаграмма параллельно-каскадного сверточного


турбо-кода Р2С3

Как видим, код является систематическим. Особенностью кода является


разделение на входе потока бит на три перекрывающиеся части (parser) и
раздельное формирование проверочных бит для каждой части. Первая часть
не подвергается перемежению, для второй и третьей части используются
разные схемы перемежения. Далее используется сверточный код (2,3) для
каждой части со своей процедурой выкалывания. Обратите внимание, что
перемежение внутри турбо-кода P2С3 и канальное перемежение (channel in-
terleaver), приведенное на рисунке 4.4, две отдельные процедуры, т.е. пере-
межение используется дважды (внутри кода используется табличное пере-
межение, затем матричное канальное перемежение).
Полная модель генерирования цифровой обработки для передачи ин-
формации от удаленных терминалов к основному концентратору системы
(inroute transmissions) была реализована одним из авторов настоящего посо-
бия для нужд обработки реальных спутниковых сигналов [12] .
Для передачи информации от основного концентратора пользователь-
ским терминалам (outroute transmissions) используются стандарты DVB-S или
DVB-S2 широкополосных спутниковых каналов, принятые Европейским
вещательным союзом (European Broadcasting Union — EBU). Первоначально
они предназначались для трансляции цифрового телевидения через спутни-
ковые каналы связи. Структура обработки информации значительно отлича-
ется от режима outroute transmissions. Не вдаваясь в подробности, отметим
два наиболее существенных различия. При канальном кодировании вместо
173

кодов CRC и БЧХ используется код Рида-Соломона (204,188,8), который яв-


ляется усечением стандартного кода РС (255,239,8) на базе байтового алфа-
вита (рисунок 4.7):

Рис. 4.7. Схема закрытия пакета кодом Рида-Соломона


в режиме outroute transmissions

В качестве внутреннего кода используется сверточный код скорости 1/2


с k = 7 (constraint length) и полиномами (0x171,0x133). Дополнительно вы-
калыванием реализуются скорости 2/3, 3/4, 5/6 и 7/8.

4.2. Краткое описание записи спутникового сигнала


Запись спутникового сигнала сделана 8.09.2006 года (объемом 39 Мб).
Для передачи используется модуляция QPSK. Условный интервал передачи
одного символа 1 мс. На каждом символе с приемника квантовалось 20 ком-
плексных амплитуд в формате 2-байтовых целых чисел. Перед записью сиг-
нал пропускался через фильтр Блэкмана с порядком 43, уровнем боковых ле-
пестков – 51 дБ и нормированной полосой по уровню подавления 0.2. На
каждом символе по выходу фильтра оставлялось 2 отсчета (фильтрация про-
изводится со сдвигом на 10 отсчетов).
4.3. Математическая модель сигналов с фазовой модуляцией
Прежде чем приступить к изучению реального сигнала, рассмотрим мо-
дель PSK сигналов следуя [5]. Упрощенно, модель фазовой манипуляции
можно описать следующим образом:

u s (t ) = Ae j (ω0t +ϕ +ψ k )
A — известная амплитуда сигнала
ω 0 — круговая частота, ω 0 = 2 π f 0 , где f 0 — несущая частота (после
снятия несущей — неизвестное смещение (ошибка) по частоте);
ϕ — начальная фаза (набегает при распространении сигнала);
174

ψ k — модуляция фазы в соответствии с передаваемым символом, меня-


ется через интервал ∆ t , k = 1 ... k 0 , k 0 — количество разбиений фазового
пространства, всегда равное степени 2, т.е. k 0 = 2
n0
. n 0 соответствует ко-
1
личеству передаваемых бит одной фазой. Если Fψ = , то скорость пере-
∆t
дачи информации V = n 0 ⋅ Fψ (бит/с). В реальных системах обычно
F 2π
f 0 ≤ ψ . Шаг изменения фазы k .
3 0

∆t ∆t
Измерения проводятся через интервал ... , т.е. на интервале одного
10 50
символа проводится от 10 до 50 измерений амплитуды квадратурных состав-
ляющих сигнала. При этом, как правило, возникает временная ошибка по
синхронизации, т.е. предполагаемое начало передачи нового символа на при-
емной стороне смещено на некоторую величину θ , не превосходящую не-
сколько интервалов измерения. Начальная фаза передающей стороны, как
правило, неизвестна на приемной стороне и ее также приходится оценивать.
Перечислим еще раз основные три величины, которые меняются во вре-
мени, следовательно, их необходимо оценивать во времени, т.е. алгоритмы
демодуляции должны адаптироваться к ним:
• Ошибка по частоте. Частота на передающей и на приемной стороне
не могут быть сведены абсолютно. Поэтому после снятия высокоча-
стотной несущей на приемной стороне мы имеем гармоническое ко-
лебание, а не константу.
• Ошибка по синхронизации. Начало передачи нового символа на при-
емной стороне может отличаться от реального начала;
• Начальная фаза сигнала. В процессе распространения сигнал приоб-
ретает случайное смещение по фазе.
Используется несколько видов фазовой манипуляции. Наиболее часто
используется дифференциальная фазовая манипуляция. В этом варианте фа-
за сигнала меняется не на значение фазы передаваемого символа, а на значе-
ние разности фаз, передаваемого и предыдущего символа. Например, если
дважды нужно передать один и тот же символ, то фаза вообще не меняется.
При k 0 = 2 говорят о двоичной фазовой манипуляции, используется при
этом аббревиатура BPSK (binary phase shift keying). При k 0 = 4 говорят о
квадратичной фазовой манипуляции, используется при этом аббревиатура
QPSK (quadrature phase shift keying). При дальнейшем увеличении k 0 его
значение приписывают перед аббревиатурой PSK (8-PSK, 16-PSK и т.д.)
175

Будем предполагать, что при передаче сигнала на него действует адди-


тивная гауссова (нормальная) помеха, т.е. на приемной стороне измеряется
сигнал

у ( t ) = u s (t ) + u p ,
для простоты предположим, что обе квадратуры
помехи одинаково распределены и независимы:

u p = x p + jy p ,
x p , y p ∈ N (0, σ 2p ).
Относительно временной зависимости отсчетов помехи можно рассмат-
ривать два часто используемых варианта. Если мы предположим независи-
мость временных отсчетов помехи, то получим так называемый белый шум.
Как правило, реальные сигналы обладают временной корреляцией, т.е.
каждое последующее значение сигнала зависит от его предыдущих значений.
Наиболее часто используемой моделью таких сигналов являются марковские
процессы или в дискретном случае, марковские последовательности. Наибо-
лее простыми являются марковские последовательности первого порядка, ко-
гда последующее значение зависит только от предыдущего и не зависит от
более ранних значений. Для нормального распределения при этом существу-
ют очень простые формулы для их генерации:

xi +1 = ρxi + σ p 1 − ρ 2 ξi
Здесь ρ - заданный коэффициент корреляции между соседними отсче-
2
тами сигнала, т.е. ρ = ρ ( xi , xi +1 ) , σ p — дисперсия (мощность помехи),
ξ i ∈ N (0;1) (нормально распределенная случайная величина с нулевым
средним и единичной дисперсией).
Марковские последовательности для разных коэффициентов корреляции
реализуется следующим текстом:
n=2000;
kpr=3;
ro=[0,0.99,0.999];
sro=sqrt(1-ro.^2);
x=zeros(kpr,n);
x(:,1)=randn(kpr,1);
for i=1:kpr
for j=2:n
x(i,j)=ro(i)*x(i,j-1)+sro(i)*randn;
end
end
176

figure
x(1,:)=x(1,:)+4;
plot(1:n,[x(1,:);x(2,:);x(3,:)]);
title('Марковские процессы');
legend('ro=0','ro=0.99','ro=0.999');

Одна из реализаций выглядит так (рисунок 4.8):

Рис. 4.8. Реализации белого шума и марковского процесса


для двух значений временной корреляции

При нулевом коэффициенте корреляции соседних временных отсчетов


мы получаем белый шум (на графике реализация белого шума приподнята
для исключения наложения на два других процесса). При увеличении коэф-
фициента корреляции дисперсия отсчетов относительно предыдущих снижа-
ется, при этом общая дисперсия остается без изменений.
Отношение сигнал помеха в децибелах вычисляется по следующей фор-
муле:
A
q = 20 lg .
σ p

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


мирующий фильтр.
177

4.4. Результаты сравнения реального спутникового сигнала


с моделью QPSK сигналов
Рассмотренная модель FSK манипулирования реализована для QPSK
сигналов в программе QPSKdemod одного из авторов настоящего пособия.
Программа также позволяет обрабатывать записи реальных сигналов. Рас-
смотрим вначале, как выглядит реальный спутниковый сигнал с QPSK мани-
пулированием в различных графических представлениях. На рисунке 4.9 по
фазовому портрету мы видим, что действительно записанный сигнал имеет
QPSK манипуляцию. Оценены основные параметры сигнала, без адаптации
по которым невозможно правильное декодирование. Некомпенсированное
смещение по частоте достаточно большое и составляет ~18.5 Гц. Наличие
смещения по частоте хорошо видно на графике фазы 4-ой степени сигнала
(рисунок 4.10). Оценка скорости изменения фазы, т.е. смещение по частоте,
получено линейным методом наименьших квадратов (МНК) после развора-
чивания фазы с интервала [-1800,1800] на всю прямую. Отметим, что для
оценки скорости изменения фазы PSK сигналов, как правило, используют
степень сигнала, соответствующую количеству разбиений фазового про-
странства, так как это приводит к устранению манипуляции. Действительно,
например для рассматриваемого QPSK сигнала:

4 j ( 2 πf 0 t + ϕ + k )
u s4 (t ) = e 4 = e j ( 2 π ( 4 f 0 ) t + 4ϕ + 2 π k ) = e j ( 2 π ( 4 f 0 ) t + 4ϕ )
Нужно только не забыть, измеренную таким образом скорость измене-
ния фазы разделить на 4.
178

Рис. 4.9. Фазовый портрет реального спутникового сигнала


с QPSK манипуляцией

Рис. 4.10. Изменение фазы во времени четвертой степени


выходного сигнала спутника и ее аппроксимация линейным МНК
179

Квадратуры входного сигнала и их 4-ая степень изображены на рисунках


4.11 и 4.12:

Рис. 4.11. Квадратуры выходного сигнала спутника

Рис. 4.12. 4-ая степень квадратур выходного сигнала спутника

Приведенные выборки из сигнала взяты на интервале хорошего отноше-


ния сигнал/помеха, на этой же записи есть интервалы времени с уменьшени-
180

ем уровня сигнала относительно помехи. Фазовый портрет при этом выгля-


дит так (рисунок 4.13):

Рис. 4.13. Фазовый портрет спутникового сигнала на интервале


уменьшения отношения сигнал/помеха

Теперь сравним реальную информацию с генерируемой по рассмотрен-


ной выше простой математической модели. Зададим в программу значения
трех основных параметров сигнала (смещение по частоте, фазе и синхрони-
зации), которые были оценены по реальному сигналу. На рисунке 4.14 при-
веден фазовый портрет моделируемого сигнала и оценки его параметров при
установленном отношении сигнал/помеха 12 дБ.
181

Рис. 4.14. Фазовый портрет моделируемого QPSK сигнала


с результатами оценки параметров

Как видим, все параметры оценены с хорошей точностью. Смещение по


частоте оценено с точностью до 0.05 Гц, по фазе — 0.10 , смещение по син-
хронизации — точно. Заданное в модели отношение сигнал/помеха 12 дБ
по размытости фазового портрета также соответствуют приведенному интер-
валу измерения реального сигнала. Кроме визуального сравнения размытости
можно сравнить вычисляемую в программе дисперсию отсчетов, которая со-
ставила по реальному сигналу 134 условные единицы, по модели — 138.
Приведем теперь аналоги рисунков 4.10, 4.11, 4.12 для моделируемого сигна-
ла (рисунки 4.15, 4.16, 4.17):
182

Рис. 4.15. Изменение фазы во времени четвертой степени


выходного сигнала модели и ее аппроксимация МНК

Рис. 4.16. Квадратуры выходного сигнала модели


183

Рис. 4.17. 4-ая степень квадратур выходного сигнала модели

Изменение фазы во времени сигнала спутника и моделируемого сигнала


(рисунки 4.10 и 4.15) практически не отличаются. Квадратуры сигналов от-
личаются (рисунки 4.11 и 4.16), однако надо учесть, что манипуляция этих
квадратур произведена разными последовательностями символов. После сня-
тия QPSK манипуляции возведением квадратур в четвертую степень (рисун-
ки 4.12 и 4.17), схожесть реального спутникового сигнала моделируемому
сигналу довольно высокая. Приведенные данные позволяют сделать вывод о
хорошем соответствии рассмотренной простой математической модели PSK
сигналов реальным сигналам. Выходная информация модели может исполь-
зоваться для отработки алгоритмов демодуляции. В заключение отметим, что
в программе QPSKdemod реализована возможность обрабатывать и модели-
ровать Offset QPSK и Differential QPSK сигналы. В режиме Offset QPSK
квадратуры смещают относительно друг друга на половину интервала пере-
дачи символа, что исключает смену фазы на 1800 приводящей к замиранию
сигнала. В режиме Differential QPSK (относительная или дифференциальная
фазовая манипуляция) фаза сигнала меняется на значение равное разности
фаз между текущим символом и предыдущим.

4.5. Задания для лабораторных, курсовых работ


и дипломных проектов
Предлагаемые задачи должны быть реализованы на языке С++.
1. Разработка спектр анализатора комплексного сигнала.
2. Разработка функции вычисления развернутой фазы комплексного
сигнала.
184

3. Оценка частотного смещения комплексного сигнала по его спектру с


учетом нескольких отсчетов в окрестности спектрального отсчета с
максимальной амплитудой.
4. Оценка частотного смещения комплексного сигнала по скорости из-
менения развернутой фазы сигнала.
5. Разработка функций для отображения на экране различных характе-
ристик комплексного сигнала (сигнальное созвездие, квадратуры, ам-
плитуда, фаза).
6. Разработка модели PSK сигналов с моделированием смещения по ча-
стоте, фазе и нарушения привязки к границе бит.
7. Разработка демодулятора PSK сигналов и его отработка по моделиру-
емой и реальной спутниковой информации.
8. Разработка модели APSK сигналов с моделированием смещения по
частоте, фазе и нарушения привязки к границе бит.
9. Разработка демодулятора APSK сигналов и его отработка по модели-
руемой информации.
10. Разработка функции для скремблирования и дескремблирования би-
товой информации.
11. Реализация табличного и матричного перемежения битовой инфор-
мации.
12. Реализация турбо кода P2C3.
13. Реализация полной модели преобразований битового потока при
подготовке его к передаче в спутниковых каналах связи в соответ-
ствии cо стандартом IPOS.
185

ЛИТЕРАТУРА
1. Описание элементов управления и настроек SDRSharp. [Интернет ре-
сурс]:
http://rtl-sdr.ru/page/opisanie-elementov-upravlenija-i-nastroek-sdrsharp
2. Robert W. Stewart, Kenneth W. Barlee, Dale S.W. Atkinson, Louise H.
Crockett. Software Defined Radio using MATLAB & Simulink and the
RTL-SDR. // University of Strathclyde, Glasgow, Scotland, UK, 2015,
674p.
3. Junzi Sun. ADS-B Decoding Guide. Release. 2017, 34 p.
4. The 1090MHz Riddle. The book about decoding Mode-S and ADS-B data.
[Интернет ресурс]: http://mode-s.org/decode/
5. Іхсанов Ш.М. Методичні вказівки для вивчення теорії та виконання
лабораторних робіт з дисципліни «Теорія електричного зв’язку» /
Ш.М. Ихсанов // Миколаїв: НУК ім. адм. Макарова, 2016, 99 c.
6. Теория и практика цифровой обработки сигналов. Сигналы с мини-
мальной частотной манипуляцией (Minimum Shift Key - MSK). [Ин-
тернет ресурс]: www.dsplib.ru/content/msk/msk.html.
7. Теория и практика цифровой обработки сигналов. MSK сигналы с
гауссовой огибающей (GMSK). [Интернет ресурс]:
www.dsplib.ru/content/gmsk/gmsk.html.
8. Іхсанов Ш.М. Методичні вказівки для вивчення теорії та виконання
лабораторних робіт з дисципліни «Адаптивна обробка сингалів». —
Миколаїв : НУК ім. адм. Макарова, 2018. — 69 с.
9. U.S. Department of Homeland Security. Navigation center. Class A AIS
position report (messages 1, 2, and 3). [Интернет ресурс]:
www.navcen.uscg.gov/?pageName=AISMessagesA
10. U.S. Department of Homeland Security. Navigation center. AIS standard
class B equipment position report (message 18). [Интернет ресурс]:
www.navcen.uscg.gov/?pageName=AISMessagesB
11. Telecommunications Industry Association Standard. IP over Satellite
(IPOS). Revision of TIA-1008-A. — USA, May 2006. — pages 247.
12. Ихсанов Ш.М. Генератор выхода информационного канала, исполь-
зующего помехоустойчивый параллельно-каскадный сверточный код
Р2С3. Тези доповідей на міжнародну науково-практичну конферен-
цію "Компьютерные науки: образование, наука, практика" — Мико-
лаїв : НУК ім. адм. Макарова, 2012. — С. 79—81.

Вам также может понравиться