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

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

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

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

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

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

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

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

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

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

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

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

Сгенерируйте набор данных 5 000 кадров "неисправность" Non-HT WLAN для каждого маршрутизатора. Используйте Мак адреса в качестве меток для известных маршрутизаторов; остающиеся быть помеченными как "Неизвестные". NN обучен классифицировать известные маршрутизаторы, а также обнаружить любые неизвестные единицы. Разделите набор данных в обучение, валидацию и тест, где разделяющие отношения составляют 80%, 10% и 10%, соответственно. Рассмотрите ОСШ 20 дБ, работающих над полосой на 5 ГГц. Номер симулированных устройств определяется к 4, но он может быть изменен путем выбора различного значения для numKnownRouters. Определите номер неизвестных маршрутизаторов больше, чем известные единицы, чтобы представлять в наборе данных изменчивость в неизвестном маршрутизаторе цифровые отпечатки РФ.

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 для снятия отпечатков пальцев РФ предоставляет решение для снятия отпечатков пальцев без издержек. Используйте 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 и нарушения РФ

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

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

  • Возмещены радио-нарушения, такие как шум фазы, смещение частоты и 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);

Радио-нарушения

Нарушения РФ и их соответствующая область значений значений:

  • Шум фазы [0.01, 0.3] RMS (степени)

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

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

Дополнительную информацию см. в функции 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

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

Примените РФ и нарушения канала, заданные ранее. Сбросьте объект канала для каждого радио, чтобы сгенерировать независимый канал. Используйте функцию 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:03 - Generating frames for router 2 with MAC address B1077CFE3777
00:00:03 - Generating frames for router 3 with MAC address DB28133A97BF
00:00:04 - Generating frames for router 4 with MAC address B8AF375DAC0F
00:00:04 - 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:06 - 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:07 - Generating frames for router 11 with MAC address AAAAAAAAAAAA
00:00:07 - Generating frames for router 12 with MAC address AAAAAAAAAAAA
00:00:08 - Generating frames for router 13 with MAC address AAAAAAAAAAAA
00:00:08 - 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 = 
  18x1 Layer array with layers:

     1   'Input Layer'   Image Input             160x2x1 images
     2   'CNN1'          Convolution             50 7x1 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             2x1 max pooling with stride [2  1] and padding [0  0  0  0]
     6   'CNN2'          Convolution             50 7x2 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             2x1 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';

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

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

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 функция,

  • Нарушения РФ (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.