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

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

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

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

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

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

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

Системное описание

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

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

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

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

Сгенерируйте набор данных 5 000 кадров "неисправность" Non-HT WLAN для каждого маршрутизатора. Используйте Мак адреса в качестве меток для известных маршрутизаторов; остающиеся быть помеченными как "Неизвестные". 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. Чтобы обучить сеть на вашем компьютере, выберите опцию "Train network now" (т.е. установите trainNow к истине). Генерация 5 000 систем координат данных занимает приблизительно 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) и полезная нагрузка (ДАННЫЕ). Преамбула имеет две части: короткое учебное и долгое обучение. В этом примере полезная нагрузка содержит те же биты кроме Мак адреса для каждого маршрутизатора. CNN использует часть L-LTF преамбулы как учебные модули. Многократное использование сигнала L-LTF для снятия отпечатков пальцев RF предоставляет решение для снятия отпечатков пальцев без издержек. Используйте wlanMACFrameConfig, wlanMACFrame, wlanNonHTConfig, и wlanWaveformGenerator функции, чтобы сгенерировать кадры "неисправность" 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 МГц к процессу сигналы non-HT.

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

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

Канал Setup и ухудшения RF

Передайте каждый кадр через канал с

  • Рэлеевское многопутевое исчезновение

  • Возмещены радио-ухудшения, такие как шум фазы, смещение частоты и DC

  • AWGN

Рэлеевский многопутевой и AWGN

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

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

  • DC возместил: [-50,-32] дБн

Дополнительную информацию см. в функции helperRFImpairments на симуляции ухудшения RF. Эта функция использует 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 71153FFD7ACA
00:00:01 - Generating frames for router 2 with MAC address 5F4A8EAD6AD2
00:00:01 - Generating frames for router 3 with MAC address A91A85793DAA
00:00:01 - Generating frames for router 4 with MAC address 841F1BE784B0
00:00:02 - Generating frames for router 5 with MAC address AAAAAAAAAAAA
00:00:02 - Generating frames for router 6 with MAC address AAAAAAAAAAAA
00:00:02 - Generating frames for router 7 with MAC address AAAAAAAAAAAA
00:00:02 - Generating frames for router 8 with MAC address AAAAAAAAAAAA
00:00:03 - Generating frames for router 9 with MAC address AAAAAAAAAAAA
00:00:03 - Generating frames for router 10 with MAC address AAAAAAAAAAAA
00:00:03 - Generating frames for router 11 with MAC address AAAAAAAAAAAA
00:00:04 - Generating frames for router 12 with MAC address AAAAAAAAAAAA
00:00:04 - Generating frames for router 13 with MAC address AAAAAAAAAAAA
00:00:04 - 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);

Создайте входные матрицы с действительным знаком

Модель Deep Learning только работает над вещественными числами. Таким образом я и 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), которая состоит из двух сверточных и трех полносвязных слоев. Интуиция позади этого проекта - то, что первый слой изучит функции независимо во мне и 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 (Deep Learning Toolbox) использует центральный процессор для обучения. Явным образом установить среду выполнения, набор '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';

Обнаружьте имитатора маршрутизатора

Сгенерируйте кадры "неисправность" с известными Мак адресами и одним неизвестным Мак адресом. Сгенерируйте новый набор ухудшений RF и многопутевого канала. Поскольку ухудшения являются все новыми, цифровой отпечаток RF для этих систем координат должен быть классифицирован как "Неизвестный". Системы координат с известными Мак адресами представляют имитаторов маршрутизатора, в то время как системы координат с неизвестными Мак адресами являются просто неизвестными маршрутизаторами.

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 свойства Рейли образовывают канал объект),

  • Уровень шума канала (вход 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 по Computer Communications, Париж, Франция, 2019, стр 370-378.