主要内容

基于多基音估计和HMM的基音跟踪

这个例子展示了如何使用多个基音估计、倍频和中值平滑以及隐马尔可夫模型(HMM)来执行基音跟踪。

介绍

基音检测是语音处理、语音编码和音乐信息检索的基本组成部分。在语音和说话人识别中,基音是机器学习系统中的一个特征。对于呼叫中心来说,pitch用来表示客户的情绪状态和性别。在语言治疗中,音高被用来指示和分析病理和诊断身体缺陷。在MIR中,音高用于对音乐进行分类,用于按哼声查询系统,并作为歌曲识别系统的一个主要特征。

摘要洁净语音的基音检测是一个比较容易解决的问题。带噪声的基音检测和多基音跟踪一直是难点。有许多算法在文献中被广泛报道,它们在计算成本和对不同类型噪声的鲁棒性之间有已知的权衡。

通常,基音检测算法(PDA)估计给定时刻的基音。然后在基音跟踪系统中验证或校正基音估计。音高跟踪系统加强音高估计随时间的连续性。

这个例子提供了一个示例函数,HelperPitchTracker,实现了俯仰跟踪系统。方法实现的算法HelperPitchTracker函数。

问题总结

加载音频文件和音频文件的相应参考音高。参考音高每10 ms报告一次,并确定为干净语音文件上几个第三方算法的平均值。没有浊音语音的区域表示为

[x,fs]=音频读取(“Counting-16-44p1-mono-15secs.wav”);负载TruePitch.mat特鲁奇奇

使用球场函数估计音频随时间的音调。

(f0、loc) =音高(x, fs);

定义基音误差时,通常会报告两个指标:总基音误差(GPE)和发声决策误差(VDE)。由于本例中的基音算法不提供发声决策,因此只报告GPE。在本例中,GPE计算为外部基音估计的百分比 ± 10 参考音高高于浊音段的音高。

计算语音区域的GPE并绘制结果。听干净的音频信号。

isVoiced=~isnan(真音高);f0(~isVoiced)=nan;p=0.1;GPE=平均值(abs(f0(真音高)-truePitch(真音高))>truePitch(真音高)。*p.*100;t=(0:length(x)-1)/fs;t0=(locs-1)/fs;声音(x,fs)图(1)平铺布局(2,1)下一个小图(t,x)标签(“振幅”)标题(“洁净信号的基音估计”)NextDile Plot(T0,[TruePitch,F0])图例(“参考”“估计”“位置”“西北”)伊拉贝尔(‘F0(赫兹)’)xlabel('时间'')头衔(斯普林特)(“GPE = % 0.1 f % %”, GPE))

把语音信号和噪声混合在一起 - 5 dB信噪比。

使用球场功能上的噪声音频估计的pitch随时间。计算语音区域的GPE并绘制结果。听嘈杂的音频信号。

desiredSNR=-5;x=mixsr(x,rand(size(x)),desiredSNR);[f0,locs]=音高(x,fs);f0(~isVoiced)=nan;GPE=平均值(abs(abs)(f0(isVoiced)-truePitch(isVoiced))>truePitch(isVoiced)。*p.*100;声音(x,fs)图(2)平铺布局(2,1)下一个小图(t,x)标签(“振幅”)标题(“噪声信号的基音估计”)NextDile Plot(T0,[TruePitch,F0])图例(“参考”“估计”“位置”“西北”)伊拉贝尔(‘F0(赫兹)’)xlabel('时间'')头衔(斯普林特)(“GPE = % 0.1 f % %”, GPE))

该示例说明如何使用多个音高候选生成,八度平滑,中值平滑和嗯,改善噪声语音信号的音高估计。

本例中描述的算法在示例函数中实现HelperPitchTracker.了解HelperPitchTracker函数,输入HelperPitchTracker在命令行。

帮助HelperPitchTracker
HelperPitchTracker跟踪音频信号F0 = HelperPitchTracker(AudioIn,FS)的基频返回音频输入的基频轮廓的估计。输入的列被视为单独的通道。HelperPitchTracker函数使用多个俯仰检测算法来生成音高候选,并使用八度平滑和隐藏的马尔可夫模型来返回基频的估计。F0 = HelperPitchTracker(...,','hoplength',hoplength)指定每跳中的样本数。每个跳都会更新音高估计。将HopLength指定为标量整数。如果未指定,HopLength默认为圆形(0.01 * FS)。f0 = helperpitchtracker(...,'octvesmooth',tf)指定是否应用oplowave平滑。指定为真或假。如果未指定,则tf默认为true。 f0 = HelperPitchTracker(...,'EmissionMatrix',EMISSIONMATRIX) specifies the emission matrix used for the HMM during the forward pass. The default emission matrix was trained on the Pitch Tracking Database from Graz University of Technology. The database consists of 4720 speech segments with corresponding pitch trajectories derived from laryngograph signals. The emission matrix corresponds to the probability that a speaker leaves one pitch state to another, in the range [50, 400] Hz. Specify the emission matrix such that rows correspond to the current state, columns correspond to the possible future state, and the values of the matrix correspond to the probability of moving from the current state to the future state. If you specify your own emission matrix, specify its corresponding EMISSIONMATRIXRANGE. EMISSIONMATRIX must be a real N-by-N matrix of integers. f0 = HelperPitchTracker(...,'EmissionMatrixRange',EMISSIONMATRIXRANGE) specifies how the EMISSIONMATRIX corresponds to Hz. If unspecified, EMISSIONMATRIXRANGE defaults to 50:400. [f0,loc] = HelperPitchTracker(...) returns the locations associated with each pitch decision. The locations correspond to the ceiling of the center of the analysis frames. [f0,loc,hr] = HelperPitchTracker(...) returns the harmonic ratio associated with each pitch decision. See also pitch, voiceActivityDetector

俯仰跟踪系统描述

该图形提供了在示例函数中实现的俯仰跟踪系统的概述。下面的代码演示了HelperPitchTracker示例函数。

1.生成多个Pitch候选

在基音跟踪系统的第一阶段,您使用多个基音检测算法生成多个基音候选。使用基于残差谐波和(SRH)的算法生成主要的基音候选,这些基音候选通常更准确[2]算法和带幅度压缩的基音估计滤波器(PEFAC) [3.]算法。

将带噪输入信号缓冲到重叠帧中,然后使用audio.internal.pitch.SRH为每个跳生成5个pitch候选。同时也要回复每个候选人的相对信心。策划的结果。

范围= [50400];HOPLENGTH =圆(fs。* 0.01);% Buffer转换为所需的大小xBuff_SRH =缓冲区(x,圆(0.025 * fs),圆(0.02 * fs),“nodelay”);定义螺距参数params_srh = struct(“方法”“SRH”...'范围'、范围、...“WindowLength”而圆(fs * 0.06),...“重叠长度”而圆(fs * 0.06 -hoplength),...“SampleRate”,fs,...“NumChannels”,尺寸(x,2),...“SamplesPerChannel”、大小(x, 1));multiCandidate_params_SRH =结构('numcandidates'5,“MinPeakDistance”1);%获得音高估计和信心[f0_srh,conf_srh] = audio.internal.pitch.srh(xbuff_srh,x,...params_SRH,...multiCandidate_params_SRH);
图(3)tiledlayout(2,1) nexttile plot(t0,f0_SRH) ylabel(“F0候选人(Hz)”)标题(“SRH基音估计的多个候选项”) nexttile plot(t0,conf_SRH) ylabel(“相对信心”)xlabel('时间''

使用PEF算法生成一组额外的主要pitch候选者和相关的置信度。使用归一化相关函数(NCF)算法和倒频谱基音确定(CEP)算法生成备份候选项和相关置信度。只记录备份候选数据中最可信的估计。

xbuff_pef =缓冲器(x,圆形(0.06 * fs),圆形(0.05 * fs),“nodelay”); params_PEF=struct(“方法”“PEF”...'范围'、范围、...“WindowLength”而圆(fs * 0.06),...“重叠长度”而圆(fs * 0.06 -hoplength),...“SampleRate”,fs,...“NumChannels”,尺寸(x,2),...“SamplesPerChannel”、大小(x, 1));multiCandidate_params_PEF =结构('numcandidates'5,“MinPeakDistance”5);[f0_pef,conf_pef] = audio.internal.pitch.pef(xbuff_pef,...帕拉莫斯佩夫,...multiCandidate_params_PEF);xBuff_NCF =缓冲区(x,圆(0.04 * fs),圆(0.03 * fs),“nodelay”);xbuff_ncf = xbuff_ncf(:,2:结束-1);params_ncf = struct(“方法”“NCF”...'范围'、范围、...“WindowLength”而圆(fs * 0.04),...“重叠长度”,圆形(fs * 0.04-hoplength),...“SampleRate”,fs,...“NumChannels”,尺寸(x,2),...“SamplesPerChannel”,大小(x,1));multiCandidate_params_NCF=struct('numcandidates'5,“MinPeakDistance”,1);f0_NCF=audio.internal.pitch.NCF(xBuff_NCF,...params_NCF,...multicandidate_params_ncf);xbuff_cep = buffer(x,round(0.04 * fs),圆形(0.03 * fs),“nodelay”);xBuff_CEP=xBuff_CEP(:,2:end-1);参数_CEP=struct(“方法”CEP的...'范围'、范围、...“WindowLength”而圆(fs * 0.04),...“重叠长度”,圆形(fs * 0.04-hoplength),...“SampleRate”,fs,...“NumChannels”,尺寸(x,2),...“SamplesPerChannel”、大小(x, 1));multiCandidate_params_CEP =结构('numcandidates'5,“MinPeakDistance”1);f0_CEP = audio.internal.pitch.CEP (xBuff_CEP,...params_CEP,...multiCandidate_params_CEP);BackupCandidates = [f0_NCF (: 1), f0_CEP (: 1)];

2.确定长期中位数

利用pitch候选人的长期中位数来减少pitch候选人的数量。要计算长期中位数节距,首先要计算谐波比。音高估计仅在和声比高的浊音区域有效。

hr = harmonicRatio (xBuff_PEF fs,...“窗口”,汉明(尺寸(xBuff_NCF,1),“周期”),...“重叠长度”, 0);图(4)tiledlayout(2,1) nexttile plot(t,x) ylabel(“振幅”)NextDile Plot(T0,HR)Ylabel(“谐波比率”)xlabel('时间''

在长期中值计算中,使用谐波比阈值排除不包括发声语音的区域。确定长期中值后,计算pitch候选人的下限和上限。在这个例子中,下界和上界根据经验确定为中位数的2/3和4/3。超出这些范围的候选人将在下一阶段被处罚。

idxToKeep =逻辑(movmedian(人力资源>((3/4)*马克斯(人力资源),3));longTermMedian =值([f0_PEF (idxToKeep 1); f0_SRH (idxToKeep 1)]);低= max ((2/3) * longTermMedian范围(1));上= min ((4/3) * longTermMedian范围(2));图(5)tiledlayout(1,1) nexttile plot(t0,[f0_PEF,f0_SRH]) hold在…上情节(t0, longTermMedian。*的(大小(f0_PEF, 1)),r:'“线宽”3)图(t0,上。*的(大小(f0_PEF, 1)),“r”“线宽”,2)绘图(T0,较低。*(大小(f0_pef,1)),“r”“线宽”, 2)离开包含('时间'')伊拉贝尔(的频率(赫兹))标题(长期平均的

3.减少候选人人数

默认情况下,基音检测算法返回的候选者按照置信度降序排序。降低任何初选候选人在上下限之外的信心。将信心降低10倍。对PEF和SRH算法的候选者重新排序,使它们按照置信度降序排列。连接候选对象,只保留每个算法中最可靠的两个候选对象。

绘制减少的候选。

无效=f0_-PEF>lower | f0_-PEF>upper;conf_-PEF(无效)=conf_-PEF(无效)/10;[conf_-PEF,order]=sort(conf_-PEF,2,“下”);i = 1:尺寸(f0_PEF, 1) f0_PEF(我:)= f0_PEF(我订单(我,:));结束无效= f0_SRH>lower | f0_SRH>upper;conf_SRH(无效)= conf_SRH(无效)/ 10;[conf_SRH,顺序]=排序(conf_SRH 2“下”);i = 1:尺寸(f0_SRH, 1) f0_SRH(我:)= f0_SRH(我订单(我,:));结束候选人= [f0_PEF (:, 1:2), f0_SRH (: 1:2)];信心= [conf_PEF (:, 1:2), conf_SRH (: 1:2)];图(6)情节(t0,候选人)包含('时间'')伊拉贝尔(的频率(赫兹))标题(“减少候选人”

4.让独特的

如果两个或两个以上的候选者在给定的5 Hz范围内,将候选者设置为其平均值并求和其置信度。

跨度= 5;confidenceFactor = 1;r=1:大小(候选,1)c=1:size(候选者,2)tf=abs(候选者(r,c)-候选者(r,:)结束结束候选对象=最大值(最小值(候选对象,400),50);

5.带八度平滑的HMM前向迭代

既然候选对象已减少,您可以将它们输入HMM以强制实施连续性约束。当以10毫秒跳数进行分析时,语音信号的基音轮廓通常是连续的。基音在一段时间内从一种状态移动到另一种状态的概率称为发射概率.发射概率可以封装到一个矩阵中,描述从一个集合范围内的任何音调值到另一个集合范围内的任何音调值的概率。本例中使用的发射矩阵是使用Graz数据库创建的。[1]

加载发射矩阵和相关的范围。绘制150赫兹状态下pitch的概率密度函数(PDF)。

负载发射矩阵emissionMatrixemissionMatrixRange现状后=150;图(7)plot(emissionMatrixRange(1):emissionMatrixRange(2),emissionMatrix(currentState - emissionMatrixRange(1)-1,:)) title(sprintf(“%d Hz的发射PDF”现状后))包含(“下一个音调值(Hz)”)伊拉贝尔(“概率”

本例中使用的隐马尔可夫模型结合了增强连续性的发射概率和基音的相对置信度。在每一跳,发射概率与相对置信度相结合,创建一个置信度矩阵。每个路径的最佳选择是确定的最大置信矩阵。本例中使用的HMM还假设只能将一条路径分配给给定的状态(这是Viterbi算法的假设)。

除了HMM之外,本例还监控相对于基音路径短期中值的倍频程跳变。如果检测到倍频程跳变,则添加备用基音候选作为HMM的选项。

%预先配置numPaths = 4;numHops =大小(候选人,1);日志= 0 (numHops 3 numPaths);suspectHops = 0 (numHops, 1);%带倍频程平滑的正向迭代hopNumber = 1:numHops nowCandidates =候选人(hopNumber,:);nowConfidence =信心(hopNumber:);%删除八度跳频如果HOPNUMBER> 100 NUMCANDIDATES = NUM​​ER(现为加工);加权短期中位数medianWindowLength = 50;aTemp =日志(max (hopNumber-min hopNumber medianWindowLength) (1): hopNumber-1, 1:);shortTermMedian =值(aTemp (:));previousM =意味着([longTermMedian shortTermMedian]);lowerTight = max ((4/3) * previousM emissionMatrixRange (1));upperTight = min ((2/3) * previousM emissionMatrixRange (2));numCandidateOutside = sum([nowCandidates < lowerTight, nowCandidates > upperTight]);%如果至少有一个候选者在以音高为中心的八度音阶之外%短期中值,添加候补的提案候选人%由归一化相关函数和倒谱生成%基音确定算法作为潜在的候选。如果numcandidatideouts> 0.%应用备份音高估计器nowCandidates = [nowCandidates BackupCandidates (hopNumber:)];%#OK nowConfidence = [nowConfidence repmat(意味着(nowConfidence), 1, 2)];%#OK %使独特的跨度= 10;confidenceFactor = 1.2;r = 1:尺寸(nowCandidates, 1)c = 1:size(nowCandidates,2) tf = abs(nowCandidates(r,c)-nowCandidates(r,)) < span;nowCandidates (r、c) =意味着(nowCandidates (r, tf));nowConfidence (r、c) =总和(nowConfidence (r, tf)) * confidenceFactor;结束结束结束结束%创建置信矩阵confidenceMatrix = 0(元素个数(nowCandidates),大小(日志,3));pageIdx = 1:尺寸(日志,3)如果hopNumber ~= 1 pastPitch = floor(logbook(hopNumber-1,1,pageIdx)) - emissionMatrixRange(1) + 1;其他的pastPitch =南;结束candidateNumber = 1:元素个数(nowCandidates)如果hopNumber ~ = 1%获取当前的音高并转换为范围内的索引currentPitch = floor(nowCandidates(candidateNumber)) - emissionMatrixRange(1) + 1;confidenceMatrix (candidateNumber pageIdx) =...排放矩阵(当前间距、过去间距)*日志(hopNumber-1,2,pageIdx)*当前置信度(候选编号);其他的confidenceMatrix (candidateNumber pageIdx) = 1;结束结束结束为每个路径分配一个估计值pageIdx = 1:尺寸(日志,3)%确定从过去到当前音高的最自信过渡[~, idx] = max (confidenceMatrix (:));%转换置信矩阵指数到pitch和日志页[chosenPitch, pastPitchIdx] = ind2sub([元素个数(nowCandidates),大小(日志,3)],idx);日志(hopNumber: pageIdx) =...[nowCandidates (chosenPitch),...confidenceMatrix (chosenPitch pastPitchIdx),...[IDX];从置信矩阵中去除选定的电流节距confidenceMatrix (chosenPitch:) =南;结束%正常化的信心日志(hopNumber 2:) =日志(hopNumber 2:) /笔(日志(hopNumber 2:));结束

6.回溯的嗯

当隐马尔可夫模型的前向迭代完成后,最终的基音轮廓被选为最自信的路径。通过日志往回走,确定HMM输出的基音轮廓。计算GPE并绘制新的基音轮廓和已知的基音轮廓。

numHops =大小(日志,1);keepLooking = true;index = numHops + 1;虽然keepLooking index=index-1;如果abs(max(logbook(index,2,:)-min(logbook(index,2,:)))~=0 keepLooking=false;结束结束[〜,bestpathidx] = max(日志(索引,2,:));bestindices = zeros(numhops,1);BestInce(索引)= BESTPATHIDX;ii = index:-1:2 bestIndices(ii-1) = logbook(ii,3,bestIndices(ii));结束bestIndices (bestIndices = = 0) = 1;f0 = 0 (numHops, 1);ii = (numHops):-1:2 f0(ii) = logbook(ii,1,bestIndices(ii));结束f0toPlot = f0;f0toPlot (~ isVoiced) =南;GPE = mean(abs(f0toPlot(is浊)- truePitch(is浊))> truePitch(is浊).*p).*100;图(8)情节(t0, [truePitch f0toPlot])传说(“参考”“估计”)伊拉贝尔(‘F0(赫兹)’)xlabel('时间'')头衔(斯普林特)(“GPE = % 0.1 f % %”, GPE))

7.移动中值滤波器

作为最后的后处理步骤,应用一个窗口长度为三跳的移动中值滤波器。计算最终的GPE并绘制最终的基音轮廓和已知轮廓。

F0 = MOVMEDIAN(F0,3);F0(〜Isvoiced)= NaN;GPE =平均值(ABS(F0(ASVOICED) - 特拉奇(ASVOICED))> TRUEPITCH(ISVOICED)。* P)。* 100;图(9)图(T0,[TruePitch,F0])图例(“参考”“估计”)伊拉贝尔(‘F0(赫兹)’)xlabel('时间'')头衔(斯普林特)(“GPE = % 0.1 f % %”, GPE))

绩效评估

HelperPitchTracker函数使用HMM对音高轮廓应用连续性约束。HMM的发射矩阵可以直接设置。最好在声源上训练发射矩阵,使其与你想要追踪的声源相似。

本例使用Graz University of Technology的Pitch Tracking数据库(PTDB-TUG)[4].数据集由20名英语母语者组成,阅读2342来自Timit Corpus的语音富裕的句子。下载并提取数据集。根据您的系统,下载和提取数据集可能需要大约1.5小时。

url ='https://www2.spsc.tugraz.at/databases/PTDB-TUG/SPEECH_DATA_ZIPPED.zip';downloadFolder = tempdir;datasetFolder = fullfile (downloadFolder,“PTDB-TUG”);如果~exist(datasetFolder,“dir”)disp(“正在下载PTDB-TUG (3.9 G)……”解压缩(url, datasetFolder)结束

创建一个音频数据存储,指向数据库中的麦克风录音。将每个文件关联的标签设置为关联的已知音高文件的位置。数据集包含10位女性和10位男性演讲者的录音。使用子集隔离第10个女性和男性扬声器。根据男性和女性扬声器1到9的参考音高轮廓训练发射矩阵。

广告= audioDatastore ([fullfile (datasetFolder“语音数据”“女性”“麦克风”), fullfile (datasetFolder,“语音数据”“男性”“麦克风”),...“包含子文件夹”符合事实的...“FileExtensions”'.wav');wavFileName=ads.Files;ads.Labels=replace(wavFileName{“麦克”'麦克风''wav'},{“REF”“ref”“f0”});idxToRemove =包含(广告。文件,{F10的'M10'});ads1 =子集(广告,idxToRemove);ads9 =子集(广告,~ idxToRemove);

播放音频数据存储。

ads1=随机播放(ads1);ads9=随机播放(ads9);

发射矩阵描述了从一个基音态到另一个基音态的概率。在接下来的步骤中,您将为男性和女性创建一个基于扬声器1到9的发射矩阵。数据库将参考音高值、短期能量和其他信息存储在带有文件扩展名的文本文件中f0.的getReferencePitch函数在短期能量高于阈值时读取音调值。阈值是在听力测试中根据经验确定的。的HelperUpdateEmissionMatrix基于当前音调状态和下一个音调状态创建一个二维直方图。在创建了直方图之后,将其归一化以创建一个发射矩阵。

emissionMatrixRange = [50400];emissionMatrix = [];i = 1:numel(ads9.Files) x = getReferencePitch(ads9.Labels{i});emissionMatrix = HelperUpdateEmissionMatrix (x, emissionMatrixRange emissionMatrix);结束EmissionMatrix = EmissionMatrix + SQRT(EPS);EmissionMatrix = EmissionMatrix./norm(emisiveMatrix);

定义不同类型的背景噪音:白色、环境、引擎、喷气机和街道。重新取样到16千赫,以帮助加快测试数据库。

定义测试的信噪比,以dB为单位,为10、5、0、-5和-10。

noiseType = {“白色”“氛围”“引擎”“喷气机”'街道'};numNoiseToTest =元素个数(noiseType);desiredFs = 16 e3;whiteNoiseMaker = dsp。ColoredNoise (“颜色”“白色”“SamplesPerFrame”, 40000,“RandomStream”“带种子的mt19937ar”“BoundedOutput”,对);噪声{1}=whiteNoiseMaker();[ambiance,ambianceFs]=音频阅读(“Ambiance-16-44p1-mono-12secs.wav”);噪音{2}=重新取样(氛围、desiredFs ambianceFs);(引擎,engineFs) = audioread (“Engine-16-44p1-stereo-20sec.wav”);噪声{3} =重组(发动机,所需的流量,发动机);[Jet,Jetfs] = audioread(“JetAirplane-16-11p025-mono-16secs.wav”);噪音{4}=重新取样(飞机,desiredFs jetFs);[街,streetFs] = audioread ('Maintreetone-16-16-Mono-12secs.wav');噪音{5}=重新采样(街道、理想区、街道区);snrToTest=[10,5,0,-5,-10];numSNRtoTest=numel(snrToTest);

为每个文件运行每个信噪比和噪声类型的基音检测算法。计算跨语音文件的平均GPE。这个例子比较了流行的基音跟踪算法:锯齿波形启发基音估计器(SWIPE)的性能。该算法的MATLAB®实现可在[5]。若要运行此示例而不与其他算法进行比较,请设置比较.下面的对比大约需要15分钟。

比较=符合事实的;numFilesToTest = 20;p = 0.1;GPE_pitchTracker = 0 (numSNRtoTest numNoiseToTest numFilesToTest);如果比较GPE_swipe = GPE_pitchTracker;结束i = 1:numFiLestotest [CleanSpeech,Info] =读取(ADS1);CleanSpeech =重组(Cleanspeech,LeverDFS,Info.Samplerate);truepitch = getReferencepitch(Info.Label {:});Isvoiced = Truepitch〜= 0;TruepitchinvoiceRegions = Truepitch(发声);j=1:numSNRtoTestk = 1:numnoisetotest noisyspeech = mixsnr(Cleanspeech,噪声{k},snrtotest(j));F0 = HelperPitchTracker(Noisyspeech,LausencdFS,“发射矩阵”emissionMatrix,“发射矩阵范围”,emissisedmatrixrange);f0 = [0; f0];%手动与数据库对齐。GPE_pitchTracker(j,k,i) = mean(abs(f0(is浊)- truePitchInVoicedRegions) > truePitchInVoicedRegions.*p).*100;如果compare f0 = swipep(noisySpeech,desiredFs,[50,400],0.01);f0 = f0(3:结束);%手动与数据库对齐。GPE_swipe(j,k,i) = mean(abs(f0(is浊)- truePitchInVoicedRegions) > truePitchInVoicedRegions.*p).*100;结束结束结束结束gpe_pitchtracker =均值(gpe_pitchtracker,3);如果比较GPE_滑动=平均值(GPE_滑动,3);结束

绘制每种噪声类型的总音高误差。

ii=1:numel(噪声)图(9+ii)图(snrToTest,GPE_俯仰跟踪器(:,ii),“b”)持有在…上如果比较图(snrToTest GPE_swipe(:,(二),‘g’结束情节(snrToTest GPE_pitchTracker(:,(二),“波”如果比较图(snrToTest GPE_swipe(:,(二),“全球之声”结束标题(noiseType (ii))包含(“信噪比(dB)”)伊拉贝尔(斯普林特)(总音高误差(p = %0.2f)(p)如果比较图例(“HelperPitchTracker”“刷”其他的传奇(“HelperPitchTracker”结束网格在…上持有离开结束

结论

您可以使用HelperPitchTracker作为评估您的pitch跟踪系统的GPE性能的基线,或者将此示例应用于您的应用程序。

参考文献

[1] G. Pirker, M. Wohlmayr, S. Petrik, and F. Pernkopf,“基于多基音跟踪场景评价的基音跟踪语料库”,Interspeech,第1509-1512页,2011。

[2]药物,托马斯和Abeer Alwan。“基于残余谐波的联合强大的发型检测和音高估计。”国际言论交流协会年度会议的诉讼程序,三个人。2011年,PP。1973-1976。

[3]冈萨雷斯,塞拉和迈克布鲁克斯。“一种抗高噪声的基音估计滤波器(PEFAC)”。第十九届欧洲信号处理会议。巴塞罗那,2011年,第451-455页。

信号处理与语音通信实验室。2018年9月26日生效。https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html

[5]“Arturo卡马乔。”2018年9月26日生效。https://www.cise.ufl.edu/ acamacho /英语/。

“Fxpefac”[6]。Fxpefac的描述。2018年9月26日生效。http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html。