Этот пример показывает, как классифицировать радиолокационные и коммуникационные формы волны с помощью распределения Вигнера-Вилля (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.
classify
| convolution2dLayer
| layerGraph
| trainingOptions
| trainNetwork