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

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

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

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

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

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

  • Код кусачек для снятия оболочки

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

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

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

  • Модуляция частоты вещания (B-FM)

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

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

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

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

Сгенерируйте 3 000 сигналов с частотой дискретизации 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

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

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

Создайте объект 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 выполняет классификацию 1 000 категорий в ее настройке по умолчанию.

Загрузите 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 = 
  6x1 Layer array with layers:

     1   'drop9'                             Dropout                  50% dropout
     2   'conv10'                            Convolution              1000 1x1x512 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);

Последний learnable слой в 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 = 
  6x1 Layer array with layers:

     1   'new_dropout'       Dropout                  60% dropout
     2   'new_conv'          Convolution              3 1x1 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. Из-за большого размера набора данных процесс может занять несколько минут. Если ваша машина имеет графический процессор и Parallel Computing 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 для каждого входного сигнала. Создайте объект 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, Кусачек для снятия оболочки и типов модуляции LFM. В среднем более чем 85% сигналов AM были правильно идентифицированы. Из матрицы беспорядка высокий процент сигналов SSB-AM был неправильно классифицирован как DSB-AM и сигналы DSB-AM как SSB-AM.

Давайте исследуем несколько из этих misclassifications, чтобы получить сведения о процессе обучения сети. Используйте readimage функция на 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] Бринолфссон, Йохан и Мария Сэндстен. "Классификация одномерных неустановившихся сигналов с помощью распределения Wigner-Ville в сверточных нейронных сетях". 25-я европейская Конференция по Обработке сигналов (EUSIPCO). IEEE, 2017.

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

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

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