主要内容

基于后期融合的声场景识别

这个例子展示了如何建立一个多模型的声场景识别后期融合系统。这个例子训练卷积神经网络(CNN)使用mel谱图和集成分类器使用小波散射。该示例使用TUT数据集进行训练和评估[1]。

介绍

声场景分类(ASC)是根据环境产生的声音对环境进行分类的任务。ASC是一个通用的分类问题,是设备、机器人和许多其他应用程序中上下文感知的基础[1]。ASC的早期尝试使用了mel频率倒谱系数(mfcc)和高斯混合模型(GMMs)来描述它们的统计分布。用于ASC的其他流行特征包括过零率、光谱质心(光谱熵)、谱衰减(spectralRolloffPoint)、谱通量(spectralFlux),以及线性预测系数(lpc的)[5]。通过训练隐马尔可夫模型(hmm)来描述广义马尔可夫模型的时间演化。最近,性能最好的系统使用了深度学习(通常是cnn)和多种模型的融合。在DCASE 2017竞赛中,排名靠前的系统最受欢迎的功能是mel谱图(光谱图)。挑战中排名靠前的系统使用了后期融合和数据增强技术来帮助其系统实现通用化。

为了说明一种产生合理结果的简单方法,本例使用mel谱图训练CNN,使用小波散射训练集成分类器。CNN和集成分类器的总体准确率大致相当,但在区分不同的声学场景方面表现得更好。为了提高总体精度,您可以使用后期融合来合并CNN和集成分类器结果。

加载声学场景识别数据集

要运行此示例,必须首先下载数据集[1]。完整的数据集约为15.5 GB。根据您的计算机和internet连接,下载数据可能需要大约4小时。

downloadFolder=tempdir;datasetFolder=fullfile(downloadFolder,“图坦卡蒙-声场景- 2017”);如果~存在(datasetFolder“dir”) disp (“下载TUT-acoustic-scenes-2017 (15.5 GB)……”) HelperDownload_TUT_acoustic_scenes_2017 (datasetFolder);终止

以表的形式读入开发集元数据。命名表变量文件名,AcousticScene,SpecificLocation

metadata_train = readtable (fullfile (datasetFolder“TUT-acoustic-scenes-2017-development”,“meta.txt”),...“分隔符”, {' \ t '},...“ReadVariableNames”、假);metadata_train.Properties。VariableNames = {“文件名”,“AcousticScene”,“SpecificLocation”};头(metadata_train)
8×3)表文件名名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称声学声学声学(声音)音音音(8×3)表文件名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称声学声学声学声学声学声学(词汇词汇名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称音频/b020_100_110.wav'}{'beach'}{'b020'}{'audio/b020_40_50.wav'}{'beach'}{'b020'}{'audio/b020_50_60.wav'}{'beach'}{'b020'}{'audio/b020_30_40.wav'}{'beach'}{'b020'}{'audio/b020_160_170.wav'}{'beach'}{'b020'}{'audio/b020_170_180.wav'}{'beach'}{'b020'}
metadata_test = readtable (fullfile (datasetFolder“TUT-声学-场景-2017-评估”,“meta.txt”),...“分隔符”, {' \ t '},...“ReadVariableNames”、假);metadata_test.Properties。VariableNames = {“文件名”,“AcousticScene”,“SpecificLocation”};头(metadata_test)
8×3)表文件名:8×3)表文件名:8×3)表文件名文件名:声学声学声学声学词汇词汇词汇表文件名名称名称名称名称名称名称名称名称名称声学声学词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇表文件名声学词汇词汇表文件名声学词汇词汇词汇词汇词汇表文件名声学词汇词汇词汇词汇词汇词汇词汇词汇词汇词汇表表表文件名声学词汇词汇表文件名声学词汇词汇词汇词汇表文件名,词汇表文件名声学词汇词汇表文件名,词汇表词汇表文件名声学词汇词汇词汇词汇词汇表词汇词汇表词汇词汇表词汇表词汇表词汇表词汇词汇词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表文件名声学声学声学声学词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇表词汇7.wav'}{'beach'}{'b174'}{'audio/203.wav'}{'beach'}{'b174'}{'audio/777.wav'}{'beach'}{'b174'}{'audio/231.wav'}{'beach'}{'b174'}{'audio/768.wav'}{'beach'}{'b174'}

请注意,测试集中的特定记录位置与开发集中的特定记录位置不相交。这使得验证经过训练的模型是否可以推广到真实世界的场景变得更加容易。

sharedRecordingLocations =相交(metadata_test.SpecificLocation metadata_train.SpecificLocation);流('列车和测试集中特定记录位置的数量= %d\n'元素个数(sharedRecordingLocations))
列车和测试集中特定记录位置的数量=0

元数据表的第一个变量包含文件名。将文件名与文件路径连接起来。

train_filePaths = fullfile (datasetFolder,“TUT-acoustic-scenes-2017-development”, metadata_train.FileName);test_filePaths = fullfile (datasetFolder,“TUT-声学-场景-2017-评估”, metadata_test.FileName);

为列车和测试集创建音频数据存储。设置标签财产的音频数据存储去音响现场,打电话countEachLabel验证列车和试验装置中标签的均匀分布。

adsTrain = audioDatastore (train_filePaths,...“标签”分类(metadata_train.AcousticScene),...“IncludeSubfolders”,真正的);display(countEachLabel(adsTrain)) adsTest = audioDatastore(test_filepath,)...“标签”,分类(元数据测试,声学场景),...“IncludeSubfolders”,真正的);显示器(countEachLabel (adsTest))
15×2餐桌标签计数-海滩312公共汽车312咖啡馆/餐厅312汽车312城市中心312森林路312杂货店312家庭312图书馆312地铁站312办公室312公园312住宅区312火车312有轨电车312 15×2餐桌标签计数-海滩108公共汽车108城市中心8森林路108杂货店108住宅108图书馆108地铁站108办公室108公园108住宅区108火车108有轨电车108

您可以减少本例中使用的数据集,以以性能为代价加快运行时间。通常,减少数据集是开发和调试的一种良好实践。集reduceDataset真正的来减少数据集。

reducedastatset=false;如果简化的数据集adsTrain=拆分的每个标签(adsTrain,20);adsTest=拆分标签(adsTest,10);终止

调用从列车组获取文件的数据和采样率。数据库中的音频具有一致的采样率和持续时间。规范化音频并收听。显示相应的标签。

[数据,adsInfo]=读取(adsTrain);数据=数据。/max(数据,[],“所有”);fs = adsInfo.SampleRate;声音(数据、fs)流('声学场景=%s\n',adsTrain.标签(1))
音响场景

调用重置将数据存储返回到其初始状态。

重置(adsTrain)

CNN的特征提取

数据集中的每个音频剪辑由10秒的立体声(左-右)音频组成。本例中的特征提取管道和CNN架构基于[3].特征提取的超参数、CNN体系结构和培训选项均使用系统的超参数优化工作流从原始文件中修改。

首先,将音频转换为中间编码。[3]表示,中间编码数据提供了更好的空间信息,CNN可以使用这些信息来识别移动源(例如一列火车在声音场景中移动)。

dataMidSide =[总和(数据,2),数据(:1)拼(:,2)];

将信号分成具有重叠的一秒段。最后的系统使用1秒片段的概率加权平均来预测测试集中每个10秒音频片段的场景。将音频片段分成一秒的片段可以使网络更容易训练,并有助于防止对训练集中的特定声音事件进行过拟合。重叠有助于确保训练数据能够捕获相对于其他特征的所有组合。它还为系统提供了额外的数据,这些数据可以在扩展过程中唯一混合。

segmentLength = 1;segmentOverlap = 0.5;[dataBufferedMid, ~] =缓冲区(dataMidSide(: 1),圆(segmentLength * fs),圆(segmentOverlap * fs),“诺德利”);[dataBufferedSide, ~] =缓冲区(dataMidSide(:, 2),圆(segmentLength * fs),圆(segmentOverlap * fs),“诺德利”);dataBuffered = 0(大小(dataBufferedMid, 1),大小(dataBufferedMid 2) +大小(dataBufferedSide, 2));dataBuffered(: 1:2:结束)= dataBufferedMid;dataBuffered(: 2:2:结束)= dataBufferedSide;

使用光谱图将数据转换为紧凑的频域表示。按照[3]的建议定义mel谱图的参数。

窗长=2048;samplesPerHop=1024;samplesOverlap=窗口长度-samplesPerHop;FFT长度=2*窗长;numBands=128;

光谱图独立地沿通道操作。为了优化处理时间,请调用光谱图与整个缓冲信号。

规范= melSpectrogram (dataBuffered fs,...“窗口”,汉明(窗长,“周期性”),...“OverlapLength”,样本重叠,...“FFTLength”,fft长度,...“NumBands”, numBands);

将mel光谱图转换为对数刻度。

spec=log10(spec+eps);

将数组整形为维度(带数)-按-(跳数)-按-(通道数)-按-(段数)。当你将一个图像输入神经网络时,前两个维度是图像的高度和宽度,第三个维度是通道,第四个维度将单个图像分离。

X =重塑(规格、尺寸(规范,1),大小(规范,2),大小(数据,2),[]);

调用光谱图无输出参数,以绘制中间通道的mel频谱图,增量为1秒的前六个增量。

对于通道=1:2:11图4频谱图(数据缓冲(:,通道),fs,...“窗口”,汉明(窗长,“周期性”),...“OverlapLength”,样本重叠,...“FFTLength”,fft长度,...“NumBands”, numBands);标题(sprintf ('段%d'装天花板(频道/ 2)))终止

辅助函数HelperSegmentedMelSpectrograms执行上述特征提取步骤。

要加快处理速度,请使用提取数据存储中所有音频文件的mel频谱图高的数组。与内存中的数组不同,高数组在您请求使用聚集此延迟评估使您能够快速处理大型数据集。当您最终使用聚集,MATLAB在可能的情况下结合排队计算,并采用通过数据的最小次数。如果你有并行计算工具箱™, 您可以在本地MATLAB会话或本地并行池中使用高数组。如果您有MATLAB®并行服务器,还可以在集群上运行高阵列计算™ 安装。

如果没有并行计算工具箱™, 本例中的代码仍在运行。

pp=parpool(“IdleTimeout”、正);train_set_tall =高(adsTrain);xTrain = cellfun (@ (x) HelperSegmentedMelSpectrograms (x, fs,...“SegmentLength”segmentLength,...“分段重叠”segmentOverlap,...“WindowLength”windowLength,...“啤酒花长度”samplesPerHop,...“NumBands”numBands,...“FFTLength”fftLength),...train_set_tall,...“UniformOutput”,假);xTrain=收集(xTrain);xTrain=cat(4,xTrain{:});测试设置高度=高度(adsTest);xTest=cellfun(@(x)HelperSegmentedMelSpectrograms(x,fs,...“SegmentLength”segmentLength,...“分段重叠”segmentOverlap,...“WindowLength”windowLength,...“啤酒花长度”samplesPerHop,...“NumBands”numBands,...“FFTLength”fftLength),...测试设置高度,...“UniformOutput”,false);xTest=gather(xTest);xTest=cat(4,xTest{:});
使用“local”配置文件启动并行池(parpool)…连接到平行池(工人数量:6)。评估高表达式使用并行池“当地”:通过1对1:3分45秒完成评估在3分45秒完成评估高表达式使用并行池“当地”:通过1对1:在1分22秒内完成评估完成1分22秒

复制训练集的标签,使其与片段一一对应。

numSegmentsPer10seconds =大小(dataBuffered, 2) / 2;yTrain = repmat (adsTrain.Labels 1 numSegmentsPer10seconds)”;yTrain = yTrain (:);

CNN的数据扩充

DCASE 2017数据集包含了任务中相对较少的声学记录,开发集和评估集记录在不同的特定位置。因此,在训练过程中很容易对数据进行过度拟合。减少过拟合的一个流行方法是混合.在mixup中,您可以通过混合两个不同类的特性来扩充数据集。当你混合功能时,你混合了相同比例的标签。那就是:

$ $ \开始{数组}{1}\波浪号{\ mathrm {x}} = \λ{\ mathrm {x}} _i + \离开(1 - \λ# xA; \右){\ mathrm {x}} _j \ \ \波浪号{y} = \λy_i + \离开(1 - \λ\右)y_j \{数组}$ $

混合由[2]重新表述为从概率分布中提取的标签,而不是混合标签。本例中混合的实现是混合的简化版本:每个谱图与不同标签的谱图混合,λ设置为0.5。将原始数据集和混合数据集结合起来进行训练。

xTrainExtra = xTrain;yTrainExtra = yTrain;λ= 0.5;对于i = 1:尺寸(xTrain, 4)找到所有不同标签的光谱图。availableSpectrograms =找到(yTrain ~ = yTrain(我));%随机选择一个具有不同标签的可用光谱图。numAvailableSpectrograms =元素个数(availableSpectrograms);, numAvailableSpectrograms idx =兰迪([1]);%的组合。xtrainExtrain(:,:,:,i)=λ*xTrain(:,:,:,i)+(1-lambda)*xTrain(:,:,:,可用特殊程序(idx));%指定由lambda随机设置的标签。如果rand > lambda yTrainExtra(i) = yTrain(availableespectrograms (idx));终止终止xTrain =猫(4 xTrain xTrainExtra);yTrain = [yTrain; yTrainExtra];

调用总结显示扩展训练集的标签分布。

摘要(yTrain)
海滩公共汽车咖啡馆/餐厅汽车城市中心森林小路杂货店家庭图书馆地铁车站办公公园住宅区火车有轨电车

定义和培训CNN

定义CNN架构。该体系结构基于[1],并经过反复试验进行了修改。看到深度学习层列表(深度学习工具箱)了解更多关于MATLAB®中可用的深度学习层。

imgSize = [(xTrain, 1),大小(xTrain, 2),大小(xTrain, 3)];numF = 32;层= [...imageInputLayer (imgSize) batchNormalizationLayer convolution2dLayer (3 numF“填充”,“相同”)batchNormalizationLayer reluLayer卷积2dLayer(3,numF,“填充”,“相同”)batchNormalizationLayer reluLayer MaxPoolig2dLayer(3,“大步走”,2,“填充”,“相同”)卷积2层(3,2*numF,“填充”,“相同”)batchNormalizationLayer reluLayer卷积2Dlayer(3,2*numF,“填充”,“相同”)batchNormalizationLayer reluLayer MaxPoolig2dLayer(3,“大步走”,2,“填充”,“相同”) convolution2dLayer(3、4 * numF,“填充”,“相同”)batchNormalizationLayer reluLayer卷积2Dlayer(3,4*numF,“填充”,“相同”)batchNormalizationLayer reluLayer MaxPoolig2dLayer(3,“大步走”,2,“填充”,“相同”) convolution2dLayer (3 8 * numF,“填充”,“相同”) batchNormalizationLayer reluLayer卷积2dlayer (3,8*numF,“填充”,“相同”)batchNormalizationLayer reluLayer全局平均池2层dropoutLayer(0.5)完全连接层(15)softmaxLayer classificationLayer];

定义trainingOptions(深度学习工具箱)美国有线电视新闻网。这些选项基于[3],并通过系统的超参数优化工作流进行修改。

miniBatchSize = 128;tuneme = 128;lr = 0.05 * miniBatchSize / tuneme;选择= trainingOptions (“个”,...“InitialLearnRate”、lr、...“MiniBatchSize”miniBatchSize,...“动量”, 0.9,...“L2规范化”,0.005,...“MaxEpochs”8....“洗牌”,“every-epoch”,...“情节”,“训练进步”,...“详细”假的,...“LearnRateSchedule”,“分段”,...“LearnRateDropPeriod”,2,...“LearnRateDropFactor”,0.2);

调用trainNetwork(深度学习工具箱)训练网络。

trainedNet=列车网络(xTrain、yTrain、图层、选项);

评估美国有线电视新闻网

调用预测(深度学习工具箱)使用保持测试集预测训练网络的响应。

cnnResponsesPerSegment =预测(trainedNet xTest);

平均每个10秒音频剪辑的响应。

类= trainedNet.Layers . class(结束);numFiles =元素个数(adsTest.Files);counter = 1;cnnResponses = 0 (numFiles元素个数(类));对于channel = 1:numFiles cnnResponses(channel,:) = sum(cnnResponsesPerSegment(counter:counter+numSegmentsPer10seconds-1,:),1)/numSegmentsPer10seconds;counter = counter + numsegmentsper10秒;终止

对于每个10秒的音频剪辑,选择预测的最大值,然后将其映射到相应的预测位置。

[~,classIdx]=max(cnnResponses,[],2);cnnPredictedLabels=classes(classIdx);

调用confusionchart(深度学习工具箱)使测试集的准确性可视化。返回命令窗口的平均精度。

图(“单位”,“正常化”,“位置”,[0.2 0.2 0.5 0.5]) cm = confusionchart(adsTest。标签,cnnPredictedLabels,“头衔”,“测试准确性- CNN”);厘米。ColumnSummary =“列规格化”;厘米。RowSummary =“row-normalized”;流('CNN的平均精度=%0.2f\n',意味着(adsTest.Labels = = cnnPredictedLabels) * 100)
CNN的平均准确度=73.33

集成分类器的特征提取

小波散射在[4]中得到了很好的表现。定义一个waveletScattering(小波工具箱)对象。通过反复试验确定了不变性量表和质量因子。

科幻小说= waveletScattering (“SignalLength”,大小(数据,1),...“采样频率”fs,...“不变性刻度”,0.75,...“质量因素”,[4 1]);

将音频信号转换为单声道,然后呼叫特征矩阵(小波工具箱)要返回散射分解框架的散射系数,科幻小说

dataMono =意味着(数据,2);dataMono scatteringCoeffients = featureMatrix(科幻小说,“转换”,“日志”);

对10秒音频剪辑的散射系数求平均值。

featureVector =意味着(scatteringCoeffients, 2);流('每10秒剪辑的小波特征数=%d\n',numel(特征向量))
每10秒剪辑的小波特征数=290

辅助函数HelperWaveletFeatureVector执行上述步骤。使用一个高的排列cellfunHelperWaveletFeatureVector并行特征提取。提取列车和测试集的小波特征向量。

scatteringTrain = cellfun (@ (x) HelperWaveletFeatureVector (x,科幻小说),train_set_tall,“UniformOutput”、假);xTrain =收集(scatteringTrain);xTrain = cell2mat (xTrain ') ';scatteringTest = cellfun (@ (x) HelperWaveletFeatureVector (x,科幻小说),test_set_tall,“UniformOutput”、假);xTest =收集(scatteringTest);xTest = cell2mat (xTest ') ';
使用并行池“本地”评估tall表达式:-通过1/1:在25分钟15秒内完成评估在25分钟15秒内完成使用并行池“本地”评估tall表达式:-通过1/1:在8分钟2秒内完成评估在8分钟2秒内完成

定义和训练集成分类器

使用菲特森布尔创建经过训练的分类集成模型(ClassificationEnsemble).

子空间维度= min(150,size(xTrain,2) - 1);numLearningCycles = 30;classificationEnsemble = fitcensemble (xTrain adsTrain。标签,...“方法”,“子”,...“NumLearningCycles”numLearningCycles,...“学习者”,“判别”,...“NPredToSample”subspaceDimension,...“类名”,removecats(唯一(adsTrain.Labels));

评估系综分类器

对于每个10秒的音频剪辑,打电话预测返回标签和权重,然后将其映射到相应的预测位置。调用confusionchart(深度学习工具箱)将测试集上的精度可视化。打印平均值。

[waveletPredictedLabels, waveletResponses] =预测(classificationEnsemble xTest);图(“单位”,“正常化”,“位置”,[0.2 0.2 0.5 0.5]) cm = confusionchart(adsTest。标签,waveletPredictedLabels,“头衔”,“测试精度-小波散射”);厘米。ColumnSummary =“列规格化”;厘米。RowSummary =“row-normalized”;流('分类器的平均准确率= %0.2f\n',平均值(adsTest.Labels==小波预测标签)*100)
分类器的平均精度=76.05

应用后期融合

对于每一个10秒的剪辑,在小波分类器上调用predict, CNN返回一个向量,表示对他们决策的相对信心。乘以小波响应CNN回复创建一个后期融合系统。

融合= wavetresponses .* cnnResponses;[~, classIdx] = max(融合,[],2);predictedLabels =类(classIdx);

评估晚期融合

调用confusionchart将融合后的分类精度可视化。打印平均精度到命令窗口。

图(“单位”,“正常化”,“位置”,[0.2 0.2 0.5 0.5]) cm = confusionchart(adsTest。标签,predictedLabels,“头衔”,“测试精度-融合”);厘米。ColumnSummary =“列规格化”;厘米。RowSummary =“row-normalized”;流('融合模型的平均精度=%0.2f\n',平均值(adsTest.Labels==predictedLabels)*100)
融合模型的平均精度=78.21

关闭并行池。

删除(pp)
使用“本地”配置文件的并行池正在关闭。

参考文献

[1] A.Mesaros、T.Heittola和T.Virtanen.声学场景分类:DCASE 2017挑战赛参赛作品概述。过程中。声学信号增强国际研讨会,2018年。

[2] Huszar,费伦茨。“混合:依赖数据的数据增强。”推理。2017年11月3日。2019年1月15日生效https://www.inference.vc/mixup-data-dependent-data-augmentation/

[3]韩允昌、朴正洙、李京九声学场景和事件的检测与分类(DCASE)(2017): 1-5。

Lostanlen, Vincent和Joakim Anden。基于小波散射的双耳场景分类。技术报告,DCASE2016挑战赛,2016。

A. J. Eronen, V. T. Peltonen, J. T. Tuomi, A. P. Klapuri, S. Fagerlund, T. Sorsa, G. Lorho, and J. Huopaniemi,“基于音频的上下文识别”,IEEE Trans。《音频、语音和语言处理》,第14卷,第2期。1,页321-329,2006年1月。

[6]2017年图坦卡蒙声学场景,开发数据集

[7]TUT声学场景2017,评估数据集

附录—支持功能金宝app

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%HelperSegmentedMelSpectrograms函数X = HelperSegmentedMelSpectrograms(X,fs,varargin) p = inputParser;addParameter (p,“WindowLength”,1024); addParameter(p,“啤酒花长度”, 512);addParameter (p,“NumBands”, 128);addParameter (p,“SegmentLength”,1); addParameter(p,“分段重叠”,0);addParameter(p,“FFTLength”, 1024);解析(p,varargin{:}) params = p. results;x = [(x, 2)和x (: 1) - x (:, 2)];x = x / max (max (x));[xb_m, ~] =缓冲区(x(: 1),圆(params.SegmentLength * fs),圆(params.SegmentOverlap * fs),“诺德利”);[xb_s, ~] =缓冲区(x(:, 2),圆(params.SegmentLength * fs),圆(params.SegmentOverlap * fs),“诺德利”);xb = 0(大小(xb_m, 1),大小(xb_m 2) +大小(xb_s, 2));xb = xb_m(1:2,::结束);xb = xb_s(: 2:2:结束);规范= melSpectrogram (xb, fs,...“窗口”汉明(参数。WindowLength,“周期性”),...“OverlapLength”,参数个数。WindowLength——参数。HopLength,...“FFTLength”,参数个数。FFTLength,...“NumBands”,params.NumBands,...“FrequencyRange”[0,地板(fs / 2)));规范= log10(规范+ eps);X =重塑(规格、尺寸(规范,1),大小(规范,2),大小(X, 2), []);终止%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HelperWaveletFeatureVector函数feature = helperwaveetfeaturevector (x,sf) x = mean(x,2);特点= featureMatrix(科幻,x,“转换”,“日志”); 特征=平均值(特征,2);终止%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%