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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[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')

Функция помощника helperGenerateTFDfiles вычисляет сглаживавший псевдо WVD для каждого входного сигнала, субдискретизирует результат измерить 227 227 и сохраняет его как изображение. Папка TFDDatabase в текущем каталоге создается, чтобы сохранить все дистрибутивы для каждого типа модуляции. Каждый тип модуляции помещается в подпапку с именем согласно ее типу. Этот процесс может занять несколько минут из-за большого размера базы данных и сложности алгоритма wvd .

helperGenerateTFDfiles(wav,modType,100e6)

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

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

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

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

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

Прежде чем нейронная сеть для глубокого обучения может быть обучена, задать сетевую архитектуру. Этот пример использует передачу, учащуюся для AlexNet, который является глубоким CNN, созданным для классификации изображений. Изучение передачи является процессом переквалификации существующей нейронной сети, чтобы классифицировать новые цели. Эта сеть принимает вход изображений размера 227 227 3. До входа к сети пользовательская функция чтения readTFDForAlexNet преобразовывает двумерную плотность распределения времени к изображению RGB правильного размера. AlexNet выполняет классификацию 1 000 категорий в ее настройке по умолчанию. Чтобы настроить AlexNet для наших потребностей, мы должны изменить итоговые три слоя классификации, таким образом, они классифицируют только три радарных типа модуляции.

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

numClasses = 3;
net = alexnet;
layersTransfer = net.Layers(1:end-3);
layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer]
layers = 
  25x1 Layer array with layers:

     1   'data'    Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'   Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'   ReLU                          ReLU
     4   'norm1'   Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'   Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'   Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'   ReLU                          ReLU
     8   'norm2'   Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'   Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'   Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'   ReLU                          ReLU
    12   'conv4'   Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'   ReLU                          ReLU
    14   'conv5'   Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'   ReLU                          ReLU
    16   'pool5'   Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'     Fully Connected               4096 fully connected layer
    18   'relu6'   ReLU                          ReLU
    19   'drop6'   Dropout                       50% dropout
    20   'fc7'     Fully Connected               4096 fully connected layer
    21   'relu7'   ReLU                          ReLU
    22   'drop7'   Dropout                       50% dropout
    23   ''        Fully Connected               3 fully connected layer
    24   ''        Softmax                       softmax
    25   ''        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(shuffle(imdsTrain),layers,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(wav,modType,200e3)
folders = fullfile('TFDDatabase',{'Rect','LFM','Barker','GFSK','CPFSK','B-FM','SSB-AM','DSB-AM'});
imds = imageDatastore(folders,...
    'FileExtensions','.png','LabelSource','foldernames','ReadFcn',@readTFDForAlexNet);

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

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

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

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

numClasses = 8;
net = alexnet;
layersTransfer = net.Layers(1:end-3);
layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

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

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

trainedNet = trainNetwork(shuffle(imdsTrain),layers,options);

Оцените производительность на всех сигналах

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

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

Для восьми входов типов модуляции к сети, более чем 99% B-FM, CPFSK, GFSK, Кусачек для снятия оболочки, были правильно классифицированы Прямоугольные, и типы модуляции LFM. В среднем более чем 85% сигналов AM были правильно идентифицированы. Из матрицы беспорядка высокий процент сигналов DSB-AM был неправильно классифицирован как SSB-AM и SSB-AM как DSB-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.