這個例子展示了如何使用深度學習過程對聲音進行分類。
1、數據集生成
生成1000個白噪聲信號、1000個棕色噪聲信號和1000個粉色噪聲信號。假設采樣率為44.1 kHz,每個信號表示0.5秒的持續時間。
fs = 44.1e3;duration = 0.5;N = duration*fs;
wNoise = 2*rand([N,1000]) - 1;wLabels = repelem(categorical("white"),1000,1);
bNoise = filter(1,[1,-0.999],wNoise);bNoise = bNoise./max(abs(bNoise),[],'all');bLabels = repelem(categorical("brown"),1000,1);
pNoise = pinknoise([N,1000]);pLabels = repelem(categorical("pink"),1000,1);
2、數據可視化
聽聲音信號,并使用melSpectrogram函數將其可視化。
sound(wNoise(:,1),fs)melSpectrogram(wNoise(:,1),fs)title('White Noise')
sound(bNoise(:,1),fs)melSpectrogram(bNoise(:,1),fs)title('Brown Noise')
sound(pNoise(:,1),fs)melSpectrogram(pNoise(:,1),fs)title('Pink Noise')
3、將數據集分為訓練集和驗證集
創建一個由800個白噪聲信號、800個棕色噪聲信號和800個粉色噪聲信號組成的訓練集。
audioTrain = [wNoise(:,1:800),bNoise(:,1:800),pNoise(:,1:800)];labelsTrain = [wLabels(1:800);bLabels(1:800);pLabels(1:800)];
使用剩余的200個白噪聲信號、200個棕色噪聲信號和200個粉色噪聲信號創建驗證集。
audioValidation = [wNoise(:,801:end),bNoise(:,801:end),pNoise(:,801:end)];labelsValidation = [wLabels(801:end);bLabels(801:end);pLabels(801:end)];
4、信號提取
音頻數據是高維的,通常包含冗余信息。通過首先提取特征,然后使用提取的特征訓練模型,可以降低維數。創建audioFeatureExtractor對象以提取mel光譜隨時間變化的質心和斜率。
aFE = audioFeatureExtractor("SampleRate",fs, ... "SpectralDescriptorInput","melSpectrum", ... "spectralCentroid",true, ... "spectralSlope",true);
調用extract從音頻訓練數據中提取特征。
featuresTrain = extract(aFE,audioTrain);[numHopsPerSequence,numFeatures,numSignals] = size(featuresTrain)
5、數據準備
在下一步中,您將把提取的特征視為序列,并使用sequenceInputLayer作為深度學習模型的第一層。當使用SequenceInputLayers作為網絡中的第一層時,trainNetwork希望將訓練和驗證數據格式化為序列的單元數組,其中每個序列隨時間由特征向量組成。sequenceInputLayer要求時間維度沿第二維度。
featuresTrain = permute(featuresTrain,[2,1,3]);featuresTrain = squeeze(num2cell(featuresTrain,[1,2]));
numSignals = numel(featuresTrain)numSignals = 2400
[numFeatures,numHopsPerSequence] = size(featuresTrain{1})numFeatures = 2
numHopsPerSequence = 42
提取特征
featuresValidation = extract(aFE,audioValidation);featuresValidation = permute(featuresValidation,[2,1,3]);featuresValidation = squeeze(num2cell(featuresValidation,[1,2]));
6、定義和訓練網絡
定義網絡架構。
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(50,"OutputMode","last") fullyConnectedLayer(numel(unique(labelsTrain))) softmaxLayer classificationLayer];
要定義train選項,請使用option選項(深度學習工具箱)。
options = trainingOptions("adam", ... "Shuffle","every-epoch", ... "ValidationData",{featuresValidation,labelsValidation}, ... "Plots","training-progress", ... "Verbose",false);
要訓練網絡,請使用trainNetwork(深度學習工具箱)。
net = trainNetwork(featuresTrain,labelsTrain,layers,options);
7、驗證網絡
使用經過訓練的網絡對新的白噪聲、棕色噪聲和粉色噪聲信號進行分類。
wNoiseTest = 2*rand([N,1]) - 1;classify(net,extract(aFE,wNoiseTest)')ans = categorical whitebNoiseTest = filter(1,[1,-0.999],wNoiseTest);bNoiseTest= bNoiseTest./max(abs(bNoiseTest),[],'all');classify(net,extract(aFE,bNoiseTest)')ans = categorical brownpNoiseTest = pinknoise(N);classify(net,extract(aFE,pNoiseTest)')ans = categorical pink
?
總結
以上是生活随笔為你收集整理的Matlab-基于短时神经网络的声音分类的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。