В этом примере показано, как классифицировать радарные типы формы волны сгенерированных синтетических данных с помощью Распределения 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 представляет представление частоты времени исходных данных, которые полезны в течение времени, варьируясь сигналы. Высокое разрешение и местность и во время и в частоту обеспечивают хорошие функции идентификации подобных типов модуляции. Используйте 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',... 'ExecutionEnvironment','auto',... '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',... 'ExecutionEnvironment','auto',... '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.
classify
| convolution2dLayer
| layerGraph
| trainNetwork
| trainingOptions