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

Этот пример показывает, как классифицировать радиолокационные и коммуникационные формы волны с помощью распределения Вигнера-Вилля (WVD) и глубокой сверточной нейронной сети (CNN).

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

Первая часть этого примера моделирует радиолокационную систему классификации, которая синтезирует три импульсные радиолокационные волны и классифицирует их. Формы радиолокационных сигналов:

  • Прямоугольный

  • Линейная частотная модуляция (LFM)

  • Код Баркера

Радиолокационная система классификации не существует изолированно. Скорее он находится в все более занятом частотном спектре, конкурируя с другими переданными источниками, такими как коммуникационные системы, радио и навигационные системы. Вторая часть этого примера расширяет сеть и включает в себя дополнительные типы модуляции связи. В дополнение к первому набору радиолокационных форм волны расширенная сеть синтезирует и идентифицирует эти формы волны связи:

  • Гауссовая манипуляция со сдвигом частоты (GFSK)

  • Непрерывная манипуляция фазы сдвига частотой (CPFSK)

  • Широковещательная частотная модуляция (B-FM)

  • Двойная амплитудная модуляция боковой полосы (DSB-AM)

  • Однополосная амплитудная модуляция (SSB-AM)

Этот пример в основном фокусируется на формах радиолокационных сигналов, причем классификация расширена, чтобы включать небольшой набор сигналов связи амплитуды и частотной модуляции. Смотрите Классификацию модуляции с глубоким обучением (Communications Toolbox), чтобы получить полный рабочий процесс классификации модуляции с широким массивом сигналов связи.

Сгенерируйте радиолокационные формы волны

Сгенерируйте 3000 сигналов со скоростью дискретизации 100 МГц для каждого типа модуляции. Использование phased.RectangularWaveform для прямоугольных импульсов, phased.LinearFMWaveform для LFM и phased.PhaseCodedWaveform для фазового кодирования импульсов с кодом Баркера.

Каждый сигнал имеет уникальные параметры и дополнен различными нарушениями, чтобы сделать его более реалистичным. Для каждой формы волны ширина импульса и частота повторения будут генерироваться случайным образом. Для форм волны LFM полоса пропускания и направление развертки генерируются случайным образом. Для формы волны Баркера ширина и число чипов генерируются случайным образом. Все сигналы ослаблены белым Гауссовым шумом с помощью awgn функция со случайным отношением сигнал/шум в области значений [-6, 30] дБ. Смещение частоты со случайной несущей частотой в области значений [Fs/6, Fs/5] применяется к каждому сигналу с помощью comm.PhaseFrequencyOffset объект. Наконец, каждый сигнал передается через многолучевой канал Райса с замираниями, comm.RicianChannel.

Обеспечиваемая вспомогательная функция helperGenerateRadarWaveforms создает и увеличивает каждый тип модуляции.

rng default
[wav, modType] = helperGenerateRadarWaveforms();

Постройте график преобразования Фурье для нескольких форм волны LFM, чтобы показать отклонения в сгенерированном наборе.

idLFM = find(modType == "LFM",3);
nfft = 2^nextpow2(length(wav{1}));
f = (0:(nfft/2-1))/nfft*100e6;

figure
subplot(1,3,1)
Z = fft(wav{idLFM(1)},nfft);
plot(f/1e6,abs(Z(1:nfft/2)))
xlabel('Frequency (MHz)');ylabel('Amplitude');axis square
subplot(1,3,2)
Z = fft(wav{idLFM(2)},nfft);
plot(f/1e6,abs(Z(1:nfft/2)))
xlabel('Frequency (MHz)');ylabel('Amplitude');axis square
subplot(1,3,3)
Z = fft(wav{idLFM(3)},nfft);
plot(f/1e6,abs(Z(1:nfft/2)))
xlabel('Frequency (MHz)');ylabel('Amplitude');axis square

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

Чтобы улучшить классификационную эффективность алгоритмов машинного обучения, общим подходом является ввод извлечённых функций вместо исходных данных о сигнале. Функции обеспечивают представление входных данных, что облегчает для алгоритма классификации различение между классами. Распределение Вигнера-Вилля представляет частотно-временное представление исходных данных, которое полезно для изменяющихся во времени сигналов. Высокое разрешение и локальность как во времени, так и в частоте обеспечивают хорошие функции для идентификации аналогичных типов модуляции. Используйте wvd функция для вычисления сглаженного псевдомодуля для каждого из типов модуляции.

figure
subplot(1,3,1)
wvd(wav{find(modType == "Rect",1)},100e6,'smoothedPseudo')
axis square; colorbar off; title('Rect')
subplot(1,3,2)
wvd(wav{find(modType == "LFM",1)},100e6,'smoothedPseudo')
axis square; colorbar off; title('LFM')
subplot(1,3,3)
wvd(wav{find(modType == "Barker",1)},100e6,'smoothedPseudo')
axis square; colorbar off; title('Barker')

Чтобы сохранить сглаженное псевдо распределение Wigner-Ville сигналов, сначала создайте директорию TFDDatabase внутри вашей временной директории tempdir. Затем создайте подкаталоги в TFDDatabase для каждого типа модуляции. Для каждого сигнала вычислите сглаженное псевдо распределение Wigner-Ville и уменьшите значение результата до матрицы 227 на 227. Сохраните матрицу как .png файл изображения в подкаталоге, соответствующий типу модуляции сигнала. Функция помощника helperGenerateTFDfiles выполняет все эти шаги. Этот процесс займет несколько минут из-за большого размера базы данных и сложности wvd алгоритм. Можно заменить tempdir с другой директорией, в котором у вас есть разрешение на запись.

parentDir = tempdir;
dataDir = 'TFDDatabase';
helperGenerateTFDfiles(parentDir,dataDir,wav,modType,100e6)

Создайте объект image datastore для созданной папки, чтобы управлять файлами изображений, используемыми для настройки нейронной сети для глубокого обучения. Этот шаг избегает необходимости загружать все изображения в память. Укажите источник меток, которые будут именами папок. Это присваивает каждый тип модуляции сигнала в соответствии с именем папки.

folders = fullfile(parentDir,dataDir,{'Rect','LFM','Barker'});
imds = imageDatastore(folders,...
    'FileExtensions','.png','LabelSource','foldernames','ReadFcn',@readTFDForSqueezeNet);

Сеть обучается с 80% данных и тестируется с 10%. Оставшиеся 10% используются для валидации. Используйте splitEachLabel функция для деления imageDatastore в наборы обучения, валидации и тестирования.

[imdsTrain,imdsTest,imdsValidation] = splitEachLabel(imds,0.8,0.1);

Настройка нейронной сети для глубокого обучения

Перед обучением нейронной сети для глубокого обучения определите сетевую архитектуру. Этот пример использует передачу обучения SqueezeNet, глубокий CNN, созданный для классификации изображений. Передача обучения является процессом переобучения существующей нейронной сети для классификации новых целей. Эта сеть принимает вход изображений размера 227 227 3. Перед входом в сеть настраиваемая функция чтения readTFDForSqueezeNet преобразует двумерное частотно-временное распределение в изображение RGB правильного размера. SqueezeNet выполняет классификацию 1000 категорий в строение по умолчанию.

Загрузка SqueezeNet.

net = squeezenet;

Извлеките график слоев из сети. Подтвердите, что SqueezeNet сконфигурирован для изображений размера 227 227 3.

lgraphSqz = layerGraph(net);
lgraphSqz.Layers(1)
ans = 
  ImageInputLayer with properties:

                      Name: 'data'
                 InputSize: [227 227 3]

   Hyperparameters
          DataAugmentation: 'none'
             Normalization: 'zerocenter'
    NormalizationDimension: 'auto'
                      Mean: [1×1×3 single]

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

lgraphSqz.Layers(end-5:end)
ans = 
  6×1 Layer array with layers:

     1   'drop9'                             Dropout                  50% dropout
     2   'conv10'                            Convolution              1000 1×1×512 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'relu_conv10'                       ReLU                     ReLU
     4   'pool10'                            Global Average Pooling   Global average pooling
     5   'prob'                              Softmax                  softmax
     6   'ClassificationLayer_predictions'   Classification Output    crossentropyex with 'tench' and 999 other classes

Замените слой 'drop9', последний слой отсева в сети, слоем отсева вероятности 0.6.

tmpLayer = lgraphSqz.Layers(end-5);
newDropoutLayer = dropoutLayer(0.6,'Name','new_dropout');
lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newDropoutLayer);

Последний обучаемый слой в SqueezeNet является сверточным слоем 1 на 1, 'conv10'. Замените слой на новый сверточный слой с количеством фильтров, равным количеству типов модуляции. Также увеличьте коэффициенты скорости обучения нового слоя.

numClasses = 3;
tmpLayer = lgraphSqz.Layers(end-4);
newLearnableLayer = convolution2dLayer(1,numClasses, ...
        'Name','new_conv', ...
        'WeightLearnRateFactor',20, ...
        'BiasLearnRateFactor',20);
lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newLearnableLayer);

Замените слой классификации новым слоем без меток классов.

tmpLayer = lgraphSqz.Layers(end);
newClassLayer = classificationLayer('Name','new_classoutput');
lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newClassLayer);

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

lgraphSqz.Layers(end-5:end)
ans = 
  6×1 Layer array with layers:

     1   'new_dropout'       Dropout                  60% dropout
     2   'new_conv'          Convolution              3 1×1 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'relu_conv10'       ReLU                     ReLU
     4   'pool10'            Global Average Pooling   Global average pooling
     5   'prob'              Softmax                  softmax
     6   'new_classoutput'   Classification Output    crossentropyex

Выберите опции процесса обучения, которые гарантируют хорошую эффективность сети. Обратитесь к trainingOptions документация для описания каждой опции.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',128, ...
    'MaxEpochs',5, ...
    'InitialLearnRate',1e-3, ...
    'Shuffle','every-epoch', ...
    'Verbose',false, ...
    'Plots','training-progress',...
    'ValidationData',imdsValidation);

Обучите сеть

Используйте trainNetwork команда для обучения созданного CNN. Из-за большого размера набора данных процесс может занять несколько минут. Если на вашей машине есть графический процессор и Toolbox™ Parallel Computing, то MATLAB автоматически использует для обучения графический процессор. В противном случае используется центральный процессор. Графики точности обучения на рисунке показывают прогресс обучения сети во всех итерациях. На трех типах радиолокационной модуляции сеть классифицирует почти 100% обучающих сигналов правильно.

trainedNet = trainNetwork(imdsTrain,lgraphSqz,options);

Оценка эффективности на радиолокационных формах волны

Используйте обученную сеть для классификации тестовых данных с помощью classify команда. Матрица неточностей является одним из методов визуализации классификационной эффективности. Используйте confusionchart команда для вычисления и визуализации точности классификации. Для трех типов модуляции, входящих в сеть, почти все закодированные по фазе, LFM и прямоугольные формы волны правильно идентифицируются сетью.

predicted = classify(trainedNet,imdsTest);
figure
confusionchart(predicted,imdsTest.Labels,'Normalization','column-normalized')

Сгенерируйте форму связи и извлеките функции

Частотный спектр радиолокационной системы классификации должен конкурировать с другими переданными источниками. Посмотрим, как созданная сеть расширяется, чтобы включать другие моделируемые типы модуляции. Другой пример MathWorks, Modulation Classification with Глубокое Обучение (Communications Toolbox), выполняет классификацию модуляции нескольких различных типов модуляции, используя Communications Toolbox™. Функция помощника helperGenerateCommsWaveforms генерирует и увеличивает подмножество типов модуляции, используемых в этом примере. Поскольку WVD теряет информацию фазы, используется подмножество только типов амплитуды и частотной модуляции.

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

[wav, modType] = helperGenerateCommsWaveforms();

figure
subplot(2,3,1)
wvd(wav{find(modType == "GFSK",1)},200e3,'smoothedPseudo')
axis square; colorbar off; title('GFSK')
subplot(2,3,2)
wvd(wav{find(modType == "CPFSK",1)},200e3,'smoothedPseudo')
axis square; colorbar off; title('CPFSK')
subplot(2,3,3)
wvd(wav{find(modType == "B-FM",1)},200e3,'smoothedPseudo')
axis square; colorbar off; title('B-FM')
subplot(2,3,4)
wvd(wav{find(modType == "SSB-AM",1)},200e3,'smoothedPseudo')
axis square; colorbar off; title('SSB-AM')
subplot(2,3,5)
wvd(wav{find(modType == "DSB-AM",1)},200e3,'smoothedPseudo')
axis square; colorbar off; title('DSB-AM')

Используйте функцию helper helperGenerateTFDfiles снова, чтобы вычислить сглаженный псевдослучайный сигнал WVD для каждого входного сигнала. Создайте объект image datastore, чтобы управлять файлами изображений всех типов модуляции.

helperGenerateTFDfiles(parentDir,dataDir,wav,modType,200e3)
folders = fullfile(parentDir,dataDir,{'Rect','LFM','Barker','GFSK','CPFSK','B-FM','SSB-AM','DSB-AM'});
imds = imageDatastore(folders,...
    'FileExtensions','.png','LabelSource','foldernames','ReadFcn',@readTFDForSqueezeNet);

Снова разделите данные на набор обучающих данных, набор валидации и набор проверки с помощью splitEachLabel функция.

rng default
[imdsTrain,imdsTest,imdsValidation] = splitEachLabel(imds,0.8,0.1);

Настройте архитектуру нейронной сети для глубокого обучения

Ранее сетевая архитектура была настроена для классификации трех типов модуляции. Это должно быть обновлено, чтобы позволить классификацию всех восьми типов модуляции как радиолокационных сигналов, так и сигналов связи. Это аналогичный процесс, за исключением того, что fullyConnectedLayer теперь требуется выход размером восемь.

numClasses = 8;
net = squeezenet;
lgraphSqz = layerGraph(net);

tmpLayer = lgraphSqz.Layers(end-5);
newDropoutLayer = dropoutLayer(0.6,'Name','new_dropout');
lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newDropoutLayer);

tmpLayer = lgraphSqz.Layers(end-4);
newLearnableLayer = convolution2dLayer(1,numClasses, ...
        'Name','new_conv', ...
        'WeightLearnRateFactor',20, ...
        'BiasLearnRateFactor',20);
lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newLearnableLayer);

tmpLayer = lgraphSqz.Layers(end);
newClassLayer = classificationLayer('Name','new_classoutput');
lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newClassLayer);

Создайте новый набор опций обучения.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',150, ...
    'MaxEpochs',10, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'Verbose',false, ...
    'Plots','training-progress',...
    'ValidationData',imdsValidation);

Используйте trainNetwork команда для обучения созданного CNN. Для всех типов модуляции обучение сходится с точностью около 95% правильной классификации.

trainedNet = trainNetwork(imdsTrain,lgraphSqz,options);

Оценка эффективности по всем сигналам

Используйте classify команда для классификации сигналов, удерживаемых в стороне для проверки. Снова визуализируйте эффективность с помощью confusionchart.

predicted = classify(trainedNet,imdsTest);
figure;
confusionchart(predicted,imdsTest.Labels,'Normalization','column-normalized')

Для восьми типов модуляции, входящих в сеть, более 99% B-FM, CPFSK, GFSK, Barker и LFM типов модуляции были правильно классифицированы. В среднее значение было правильно идентифицировано более 85% сигналов AM. Из матрицы неточностей высокий процент сигналов SSB-AM был неправильно классифицирован как DSB-AM, и сигналов DSB-AM как SSB-AM.

Давайте рассмотрим некоторые из этих неправильных классификаций, чтобы получить представление о процессе обучения в сети. Используйте readimage функция на image datastore, чтобы извлечь из тестового набора данных одно изображение из каждого класса. Отображаемый WVD визуально выглядит очень похожим. Поскольку сигналы DSB-AM и SSB-AM имеют очень сходную сигнатуру, это частично объясняет трудность сети в правильной классификации этих двух типов. Дальнейшая обработка сигналов может сделать различия между этими двумя типами модуляции более ясными для сети и привести к улучшенной классификации.

DSB_DSB = readimage(imdsTest,find((imdsTest.Labels == 'DSB-AM') & (predicted == 'DSB-AM'),1));
DSB_SSB = readimage(imdsTest,find((imdsTest.Labels == 'DSB-AM') & (predicted == 'SSB-AM'),1));
SSB_DSB = readimage(imdsTest,find((imdsTest.Labels == 'SSB-AM') & (predicted == 'DSB-AM'),1));
SSB_SSB = readimage(imdsTest,find((imdsTest.Labels == 'SSB-AM') & (predicted == 'SSB-AM'),1));

figure
subplot(2,2,1)
imagesc(DSB_DSB(:,:,1))
axis square; title({'Actual Class: DSB-AM','Predicted Class: DSB-AM'})
subplot(2,2,2)
imagesc(DSB_SSB(:,:,1))
axis square; title({'Actual Class: DSB-AM','Predicted Class: SSB-AM'})
subplot(2,2,3)
imagesc(SSB_DSB(:,:,1))
axis square; title({'Actual Class: SSB-AM','Predicted Class: DSB-AM'})
subplot(2,2,4)
imagesc(SSB_SSB(:,:,1))
axis square; title({'Actual Class: SSB-AM','Predicted Class: SSB-AM'})

Сводные данные

Этот пример показал, как типы радиолокационной и коммуникационной модуляции могут быть классифицированы с помощью частотно-временных методов и нейронной сети для глубокого обучения. Дальнейшие усилия по дополнительному улучшению могут быть исследованы с помощью частотно-временного анализа, доступного в Wavelet Toolbox™, и дополнительного анализа Фурье, доступного в Signal Processing Toolbox™.

Ссылки

[1] Brynolfsson, Johan, and Maria Sandsten. «Классификация одномерных нестационарных сигналов с использованием распределения Вигнера-Вилле в сверточных нейронных сетях». 25-я Европейская конференция по обработке сигналов (EUSIPCO). IEEE, 2017.

[2] Лю, Сяоюй, Дию Ян и Али Эль Гамал. «Архитектуры глубоких нейронных сетей для классификации модуляций». 51-я Асиломарская конференция по сигналам, системам и компьютерам. 2017.

[3] 'Ван, Чао, Цзянь Ван и Сюдун Чжан. Автоматическое распознавание формы радиолокатора на основе частотно-временного анализа и сверточной нейронной сети. Международная конференция IEEE по акустике, речи и обработке сигналов (ICASSP). 2017.

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