主要内容

球场

估计音频信号的基频

描述

例子

f0=节(audioInfs返回音频输入的基频随时间变化的估计值,audioIn,抽样率fs.输入的列被视为单独的通道。

例子

f0=节(audioInfs名称,值使用一个或多个指定选项名称,值对参数。

例子

f0疯狂的) =节(___返回的位置,疯狂的与基频估计有关。

例子

全部折叠

读入音频信号。调用球场来估计基频随时间的变化。

[audioIn, fs] = audioread (“Hey.ogg”);f0 =音高(audioIn, fs);

听音频信号,画出信号和音高。的球场函数返回基频随时间变化的估计值,但估计值仅对谐波区域有效。

sound(audioIn,fs) tiledlayout(2,1) nexttile plot(audioIn) xlabel(的样本数量) ylabel ('振幅') nexttile plot(f0) xlabel(“帧号”) ylabel (“音高(Hz)”

图中包含2个轴对象。轴加工对象物1包含类型线的对象。轴对象2包含型线的对象。

读入音频信号并提取音调。

[x, fs] = audioread (“singing-a-major.ogg”);T =(0:尺寸(X,1)-1)/ FS;winLength = ROUND(0.05 * FS);overlapLength =圆(0.045 * FS);[F0,IDX] =间距(X,FS,“方法”“SRH”“窗口长度”winLength,“OverlapLength”, overlapLength);tf0 = idx / fs;

听音频并绘制音频和音高估计图。

Sound (x,fs) figure tiledlayout(2,1) nexttile plot(t,x) ylabel('振幅') 标题(音频信号的)轴紧的nexttile图(TF0,F0)xlabel(“时间(s)”) ylabel (“音高(Hz)”) 标题(“音高估计”)轴紧的

图中包含2个轴对象。标题为“音频信号”的轴对象1包含一个类型为line的对象。轴对象2与标题Pitch估计包含一个类型线对象。

球场函数估计重叠分析窗口的音调。只有当分析窗口有谐波分量时,基音估计才有效。调用harmonicRatio函数使用相同的窗口和重叠长度用于基音检测。绘制音频、音高和谐波比率。

hr = harmonicRatio (x, fs,“窗口”,汉明(winLength,“周期”),“OverlapLength”, overlapLength);图tiledlayout(3,1) nexttile plot(t,x) ylabel('振幅') 标题(音频信号的)轴紧的nexttile情节(tf0 f0) ylabel (“音高(Hz)”) 标题(“音高估计”)轴紧的nexttile情节(tf0、人力资源)包含(“时间(s)”) ylabel (“比”) 标题(“谐波比率”)轴紧的

图包含3个对象。标题为“音频信号”的轴对象1包含一个类型为line的对象。轴对象2与标题Pitch估计包含一个类型线对象。轴对象3与标题谐波比包含型线的对象。

使用谐波比作为有效的音调决定的阈值。如果谐波比小于阈值,则将音调判定设置为.策划的结果。

阈值= 0.9;F0 (hr < threshold) = nan;图绘制(tf0 f0)包含(“时间(s)”) ylabel (“音高(Hz)”) 标题(“音高估计”网格)

图中包含一个轴对象。具有标题间距估计的轴对象包含一个类型线对象。

在音频信号中输入一个女性的声音,说“音量调大”五次。听录音。

[femaleVoice, fs] = audioread (“female-volume-up.ogg”);声音(femaleVoice fs)

读一个男性的声音信号,说“音量提高”五次。听录音。

maleVoice = audioread (“male-volume-up.ogg”);声音(maleVoice fs)

从提取的女性和男性都记录在球场。绘制男性和女性音频记录的音调估计直方图。直方图具有相似的形状。这是因为在球场的决定包含了清音和沉默地区的结果。

f0Female =音高(femaleVoice, fs);f0Male =音高(maleVoice, fs);figure numBins = 20;直方图(f0Female numBins,“归一化”“可能性”);持有直方图(f0Male numBins,“归一化”“可能性”);传奇(“女声”的男性声音)包含(“音高(Hz)”) ylabel ('可能性')举行

图中包含一个轴对象。坐标轴对象包含两个直方图类型的对象。这些物品代表了女性的声音,男性的声音。

使用detectSpeech函数用于分离音频信号中的语音区域,然后仅从这些语音区域中提取基音。

speechIndices = detectSpeech (femaleVoice, fs);f0Female = [];ii = 1:size(speech hindices,1) speechSegment = femalvoice (f0Female = [f0Female;沥青(speechSegment fs)];结束speechIndices = detectSpeech (maleVoice, fs);f0Male = [];= 1:size(speech hindices,1) speechSegment = malvoice (speech hindices (ii,1):speech hindices (ii,2));f0Male = [f0Male;沥青(speechSegment fs)];结束

绘制男性和女性音频记录的音调估计直方图。音高分布现在如预期的那样出现。

图直方图(f0Female numBins,“归一化”“可能性”);持有直方图(f0Male numBins,“归一化”“可能性”);传奇(“女声”的男性声音)包含(“音高(Hz)”) ylabel ('可能性'

图中包含一个轴对象。坐标轴对象包含两个直方图类型的对象。这些物品代表了女性的声音,男性的声音。

加载Für Elise介绍的音频文件和音频的采样率。

负载FurElise.mat首歌fs声音(歌曲,fs)

调用球场函数,使用基音估计滤波器(PEF),搜索范围为50 ~ 800hz,窗口持续时间为80ms,重叠持续时间为70ms,中值滤波长度为10。策划的结果。

方法=“PEF”;范围= [50800];%赫兹winDur =0.08%秒overlapDur =0.07%秒medFiltLength =10%的框架winLength =圆(winDur * fs);overlapLength =圆(overlapDur * fs);(f0、loc) =音高(宋、fs、“方法”、方法、“范围”、范围、“窗口长度”winLength,“OverlapLength”overlapLength,“MedianFilterLength”, medFiltLength);t = loc / fs;情节(t, f0) ylabel (“音高(Hz)”)包含(“时间(s)”网格)

图中包含一个轴对象。axis对象包含一个类型为line的对象。

创建一个dsp。AudioFileReader对象以逐帧读取音频。

fileReader = dsp。AudioFileReader (“singing-a-major.ogg”);

创建一个voiceActivityDetector对象,以检测流音频中是否存在声音。

VAD = voiceActivityDetector;

虽然有未读的样品,从文件中读取,并确定该帧包含话音活动的概率。如果帧包含语音活动,请致电球场估计音频帧的基频。如果帧不包含声音活动,则声明基频为

f0 = [];~isDone(fileReader) x = fileReader();如果VAD(x) > 0.99 decision = pitch(x,fileReader. x)SampleRate,“WindowLength”、大小(x, 1),“OverlapLength”0,“范围”[200340]);其他的决定=南;结束f0 = (f0;决定);结束

绘制检测到的基音随时间变化的轮廓。

T = linspace(0,(长度(F0)* fileReader.SamplesPerFrame)/fileReader.SampleRate,length(F0));情节(t, f0) ylabel (“基本频率(赫兹)”)包含(“时间(s)”网格)

图中包含一个轴对象。axis对象包含一个类型为line的对象。

估计基音的不同方法在噪声稳健性、精度、最优延迟和计算费用方面进行权衡。在本例中,您根据总基音误差(GPE)和不同噪声条件下的计算时间来比较不同基音检测算法的性能。

准备测试信号

加载一个音频文件并确定它的样本数量。同时加载与音频文件相对应的真音高。真实音高是由几个第三方算法在干净的语音文件上的平均值确定的。

[audioIn, fs] = audioread (“Counting-16-44p1-mono-15secs.wav”);numSamples =大小(audioIn, 1);负载TruePitch.mattruePitch

通过在给定的信噪比下给音频信号添加噪声来创建测试信号。的mixSNR函数是本示例的一个方便函数,它获取一个信号、噪声和请求的信噪比,并在请求信噪比时返回一个噪声信号。

testSignals = 0 (numSamples 4);涡轮= audioread (“Turbine-16-44p1-mono-22secs.wav”);testSignals (: 1) = mixSNR (audioIn涡轮20);testSignals (:, 2) = mixSNR (audioIn涡轮0);whiteNoiseMaker = dsp。ColoredNoise ('颜色'“白色”“SamplesPerFrame”大小(audioIn 1));testSignals (:, 3) = mixSNR (audioIn, whiteNoiseMaker (), 20);testSignals (:, 4) = mixSNR (audioIn, whiteNoiseMaker (), 0);

将噪声条件和算法名称保存为单元格数组,以便进行标记和索引。

noiseConditions = {'汽轮机(20 dB)的'“涡轮机(0分贝)”“WhiteNoise (20 dB)”“WhiteNoise (0 dB) '};算法= {'NCF''PEF'CEP的“韩”“SRH”};

运行基音检测算法

预分配数组以保存每个算法和噪声条件对的基音决定,以及时间信息。在循环中,调用球场关于算法和噪声条件的每种组合功能。每种算法都具有与其相关联的最佳窗口长度。在这个例子中,为简单起见,你可以使用所有算法默认的窗口长度。使用3元中值滤波平滑间距决定。

f0 = 0(元素个数(truePitch),元素个数(算法),元素个数(noiseConditions));algorithmTimer = 0(元素个数(noiseConditions),元素个数(算法));k = 1:numel(noiseconconditions) x = testSignals(:,k);I = 1:numel(algorithms) tic f0temp = pitch(x,fs,)“范围”(300),“方法”、算法{},'MedianFilterLength'3);algorithmTimer (k, i) = toc;f0(1:马克斯(元素个数(f0temp),元素个数(truePitch)),我,k) = f0temp;结束结束

比较粗节距误差

比较音调检测算法时总节距误差(GPE)是一种流行的度量。GPE被定义为间距决定的比例的量,相对误差小于给定阈值,传统上20%的语音研究更高。计算GPE并将其打印到命令窗口。

idxToCompare = ~ isnan (truePitch);truePitch = truePitch (idxToCompare);f0 = f0 (idxToCompare,:,);p = 0.20;GPE = mean(abs(f0(1:numel(truePitch),:,:) - truePitch) > truePitch.*p).*100;ik = 1:numel(噪声条件)fprintf('\ NGPE(p值=%0.2F),噪声=%S。\ N'p noiseConditions{本土知识});i = 1:size(GPE,2) fprintf('- %s: %0.1f %%\n'、算法{},GPE(1我ik))结束结束
GPE (p = 0.20),噪声=涡轮(20 dB)。
—NCF: 0.9%—pef: 0.4%—cep: 8.2%—LHS: 8.2%—SRH: 6.0%
GPE (p = 0.20),噪声=涡轮(0 dB)。
- NCF: 5.6% - pef: 24.5% - cep: 11.6% - LHS: 9.4% - SRH: 46.8%
GPE (p = 0.20), Noise = WhiteNoise (20 dB)。
-  NCF:0.9% -  PEF:0.0% -  CEP:12.9% -  LHS:6.9% -  SRH:2.6%
GPE (p = 0.20), Noise = WhiteNoise (0 dB)。
-  NCF:0.4% -  PEF:0.0% -  CEP:23.6% -  LHS:7.3% -  SRH:1.7%

计算每一种算法处理一秒数据所需的平均时间,并打印结果。

= (algorithmTimer)。/ ((numSamples / fs) *元素个数(noiseConditions));Ik = 1:numel(algorithms) fprintf('- %s: %0.3f (s)\n'本土知识、算法{},(ik))结束
- NCF: 0.035 (s) - PEF: 0.112 (s) - CEP: 0.037 (s) - LHS: 0.049 (s) - SRH: 0.095 (s)

输入参数

全部折叠

音频输入信号,指定为向量或矩阵。矩阵的列被视为单独的音频通道。

数据类型:|

输入信号的采样率(Hz),指定为一个正标量。

采样率必须大于或等于两倍上限的搜索范围的。使用指定搜索范围范围名称-值对。

数据类型:|

名称-值参数

指定可选的逗号分隔的对名称,值参数。的名字参数名和价值为对应值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数name1,value1,...,namen,valuen

例子:音高(audioIn fs,“范围”,[50150],“方法”,“PEF”)

搜索范围为基音估计,指定为逗号分隔的一对组成“范围”,并用增加的正整数值的两元件行向量。由向量所指定的上和下频带边缘内的基本频率的最佳估算值的函数搜索,根据指定的算法方法.范围包括,单位为Hz。

搜索范围的有效值取决于抽样率,fs的价值观WindowLength方法

方法 最小范围 最大航程
NCF fs/WindowLength<范围(1) 范围(2)<fs/2
PEF 10 <范围(1) 范围(2)< min (4000fs/ 2)
CEP fs/ (2 ^ nextpow2 (2 *WindowLength-1))<范围(1) 范围(2)<fs/2
1 <范围(1) 范围(2)<fs/ 5 - 1
SRH 1 <范围(1) 范围(2)<fs/ 5 - 1

数据类型:|

在分析窗口中的样本数,指定为逗号分隔的一对组成的“WindowLength'和范围为[1,min(size(audioIn1), 192000)]。典型的分析窗口在20-100毫秒之间。默认窗口长度是52毫秒。

数据类型:|

相邻分析窗口之间重叠的样本数量,指定为逗号分隔对,由'OverlapLength'和在范围内的整数(WindowLength).负重叠长度表示非重叠分析窗口。

数据类型:|

用于估计音高的方法,指定为逗号分隔对,由'方法”,'NCF''PEF'CEP的“韩”,或“SRH”.计算基音的不同方法在噪声稳健性、准确性和计算费用方面进行了权衡。计算基音的算法基于以下论文:

  • 'NCF'——归一化相关函数[1]

  • 'PEF'- 基音周期估计过滤器[2].该函数没有使用本文描述的振幅压缩。

  • CEP的- 倒谱测定沥青[3]

  • “韩”——Log-Harmonic求和[4]

  • “SRH”- 剩余谐波的总和[5]

数据类型:烧焦|字符串

中值滤波器长度,用于随着时间的推移平滑基音估计,指定为逗号分隔对,由“MedianFilterLength和一个正整数。默认的,1,对应于无中值滤波。中值滤波是一种在估计基音时去除离群值的后处理技术。这个函数使用movmedian在使用指定的音高估计后方法

数据类型:|

输出参数

全部折叠

估计的基频,以Hz为单位,以标量、向量或矩阵返回。属性的值决定返回的行数WindowLengthOverlapLength名称 - 值对,以及对输入信号的大小。(信道)返回的列数依赖于输入信号的大小的列数。

数据类型:|

与基频估计相关联的位置,返回为大小相同的标量、矢量或矩阵f0

基频估计的局部范围是WindowLength样本。的值疯狂的对应于用于估计基本频率在最近一次采样(最大样本数)。

数据类型:|

算法

球场功能段音频输入根据WindowLengthOverlapLength参数。估计每帧的基频。位置输出,疯狂的包含对应框架的最新样本(最大样本数)。

对于估计基频所用算法的描述,请参阅相应的参考文献:

  • 'NCF'——归一化相关函数[1]

  • 'PEF'- 基音周期估计过滤器[2].该函数没有使用本文描述的振幅压缩。

  • CEP的- 倒谱测定沥青[3]

  • “韩”——Log-Harmonic求和[4]

  • “SRH”- 剩余谐波的总和[5]

参考

[1]阿塔尔,狗屁“基于音高轮廓的说话人自动识别”。美国声学学会杂志.第52卷,第6B号,1972年,1687-1697页。

[2]冈萨雷斯,西拉,和麦克布鲁克斯。“A节距估计滤波器健壮高水平噪声的(PEFAC)”。19欧洲信号处理会议。巴塞罗那,2011年,第451-455。

[3]诺尔,迈克尔A。“倒频谱的决心。”美国声学学会杂志.卷。31,第2号,1967年,第293-309。

[4] Hermes, Dik J。用次谐波和法测量音高。美国声学学会杂志.第83卷,第1期,1988年,257-264页。

药剂师托马斯和比尔·阿尔万。基于残差谐波的联合鲁棒语音检测与基音估计。国际言语传播协会年会论文集。2011年,页1973 - 1976。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。

介绍了R2018a