Разработайте глубокую нейронную сеть с моделируемыми данными, чтобы обнаружить олицетворение маршрутизатора WLAN

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

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

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

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

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

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

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

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

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

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

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

Сгенерируйте набор данных 5000 систем координат WLAN без HT для каждого маршрутизатора. Используйте MAC-адреса в качестве меток для известных маршрутизаторов; оставшиеся маркируются как «Неизвестные». NN обучен классифицировать известные маршрутизаторы, а также обнаруживать любые неизвестные таковые. Разделите набор данных на обучение, валидацию и тест, где коэффициенты разделения составляют 80%, 10% и 10% соответственно. Рассмотрим ОСШ 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 тактовой частотой @ 3,6 ГГц с 64 Мбайт памяти. Обучение этой сети занимает около 5 минут при помощи графического процессора Nvidia (R) Titan Xp. Обучение на центральном процессоре может привести к очень длительной длительности обучения.

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 non-HT. Кадр-маяк состоит из двух основных частей: преамбулы (SYNC) и полезной нагрузки (DATA). Преамбула имеет две части: короткое обучение и длительное обучение. В этом примере полезная нагрузка содержит те же биты, кроме MAC-адреса для каждого маршрутизатора. CNN использует часть преамбулы L-LTF в качестве обучающих модулей. Повторное использование сигнала L-LTF для дактилоскопии RF обеспечивает решение для дактилоскопии без накладных расходов. Использование wlanMACFrameConfig (WLAN Toolbox), wlanMACFrame (WLAN Toolbox), wlanNonHTConfig (WLAN Toolbox), и wlanWaveformGenerator (WLAN Toolbox) функции для генерации систем координат 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);

Setup ослаблений канала и RF

Пропустите каждую систему координат через канал с

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

  • Нарушения радиосвязи, такие как фаза шум, смещение частоты и смещение постоянного тока

  • AWGN

Многолучевой канал Релея и AWGN

Канал передает сигналы через канал Релея с многолучевым распространением, используя comm.RayleighChannel (Communications Toolbox) Системный объект. Предположим, что профиль задержки [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] rms ( степеней)

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

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

Смотрите функцию helperRFImpairms для получения дополнительной информации о симуляции нарушений RF. Эта функция использует comm.PhaseFrequencyOffset (Communications Toolbox) и comm.PhaseNoise (Communications Toolbox) Системные объекты.

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'к одному из' cpugpumulti-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 и многолучевого канала. Поскольку нарушения все новые, отпечаток 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

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

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

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

  • Уровень шума в канале (ОСШ вход 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] K. Sankhe, M. Belgiovine, F. Zhou, S. Riyaz, S. Ioannidis and K. Chowdhury, «ORACLE: Optimized Radio clAssification through Convolutional neural neuraL EurNetworks», iworks

Похожие темы