exponenta event banner

Проектирование глубокой нейронной сети с моделируемыми данными для обнаружения олицетворения маршрутизатора WLAN

В этом примере показано, как создать радиочастотную (RF) сверточную нейронную сеть (CNN) с моделируемыми данными. Вы обучаете CNN моделируемым кадрам радиомаяка беспроводной локальной сети (WLAN) от известных и неизвестных маршрутизаторов для радиочастотной дактилоскопии. Затем можно сравнить адрес управления доступом к среде (MAC) принятых сигналов и идентификационный код RF, обнаруженный CNN, для обнаружения имитаторов маршрутизатора WLAN.

Дополнительные сведения о тестировании проектируемой нейронной сети с использованием сигналов, полученных от реальных маршрутизаторов Wi-Fi, см. в примере «Тестирование глубокой нейронной сети с использованием захваченных данных для обнаружения олицетворения маршрутизатора WLAN» (Communications Toolbox).

Обнаружение олицетворения маршрутизатора с помощью RF-отпечатков пальцев

Олицетворение маршрутизатора - это форма атаки на сеть WLAN, когда злонамеренный агент пытается выдать себя за законного маршрутизатора и заставить пользователей сети подключиться к ней. Решения по идентификации безопасности, основанные на простых цифровых идентификаторах, таких как MAC-адреса, IP-адреса и SSID, не эффективны при обнаружении такой атаки. Эти идентификаторы можно легко подделать. Следовательно, более защищенное решение использует другую информацию, такую как радиочастотная сигнатура радиолинии, в дополнение к этим простым цифровым идентификаторам.

Беспроводная пара передатчик-приемник создает уникальную РЧ-сигнатуру в приемнике, которая является комбинацией ухудшения канала и РЧ. Радиочастотная дактилоскопия - это процесс различения передающих радиостанций в совместно используемом спектре через эти подписи. В [1] авторы разработали сеть глубокого обучения (DL), которая потребляет необработанные синфазные/квадратурные (IQ) выборки основной полосы частот и идентифицирует передающее радио. Сеть может идентифицировать передающие радиоблоки, если нарушения РЧ являются доминирующими или профиль канала остается постоянным в течение времени работы. Большинство сетей WLAN имеют фиксированные маршрутизаторы, которые создают статический профиль канала, когда местоположение приемника также фиксировано. В таком сценарии сеть глубокого обучения может идентифицировать олицетворители маршрутизатора путем сравнения пары RF-отпечатка сигнала и MAC-адреса принятого сигнала с парой известных маршрутизаторов.

В этом примере моделируется система WLAN с несколькими фиксированными маршрутизаторами и фиксированным наблюдателем с помощью Toolbox™ WLAN и обучается нейронной сети (NN) с моделируемыми данными с помощью Deep Learning Toolbox™.

Описание системы

Предположим, что в помещении имеется несколько доверенных маршрутизаторов с известными MAC-адресами, которые мы будем называть известными маршрутизаторами. Также предположим, что неизвестные маршрутизаторы могут входить в область наблюдения, некоторые из которых могут быть олицетворителями маршрутизатора. Класс «Unknown» представляет любое передающее устройство, которое не содержится в известном наборе. На следующем рисунке показан сценарий, в котором имеются три известных маршрутизатора. Наблюдатель собирает сигналы маяка без высокой пропускной способности (не HT) от этих маршрутизаторов и использует (устаревшее) длинное обучающее поле (L-LTF) для идентификации отпечатка RF. Передаваемые сигналы L-LTF одинаковы для всех маршрутизаторов, что позволяет алгоритму избежать зависимости данных. Поскольку маршрутизаторы и наблюдатель фиксированы, идентификационные данные RF (комбинация профиля канала многолучевого распространения и нарушений RF) RF1, RF2 и RF3 не изменяются во времени. Неизвестные данные маршрутизатора - это набор случайных радиочастотных отпечатков, которые отличаются от известных маршрутизаторов.

На следующем рисунке показан пользователь, подключенный к маршрутизатору и мобильной горячей точке. После обучения наблюдатель принимает кадры маяка и декодирует MAC-адрес. Кроме того, наблюдатель извлекает сигнал L-LTF и использует этот сигнал для классификации радиочастотного отпечатка источника кадра маяка. Если MAC-адрес и идентификационный код RF совпадают, как в случае маршрутизатора 1, маршрутизатора 2 и Router3, то наблюдатель объявляет источник «известным» маршрутизатором. Если MAC-адрес маяка отсутствует в базе данных и отпечаток RF не совпадает ни с одним из известных маршрутизаторов, как в случае мобильной горячей точки, то наблюдатель объявляет источник «неизвестным» маршрутизатором.

На следующем рисунке показан олицетворитель маршрутизатора в действии. Олицетворитель маршрутизатора (a.k.a. wild twin) может реплицировать MAC-адрес известного маршрутизатора и передавать кадры маяка. Затем хакер может заделать исходный маршрутизатор и заставить пользователя подключиться к злому двойнику. Наблюдатель также принимает кадры маяка от злого близнеца и декодирует MAC-адрес. Декодированный MAC-адрес соответствует MAC-адресу известного маршрутизатора, но отпечаток радиочастотного канала не совпадает. Наблюдатель объявляет источник как олицетворение маршрутизатора.

Установка параметров системы

Создайте набор данных из 5000 кадров радиомаяка WLAN без HT для каждого маршрутизатора. Использовать MAC-адреса в качестве меток для известных маршрутизаторов; остальные помечены как «Неизвестные». NN обучен классифицировать известные маршрутизаторы, а также обнаруживать любые неизвестные маршрутизаторы. Разбейте набор данных на обучение, проверку и тест, где коэффициенты разделения составляют 80%, 10% и 10% соответственно. Рассмотрим SNR 20 дБ, работающий на полосе 5 ГГц. Количество моделируемых устройств установлено равным 4, но его можно изменить, выбрав другое значение для numKnownRouters. Установите количество неизвестных маршрутизаторов больше, чем известных, чтобы представить в наборе данных изменчивость в неизвестных RF-отпечатках маршрутизатора.

numKnownRouters = 4;
numUnknownRouters = 10;
numTotalRouters = numKnownRouters+numUnknownRouters;
SNR = 20;                 % dB
channelNumber = 153;      % WLAN channel number
channelBand = 5;          % GHz
frameLength = 160;        % L-LTF sequence length in samples

По умолчанию в этом примере загружаются данные обучения и обученная сеть из https://www.mathworks.com/supportfiles/spc/RFFingerprinting/RFFingerprintingSimulatedData.tar.gz. Если подключение к Интернету отсутствует, можно загрузить файл вручную на компьютер, подключенный к Интернету, и сохранить его в том же каталоге, что и файлы текущего примера.

Чтобы быстро запустить этот пример, загрузите предварительно обученную сеть и создайте небольшое количество кадров, например 10. Чтобы обучить сеть на компьютере, выберите опцию «Обучить сеть сейчас» (т. е. установить trainNow true). Формирование 5000 кадров данных занимает около 50 минут на процессоре Intel (R) Xeon (R) W-2133 CPU @ 3,6 ГГц с памятью 64 МБ. Обучение этой сети занимает около 5 минут с помощью графического процессора Nvidia (R) Titan Xp. Обучение на CPU может привести к очень длительной продолжительности обучения.

trainNow = false;

if trainNow
  numTotalFramesPerRouter = 5000; %#ok<UNRCH>
else
  numTotalFramesPerRouter = 10;
  rfFingerprintingDownloadData('simulated')
end
Starting download of data files from:
	https://www.mathworks.com/supportfiles/spc/RFFingerprinting/RFFingerprintingSimulatedData.tar.gz
Download and extracting files done
  numTrainingFramesPerRouter = numTotalFramesPerRouter*0.8;
  numValidationFramesPerRouter = numTotalFramesPerRouter*0.1;
  numTestFramesPerRouter = numTotalFramesPerRouter*0.1;

Генерация форм сигналов WLAN

Маршрутизаторы Wi-Fi, реализующие протоколы 802.11a/g/n/ac, передают кадры маяка в диапазоне 5 ГГц для широковещательной передачи их присутствия и возможностей с использованием формата OFDM не-HT. Кадр маяка состоит из двух основных частей: преамбулы (SYNC) и полезной нагрузки (DATA). Преамбула состоит из двух частей: короткой подготовки и длительной подготовки. В этом примере полезная нагрузка содержит одни и те же биты, за исключением MAC-адреса для каждого маршрутизатора. CNN использует часть преамбулы L-LTF в качестве учебных единиц. Повторное использование сигнала L-LTF для радиочастотной дактилоскопии обеспечивает решение для дактилоскопии без заголовка. Использовать wlanMACFrameConfig(панель инструментов WLAN), wlanMACFrame(панель инструментов WLAN), wlanNonHTConfig(панель инструментов WLAN), и wlanWaveformGenerator(Панель инструментов WLAN) используется для генерации кадров радиомаяка WLAN.

% Create Beacon frame-body configuration object
frameBodyConfig = wlanMACManagementConfig;

% Create Beacon frame configuration object
beaconFrameConfig = wlanMACFrameConfig('FrameType', 'Beacon', ...
  "ManagementConfig", frameBodyConfig);

% Generate Beacon frame bits
[~, mpduLength] = wlanMACFrame(beaconFrameConfig, 'OutputFormat', 'bits');

% Create a wlanNONHTConfig object, 20 MHz bandwidth and MCS 1 are used
nonHTConfig = wlanNonHTConfig(...
  'ChannelBandwidth', "CBW20",...
  "MCS", 1,...
  "PSDULength", mpduLength);

Объект rfFingerprintingNonHTFrontEnd выполняет внешнюю обработку, включая извлечение сигнала L-LTF. Объект сконфигурирован с полосой пропускания канала 20 МГц для обработки сигналов, не являющихся HT.

rxFrontEnd = rfFingerprintingNonHTFrontEnd('ChannelBandwidth', 'CBW20');

fc = helperWLANChannelFrequency(channelNumber, channelBand);
fs = wlanSampleRate(nonHTConfig);

Обесценение канала настройки и РЧ

Пропускать каждый кадр через канал с

  • Релеевское многолучевое замирание

  • Радиопомехи, такие как фазовый шум, сдвиг частоты и сдвиг постоянного тока

  • AWGN

Многолучевая сеть Рэлея и AWGN

Канал пропускает сигналы через канал с многолучевым замиранием Рэлея, используя comm.RayleighChannel (Коммуникационная панель инструментов) Системный объект. Предположим, что профиль задержки равен [0 1,8 3,4] отсчетов с соответствующими средними коэффициентами усиления пути [0 -2 -10] дБ. Так как канал является статическим, установите максимальный доплеровский сдвиг на ноль, чтобы убедиться, что канал не изменяется для того же радио. Реализация многолучевого канала с этими настройками. Добавление шума с помощью awgn (Communications Toolbox) функция,

multipathChannel = comm.RayleighChannel(...
  'SampleRate', fs, ...
  'PathDelays', [0 1.8 3.4]/fs, ...
  'AveragePathGains', [0 -2 -10], ...
  'MaximumDopplerShift', 0);

Нарушения радиосвязи

RF-обесценения и их соответствующий диапазон значений:

  • Фазовый шум [0,01, 0,3] среднеквадратичных значений (градусов)

  • Смещение частоты [-4, 4] ppm

  • Смещение постоянного тока: [-50, -32] dBc

Для получения дополнительной информации о моделировании ослабления ВЧ см. функцию helperRFImpairments. Эта функция использует comm.PhaseFrequencyOffset (Коммуникационный инструментарий) и comm.PhaseNoise (Коммуникационный инструментарий) Системные объекты.

phaseNoiseRange = [0.01, 0.3];
freqOffsetRange = [-4, 4];
dcOffsetRange = [-50, -32];

rng(123456)  % Fix random generator

% Assign random impairments to each simulated radio within the previously
% defined ranges
radioImpairments = repmat(...
  struct('PhaseNoise', 0, 'DCOffset', 0, 'FrequencyOffset', 0), ...
  numTotalRouters, 1);
for routerIdx = 1:numTotalRouters
  radioImpairments(routerIdx).PhaseNoise = ...
    rand*(phaseNoiseRange(2)-phaseNoiseRange(1)) + phaseNoiseRange(1);
  radioImpairments(routerIdx).DCOffset = ...
    rand*(dcOffsetRange(2)-dcOffsetRange(1)) + dcOffsetRange(1);
  radioImpairments(routerIdx).FrequencyOffset = ...
    fc/1e6*(rand*(freqOffsetRange(2)-freqOffsetRange(1)) + freqOffsetRange(1));
end

Применение нарушений канала и создание рамок данных для обучения

Примените нарушения RF и канала, определенные ранее. Сбросьте объект канала для каждого радиоблока, чтобы создать независимый канал. Используйте функцию rfFingerprintingNonHTFrontEnd для обработки полученных кадров. Наконец, извлеките L-LTF из каждого передаваемого кадра WLAN. Разделение принятых сигналов L-LTF на обучающие, валидационные и тестовые наборы.

% Create variables that will store the training, validation and testing
% datasets
xTrainingFrames = zeros(frameLength, numTrainingFramesPerRouter*numTotalRouters);
xValFrames = zeros(frameLength, numValidationFramesPerRouter*numTotalRouters);
xTestFrames = zeros(frameLength, numTestFramesPerRouter*numTotalRouters);

% Index vectors for train, validation and test data units
trainingIndices = 1:numTrainingFramesPerRouter;
validationIndices = 1:numValidationFramesPerRouter;
testIndices = 1:numTestFramesPerRouter;

tic
generatedMACAddresses = strings(numTotalRouters, 1);
rxLLTF = zeros(frameLength, numTotalFramesPerRouter);     % Received L-LTF sequences
for routerIdx = 1:numTotalRouters
  
  % Generate a 12-digit random hexadecimal number as a MAC address for
  % known routers. Set the MAC address of all unknown routers to
  % 'AAAAAAAAAAAA'.
  if (routerIdx<=numKnownRouters)
    generatedMACAddresses(routerIdx) = string(dec2hex(bi2de(randi([0 1], 12, 4)))');
  else
    generatedMACAddresses(routerIdx) = 'AAAAAAAAAAAA';
  end
  
  fprintf('%s - Generating frames for router %d with MAC address %s\n', ...
    datestr(toc/86400,'HH:MM:SS'), routerIdx, generatedMACAddresses(routerIdx))

  % Set MAC address into the wlanFrameConfig object
  beaconFrameConfig.Address2 = generatedMACAddresses(routerIdx);
  
  % Generate beacon frame bits
  beacon = wlanMACFrame(beaconFrameConfig, 'OutputFormat', 'bits');
  
  txWaveform = wlanWaveformGenerator(beacon, nonHTConfig);
  
  txWaveform = helperNormalizeFramePower(txWaveform);
  
  % Add zeros to account for channel delays
  txWaveform = [txWaveform; zeros(160,1)]; %#ok<AGROW>
  
  % Reset multipathChannel object to generate a new static channel
  reset(multipathChannel)
  
  frameCount= 0;
  while frameCount<numTotalFramesPerRouter
    
    rxMultipath = multipathChannel(txWaveform);
    
    rxImpairment = helperRFImpairments(rxMultipath, radioImpairments(routerIdx), fs);
    
    rxSig = awgn(rxImpairment,SNR,0);
    
    % Detect the WLAN packet and return the received L-LTF signal using
    % rfFingerprintingNonHTFrontEnd object
    [valid, ~, ~, ~, ~, LLTF] = rxFrontEnd(rxSig);
    
    % Save successfully received L-LTF signals
    if valid
      frameCount=frameCount+1;
      rxLLTF(:,frameCount) = LLTF;
    end
    
    if mod(frameCount,500) == 0
      fprintf('%s - Generated %d/%d frames\n', ...
        datestr(toc/86400,'HH:MM:SS'), frameCount, numTotalFramesPerRouter)
    end
  end
  
  rxLLTF = rxLLTF(:, randperm(numTotalFramesPerRouter));
  
  % Split data into training, validation and test
  xTrainingFrames(:, trainingIndices+(routerIdx-1)*numTrainingFramesPerRouter) ...
    = rxLLTF(:, trainingIndices);
  xValFrames(:, validationIndices+(routerIdx-1)*numValidationFramesPerRouter)...
    = rxLLTF(:, validationIndices+ numTrainingFramesPerRouter);
  xTestFrames(:, testIndices+(routerIdx-1)*numTestFramesPerRouter)...
    = rxLLTF(:, testIndices + numTrainingFramesPerRouter+numValidationFramesPerRouter);
end
00:00:00 - Generating frames for router 1 with MAC address 4DA3EE3C8968
00:00:04 - Generating frames for router 2 with MAC address B1077CFE3777
00:00:04 - Generating frames for router 3 with MAC address DB28133A97BF
00:00:04 - Generating frames for router 4 with MAC address B8AF375DAC0F
00:00:05 - Generating frames for router 5 with MAC address AAAAAAAAAAAA
00:00:05 - Generating frames for router 6 with MAC address AAAAAAAAAAAA
00:00:05 - Generating frames for router 7 with MAC address AAAAAAAAAAAA
00:00:05 - Generating frames for router 8 with MAC address AAAAAAAAAAAA
00:00:06 - Generating frames for router 9 with MAC address AAAAAAAAAAAA
00:00:06 - Generating frames for router 10 with MAC address AAAAAAAAAAAA
00:00:06 - Generating frames for router 11 with MAC address AAAAAAAAAAAA
00:00:06 - Generating frames for router 12 with MAC address AAAAAAAAAAAA
00:00:06 - Generating frames for router 13 with MAC address AAAAAAAAAAAA
00:00:07 - Generating frames for router 14 with MAC address AAAAAAAAAAAA
% Label received frames. Label the first numKnownRouters with their MAC
% address. Label the rest with "Unknown”.
labels = generatedMACAddresses;
labels(generatedMACAddresses == generatedMACAddresses(numTotalRouters)) = "Unknown";

yTrain = repelem(labels, numTrainingFramesPerRouter);
yVal = repelem(labels, numValidationFramesPerRouter);
yTest = repelem(labels, numTestFramesPerRouter);

Создание вещественных входных матриц

Модель глубокого обучения работает только на реальных числах. Таким образом, I и Q делятся на два отдельных столбца. Затем данные переупорядочиваются в матрицу 2 x frameLength x 1 x numFrames, как того требует инструментарий Deep Learning Toolbox. Кроме того, обучающий набор перетасовывается, а переменные метки сохраняются как категориальные переменные.

% Rearrange datasets into a one-column vector
xTrainingFrames = xTrainingFrames(:);
xValFrames = xValFrames(:);
xTestFrames = xTestFrames(:);

% Separate between I and Q
xTrainingFrames = [real(xTrainingFrames), imag(xTrainingFrames)];
xValFrames = [real(xValFrames), imag(xValFrames)];
xTestFrames = [real(xTestFrames), imag(xTestFrames)];

% Reshape training data into a 2 x frameLength x 1 x
% numTrainingFramesPerRouter*numTotalRouters matrix
xTrainingFrames = permute(...
  reshape(xTrainingFrames,[frameLength,numTrainingFramesPerRouter*numTotalRouters, 2, 1]),...
  [1 3 4 2]);

% Shuffle data
vr = randperm(numTotalRouters*numTrainingFramesPerRouter);
xTrainingFrames = xTrainingFrames(:,:,:,vr);

% Create label vector and shuffle
yTrain = categorical(yTrain(vr));

% Reshape validation data into a 2 x frameLength x 1 x
% numValidationFramesPerRouter*numTotalRouters matrix
xValFrames = permute(...
  reshape(xValFrames,[frameLength,numValidationFramesPerRouter*numTotalRouters, 2, 1]),...
  [1 3 4 2]);

% Create label vector
yVal = categorical(yVal);

% Reshape test dataset into a numTestFramesPerRouter*numTotalRouter matrix
xTestFrames = permute(...
  reshape(xTestFrames,[frameLength,numTestFramesPerRouter*numTotalRouters, 2, 1]),...
  [1 3 4 2]); %#ok<NASGU>

% Create label vector
yTest = categorical(yTest); %#ok<NASGU>

Обучение нейронной сети

В этом примере используется архитектура нейронной сети (NN), которая состоит из двух сверточных и трех полностью соединенных слоев. Интуиция этой конструкции заключается в том, что первый слой будет изучать особенности независимо в I и Q. Обратите внимание, что размеры фильтра составляют 1x7. Затем следующий слой будет использовать размер фильтра 2x7, который будет извлекать элементы, объединяющие I и Q вместе. Наконец, последние три полностью соединенных слоя будут вести себя как классификатор, используя извлеченные элементы в предыдущих слоях [1].

poolSize = [2 1];
strideSize = [2 1];
layers = [
  imageInputLayer([frameLength 2 1], 'Normalization', 'none', 'Name', 'Input Layer')
  
  convolution2dLayer([7 1], 50, 'Padding', [1 0], 'Name', 'CNN1')
  batchNormalizationLayer('Name', 'BN1')
  leakyReluLayer('Name', 'LeakyReLu1')
  maxPooling2dLayer(poolSize, 'Stride', strideSize, 'Name', 'MaxPool1')
  
  convolution2dLayer([7 2], 50, 'Padding', [1 0], 'Name', 'CNN2')
  batchNormalizationLayer('Name', 'BN2')
  leakyReluLayer('Name', 'LeakyReLu2')
  maxPooling2dLayer(poolSize, 'Stride', strideSize, 'Name', 'MaxPool2')
  
  fullyConnectedLayer(256, 'Name', 'FC1')
  leakyReluLayer('Name', 'LeakyReLu3')
  dropoutLayer(0.5, 'Name', 'DropOut1')
  
  fullyConnectedLayer(80, 'Name', 'FC2')
  leakyReluLayer('Name', 'LeakyReLu4')
  dropoutLayer(0.5, 'Name', 'DropOut2')
  
  fullyConnectedLayer(numKnownRouters+1, 'Name', 'FC3')
  softmaxLayer('Name', 'SoftMax')
  classificationLayer('Name', 'Output')
  ]
layers = 
  18×1 Layer array with layers:

     1   'Input Layer'   Image Input             160×2×1 images
     2   'CNN1'          Convolution             50 7×1 convolutions with stride [1  1] and padding [1  1  0  0]
     3   'BN1'           Batch Normalization     Batch normalization
     4   'LeakyReLu1'    Leaky ReLU              Leaky ReLU with scale 0.01
     5   'MaxPool1'      Max Pooling             2×1 max pooling with stride [2  1] and padding [0  0  0  0]
     6   'CNN2'          Convolution             50 7×2 convolutions with stride [1  1] and padding [1  1  0  0]
     7   'BN2'           Batch Normalization     Batch normalization
     8   'LeakyReLu2'    Leaky ReLU              Leaky ReLU with scale 0.01
     9   'MaxPool2'      Max Pooling             2×1 max pooling with stride [2  1] and padding [0  0  0  0]
    10   'FC1'           Fully Connected         256 fully connected layer
    11   'LeakyReLu3'    Leaky ReLU              Leaky ReLU with scale 0.01
    12   'DropOut1'      Dropout                 50% dropout
    13   'FC2'           Fully Connected         80 fully connected layer
    14   'LeakyReLu4'    Leaky ReLU              Leaky ReLU with scale 0.01
    15   'DropOut2'      Dropout                 50% dropout
    16   'FC3'           Fully Connected         5 fully connected layer
    17   'SoftMax'       Softmax                 softmax
    18   'Output'        Classification Output   crossentropyex

Настройте параметры обучения для использования оптимизатора ADAM с размером мини-пакета 256. По умолчанию 'ExecutionEnvironment'имеет значение' auto ', которое использует графический процессор для обучения, если он доступен. В противном случае trainNetwork использует ЦП для обучения. Чтобы явно задать среду выполнения, установите 'ExecutionEnvironment«к одному из»cpu', 'gpu', 'multi-gpu', или'parallel'. Выбор 'cpu'может привести к очень большой продолжительности обучения.

if trainNow
  
  miniBatchSize = 256; %#ok<UNRCH>
  
  % Training options
  options = trainingOptions('adam', ...
    'MaxEpochs',100, ...
    'ValidationData',{xValFrames, yVal}, ...
    'ValidationFrequency',floor(numTrainingFramesPerRouter*numTotalRouters/miniBatchSize/3), ...
    'Verbose',false, ...
    'L2Regularization', 0.0001, ...
    'InitialLearnRate', 0.0001, ...
    'MiniBatchSize', miniBatchSize, ...
    'ValidationPatience', 3, ...
    'Plots','training-progress', ...
    'Shuffle','every-epoch');
  
  % Train the network
  simNet = trainNetwork(xTrainingFrames, yTrain, layers, options);
else
  % Load trained network (simNet), testing dataset (xTestFrames and
  % yTest) and the used MACAddresses (generatedMACAddresses)
  load('rfFingerprintingSimulatedDataTrainedNN.mat',...
    'generatedMACAddresses',...
    'simNet',...
    'xTestFrames',...
    'yTest')
end

Как показывает график тренировочного прогресса, сеть сходится примерно в 2 эпохи почти со 100% точностью.

Классифицируйте тестовые кадры и рассчитайте окончательную точность за пределами нейронной сети.

% Obtain predicted classes for xTestFrames
yTestPred = classify(simNet,xTestFrames);

% Calculate test accuracy
testAccuracy = mean(yTest == yTestPred);
disp("Test accuracy: " + testAccuracy*100 + "%")
Test accuracy: 100%

Постройте график матрицы путаницы для тестовых кадров. Как упоминалось выше, совершенная точность классификации достигается с помощью синтетического набора данных.

figure
cm = confusionchart(yTest, yTestPred);
cm.Title = 'Confusion Matrix for Test Data';
cm.RowSummary = 'row-normalized';

Определение олицетворителя маршрутизатора

Формирование кадров маяка с известными MAC-адресами и одним неизвестным MAC-адресом. Создание нового набора РЧ-нарушений и канала многолучевого распространения. Поскольку все нарушения являются новыми, отпечаток RF для этих кадров должен быть классифицирован как «Неизвестный». Кадры с известными MAC-адресами представляют собой олицетворители маршрутизатора, в то время как кадры с неизвестными MAC-адресами являются просто неизвестными маршрутизаторами.

framesPerRouter = 4;
knownMACAddresses = generatedMACAddresses(1:numKnownRouters);

% Assign random impairments to each simulated radio within the previously
% defined ranges
for routerIdx = 1:numTotalRouters
  radioImpairments(routerIdx).PhaseNoise = rand*( phaseNoiseRange(2)-phaseNoiseRange(1) ) + phaseNoiseRange(1);
  radioImpairments(routerIdx).DCOffset = rand*( dcOffsetRange(2)-dcOffsetRange(1) ) + dcOffsetRange(1);
  radioImpairments(routerIdx).FrequencyOffset = fc/1e6*(rand*( freqOffsetRange(2)-freqOffsetRange(1) ) + freqOffsetRange(1));
end
% Reset multipathChannel object to generate a new static channel
reset(multipathChannel)

% Run for all known routers and one unknown
for macIndex = 1:(numKnownRouters+1)
  
  beaconFrameConfig.Address2 = generatedMACAddresses(macIndex);
  
  % Generate Beacon frame bits
  beacon = wlanMACFrame(beaconFrameConfig, 'OutputFormat', 'bits');
  
  txWaveform = wlanWaveformGenerator(beacon, nonHTConfig);
  
  txWaveform = helperNormalizeFramePower(txWaveform);
  
  % Add zeros to account for channel delays
  txWaveform = [txWaveform; zeros(160,1)]; %#ok<AGROW>
  
  % Create an unseen multipath channel. In other words, create an unseen
  % RF fingerprint.
  reset(multipathChannel)
  
  frameCount= 0;
  while frameCount<framesPerRouter
    
    rxMultipath = multipathChannel(txWaveform);
    
    rxImpairment = helperRFImpairments(rxMultipath, radioImpairments(routerIdx), fs);
    
    rxSig = awgn(rxImpairment,SNR,0);
    
    % Detect the WLAN packet and return the received L-LTF signal using
    % rfFingerprintingNonHTFrontEnd object
    [payloadFull, cfgNonHT, rxNonHTData, chanEst, noiseVar, LLTF] = ...
      rxFrontEnd(rxSig);
    
    if payloadFull
      frameCount = frameCount+1;
      recBits = wlanNonHTDataRecover(rxNonHTData, chanEst, ...
        noiseVar, cfgNonHT, 'EqualizationMethod', 'ZF');
      
      % Decode and evaluate recovered bits
      mpduCfg = wlanMPDUDecode(recBits, cfgNonHT);
      
      % Separate I and Q and reshape for neural network
      LLTF= [real(LLTF), imag(LLTF)];
      LLTF = permute(reshape(LLTF,frameLength ,[] , 2, 1), [1 3 4 2]);
      
      ypred = classify(simNet, LLTF);
      
      if sum(contains(knownMACAddresses, mpduCfg.Address2)) ~= 0
        if categorical(convertCharsToStrings(mpduCfg.Address2))~=ypred
          disp(strcat("MAC Address ", mpduCfg.Address2," is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED"))
        else
          disp(strcat("MAC Address ", mpduCfg.Address2," is known, fingerprint match"))
        end
      else
        disp(strcat("MAC Address ", mpduCfg.Address2," is not recognized, unknown device"))
      end
    end

    % Reset multipathChannel object to generate a new static channel
    reset(multipathChannel)
  end
end
MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address AAAAAAAAAAAA is not recognized, unknown device
MAC Address AAAAAAAAAAAA is not recognized, unknown device
MAC Address AAAAAAAAAAAA is not recognized, unknown device
MAC Address AAAAAAAAAAAA is not recognized, unknown device

Дальнейшие исследования

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

  • Профиль многолучевого распространения (PathDelays и AveragePathGains свойства объекта канала Рэлея),

  • Уровень шума канала (SNR вход awgn функция),

  • RF-обесценения (phaseNoiseRange, freqOffsetRange, и dcOffsetRange переменные).

Можно также изменить структуру нейронной сети, изменив

  • Параметры сверточного слоя (размер фильтра, количество фильтров, заполнение),

  • Количество полностью соединенных слоев,

  • Количество сверточных слоев.

Приложение: Вспомогательные функции

function [impairedSig] = helperRFImpairments(sig, radioImpairments, fs)
% helperRFImpairments Apply RF impairments
%   IMPAIREDSIG = helperRFImpairments(SIG, RADIOIMPAIRMENTS, FS) returns signal
%   SIG after applying the impairments defined by RADIOIMPAIRMENTS
%   structure at the sample rate FS.

% Apply frequency offset
fOff = comm.PhaseFrequencyOffset('FrequencyOffset', radioImpairments.FrequencyOffset,  'SampleRate', fs);

% Apply phase noise
phaseNoise = helperGetPhaseNoise(radioImpairments);
phNoise = comm.PhaseNoise('Level', phaseNoise, 'FrequencyOffset', abs(radioImpairments.FrequencyOffset));

impFOff = fOff(sig);
impPhNoise = phNoise(impFOff);

% Apply DC offset
impairedSig = impPhNoise + 10^(radioImpairments.DCOffset/10);

end

function [phaseNoise] = helperGetPhaseNoise(radioImpairments)
% helperGetPhaseNoise Get phase noise value
load('Mrms.mat','Mrms','MyI','xI');
[~, iRms] = min(abs(radioImpairments.PhaseNoise - Mrms));
[~, iFreqOffset] = min(abs(xI - abs(radioImpairments.FrequencyOffset)));
phaseNoise = -abs(MyI(iRms, iFreqOffset));
end

Избранная библиография

[1] К. Санхе, М. Белгиовине, Ф. Чжоу, С. Риязе, С. Иоаннидис и К. Чоудхури, «ORACLE: Оптимизированная радиоклассификация через сверточные сетевые сети», IEEE INFOCOM 2019 - IEEE конференция

Связанные темы