exponenta event banner

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

В этом примере показано, как классифицировать сигналы радара и связи с использованием распределения Вигнера-Вилля (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 объект. Наконец, каждый сигнал проходит по многолучевому каналу Rician с замиранием, 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

Извлечение элементов с использованием распределения Wigner-Ville

Для улучшения классификационных характеристик алгоритмов машинного обучения общим подходом является ввод извлеченных признаков вместо исходных данных сигнала. Эти функции обеспечивают представление входных данных, что облегчает алгоритму классификации различение между классами. Распределение Вигнера-Вилля представляет частотно-временное представление исходных данных, которое полезно для изменяющихся во времени сигналов. Высокое разрешение и локальность как во времени, так и на частоте обеспечивают хорошие характеристики для идентификации аналогичных типов модуляции. Используйте wvd функцию для вычисления сглаженного псевдо 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 для каждого типа модуляции. Для каждого сигнала вычислите сглаженное псевдо-распределение Вигнера-Вилля и уменьшите результат до матрицы 227 на 227. Сохранить матрицу .png файл изображения в подкаталоге, соответствующем типу модуляции сигнала. Вспомогательная функция helperGenerateTFDfiles выполняет все эти шаги. Этот процесс займет несколько минут из-за большого размера базы данных и сложности wvd алгоритм. Вы можете заменить tempdir с другим каталогом, в котором имеется разрешение на запись.

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

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

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);

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

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

Загрузить SqueeEnet.

net = squeezenet;

Извлеките график слоев из сети. Убедитесь, что SqueEENet настроен для изображений размером 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]

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

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);

Последний обучаемый уровень в SqueeExNet является сверточным уровнем 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™ параллельных вычислений, MATLAB автоматически использует графический процессор для обучения. В противном случае используется ЦП. Графики точности обучения на рисунке показывают ход обучения сети по всем итерациям. На трех типах радиолокационной модуляции сеть правильно классифицирует почти 100% обучающих сигналов.

trainedNet = trainNetwork(imdsTrain,lgraphSqz,options);

Оценка рабочих характеристик радиолокационных сигналов

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

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

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

Частотный спектр радиолокационной системы классификации должен конкурировать с другими передаваемыми источниками. Давайте посмотрим, как созданная сеть распространяется на другие моделируемые типы модуляции. Другой пример MathWorks, классификация модуляции с глубоким обучением (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')

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

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 в хранилище данных образа, чтобы извлечь из тестового набора данных один образ из каждого класса. Визуально отображаемый 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] Бринольфссон, Юхан и Мария Сандстен. «Классификация одномерных нестационарных сигналов с использованием распределения Вигнера-Вилля в сверточных нейронных сетях» 25-я Европейская конференция по обработке сигналов (EUSIPCO). IEEE, 2017.

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

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