主要内容

沥青

估计音频信号的基本频率

描述

例子

F0.=音高(奥地策FS.返回对音频输入随时间的基本频率的估计,奥地策,采样率FS.。输入的列被视为单独的通道。

例子

F0.=音高(奥地策FS.名称,价值使用一个或多个指定选项名称,价值对论点。

例子

[F0.座垫] =音高(___返回位置,座垫,与基本频率估计有关。

例子

全部收缩

读取音频信号。称呼沥青估计随着时间的推移基本频率。

[AudioIn,FS] = audioread('hey.ogg');F0 =音高(AudioIn,FS);

收听音频信号并绘制信号和间距。这沥青函数随着时间的推移返回基本频率的估计,但估计仅对谐波的区域有效。

声音(AudioIn,FS)TileDlayout(2,1)NextDile Plot(AudioIn)XLabel('样品号码')ylabel('振幅')NextDile Plot(F0)XLabel('框号')ylabel('音高(Hz)'

在音频信号中读取并提取音调。

[x,fs] = audioread('唱歌-A-MASS.OGG');t =(0:size(x,1)-1)/ fs;winlength = round(0.05 * fs);overtaplength = round(0.045 * fs);[F0,IDX] =音调(x,fs,'方法''srh''windowlength',winlength,'overlaplencth',俯视长度);TF0 = IDX / FS;

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

sound(x,fs)图tiledlayout(2,1)nextdile plot(t,x)ylabel('振幅') 标题('音频信号')轴紧的nextdile绘图(TF0,F0)XLabel('时间'')ylabel('音高(Hz)') 标题('音高估计')轴紧的

沥青功能估计重叠分析窗口的音高。音高估计只有在分析窗口具有谐波分量时才有效。打电话给Halmonicratio.使用相同的窗口和用于音调检测的重叠长度的功能。绘制音频,俯仰和谐波比。

hr = houronicratio(x,fs,“窗户”,汉明(WinLength,'定期'),“overlaplength”,俯视长度);图TileDlayout(3,1)NextTile Plot(T,X)Ylabel('振幅') 标题('音频信号')轴紧的nextdile plot(tf0,f0)ylabel('音高(Hz)') 标题('音高估计')轴紧的nextdile plot(tf0,hr)xlabel('时间'')ylabel('比率') 标题('谐波比')轴紧的

使用谐波比作为有效音高决策的阈值。如果谐波比小于阈值,请将音高决定设置为。绘制结果。

阈值= 0.9;F0(HR <阈值)= NaN;图绘图(TF0,F0)XLabel('时间'')ylabel('音高(Hz)') 标题('音高估计') 网格

读取母语的音频信号,说“音量上升”五次。听听音频。

[FemaleVoice,FS] = audioread('女卷 -  up.ogg');声音(FemaleVoice,FS)

读取男声的音频信号,说“音量上升”五次。听听音频。

malevoice = audioread('male-chovel-up.ogg');声音(Malevoice,FS)

从女性和雄性记录中提取音高。绘制男性和女性录音的音高估计的直方图。直方图具有类似的形状。这是因为音调决定包含不可加区语音和沉默地区的结果。

f0female =音高(Femalevoice,FS);f0male =音高(Malevoice,FS);图numbins = 20;直方图(F0Female,Numbins,“正常化”“可能性”);抓住直方图(F0MALE,NUMBINS,“正常化”“可能性”);传奇(“女性声音”'男声')xlabel('音高(Hz)')ylabel('可能性') 抓住离开

使用检测在音频信号中隔离语音区域的功能,然后仅从那些语音区域提取音调。

语音indices =检测echech(Femalevoice,FS);f0female = [];为了II = 1:尺寸(语音indices,1)Speepsegment = Femalevoice(语音indices(ii,1):语言indices(ii,2));f0female = [f0female;沥青(Speepsegment,FS)];结尾语音indices =检测echech(malevoice,fs);f0male = [];为了II = 1:尺寸(语音indices,1)Speepsegment = malevoice(语音indices(ii,1):言语indices(ii,2));f0male = [f0male;沥青(speepsegment,fs)];结尾

绘制男性和女性录音的音高估计的直方图。现在的俯仰分布如预期显示。

图直方图(F0Female,Numbins,“正常化”“可能性”);抓住直方图(F0MALE,NUMBINS,“正常化”“可能性”);传奇(“女性声音”'男声')xlabel('音高(Hz)')ylabel('可能性'

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

加载Furelise.mat歌曲FS.声音(歌曲,FS)

打电话给沥青使用音高估计过滤器的功能(PEF.),搜索范围为50至800 Hz,窗口持续时间为80毫秒,重叠持续时间为70毫秒,中值滤波器长度为10.绘制结果。

方法=“PEF”;范围= [50.800];%赫兹Windur =0.08;%秒重叠地图=0.07;%秒medfiltlength =.10.;%框架winlength = round(windur * fs);overtaplength = round(重叠像* fs);[F0,LOC] =音高(歌曲,FS,......'方法',方法,......'范围',范围,......'windowlength',winlength,......'overlaplencth',overtaplength,......“MedianFilterLength”,medfiltlength);t = loc / fs;绘图(T,F0)Ylabel('音高(Hz)')xlabel('时间'') 网格

创建一个dsp.audiofilereader.对象以逐帧读取。

filereader = dsp.audiofilereader('唱歌-A-MASS.OGG');

创建一个盲肠助立力指示灯对象以检测流音频中的语音存在。

VAD = VOCEACTICYDETECTORECTOR;

虽然存在未读样本,请从文件中读取并确定帧包含语音活动的概率。如果框架包含语音活动,请致电沥青估计音频帧的基本频率。如果帧不包含语音活动,请将基本频率声明为

f0 = [];尽管〜ISDONE(FILEREADER)x = filereader();如果VAD(x)> 0.99决定=音高(x,filereader.samplerate,......“windowlength”,尺寸(x,1),......“overlaplength”,0,......“范围”,[200,340]);别的决定=南;结尾F0 = [F0;决定];结尾

绘制检测到的间距轮廓随时间。

t = linspace(0,(长度(f0)* filereader.samplesperframe)/filereader.samplerve,length(f0));绘图(T,F0)Ylabel('基础频率(Hz)')xlabel('时间'') 网格

估计音高的不同方法在噪声鲁棒性,准确性,最佳滞后和计算费用方面提供权衡。在此示例中,在不同噪声条件下,将不同间距检测算法(GPE)和计算时间的性能进行比较。

准备测试信号

加载音频文件并确定它具有的样本数。还加载对应于音频文件的真菌。真正的音高被确定为清洁语音文件上几个第三方算法的平均值。

[AudioIn,FS] = audioread('Counting-16-44p1-mono-15secs.wav');numsamples = size(audioin,1);加载truepitch.mat特鲁奇奇

通过在给定SNR的音频信号添加噪声来创建测试信号。这mixsnr.功能是本例的一个便利功能,它采用信号,噪声和请求的SNR,并在请求SNR处返回嘈杂信号。

testsignals =零(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 dB)''白叶(20 dB)''白痴(0 db)'};algorithms = {'ncf''PEF''cep''lhs''srh'};

运行音调检测算法

预先采用阵列以保持每个算法和噪声条件对的音高决策,以及定时信息。在一个循环中,打电话给沥青在算法和噪声条件的每个组合上的功能。每种算法都有一个与之相关的最佳窗口长度。在此示例中,为简单起见,您可以使用所有算法的默认窗口长度。使用3元素中值过滤器来平滑音高决定。

F0 =零(Numel(Truepitch),NumEr(算法),NumEr(Noisecondss));algorithmtimer = zeros(numel(noisecondss),numel(算法));为了k = 1:numel(noiseconditions)x = testsignals(:,k);为了i = 1:numel(算法)tic f0temp =音调(x,fs,......'范围',[50 300],......'方法',算法{i},......'medianfilterlength',3);algorithmtimer(k,i)= toc;F0(1:max(numel(f0temp),numel(truepitch)),i,k)= f0temp;结尾结尾

比较总节点错误

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

iDxtocompare =〜Isnan(Truepitch);Truepitch = Truepitch(idxtocompart);f0 = f0(idxtocompare,::);p = 0.20;GPE =平均值(ABS(F0(1:Numel(Truepitch),::)  -  Truepitch)> Truepitch。* P)。* 100;为了IK = 1:numel(noiseconditions)fprintf('\ ngpe(p =%0.2f),噪声=%s。\ n',p,noiseconditions {ik});为了i = 1:大小(GPE,2)FPRINTF(' - %s:%0.1f %% \ n',算法{i},gpe(1,i,ik))结尾结尾
GPE(P = 0.20),噪声=涡轮机(20dB)。
-  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),噪声=白细胞(20 dB)。
-  NCF:0.9% -  PEF:0.0% -  CEP:12.9% -  LHS:6.9% -  SRH:2.6%
GPE(P = 0.20),噪声=白细胞(0 dB)。
-  NCF:0.4% -  PEF:0.0% -  CEP:23.6% -  LHS:7.3% -  SRH:1.7%

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

在= sum(algorithmtimer)./((numsamples / fs)* numel(noisecondss));为了ik = 1:numel(算法)fprintf(' - %s:%0.3f(s)\ n',algorithms {ik},在(ik))结尾
-  NCF:0.031(S) -  PEF:0.140(S) -  CEP:0.032(S) -  LHS:0.099(S) -  SRH:0.111(S)

输入参数

全部收缩

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

数据类型:单身的|双倍的

Hz中输入信号的采样率,指定为正标量。

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

数据类型:单身的|双倍的

名称值对参数

指定可选的逗号分离对名称,价值论点。名称是参数名称和价值是相应的价值。名称必须出现在引号内。您可以以任何顺序指定多个名称和值对参数name1,value1,...,namen,valuen

例子:音高(AudioIn,FS,'Range',[50,150],'方法','PEF')

搜索范围的音高估计,指定为由“范围”和两个元素行向量组成的逗号分隔对,其具有增加的正整数值。根据指定的算法,该功能搜索由矢量指定的载体指定的上部频段边缘内的基频和下部带边的基频估计。方法。范围是包容性的,并且单位是Hz。

搜索范围的有效值取决于采样率,FS.,以及价值观WindowLength.方法

方法 最小范围 最大范围
'NCF.' FS./WindowLength.<范围(1) 范围(2)<FS./ 2.
'PEF.' 10 <范围(1) 范围(2)FS./ 2)
'CEP.' FS./(2 ^ nextpow2(2 *WindowLength.-1))<范围(1) 范围(2)<FS./ 2.
'LHS.' 1 <范围(1) 范围(2)<FS./ 5 - 1
'SRH.' 1 <范围(1) 范围(2)<FS./ 5 - 1

数据类型:单身的|双倍的

分析窗口中的样本数量,指定为逗号分隔对组成的配对WindowLength.'范围的整数[1,min(大小(奥地策,1),192000)]。典型的分析窗口在20-100毫秒范围内。默认窗口长度为52毫秒。

数据类型:单身的|双倍的

相邻分析窗口之间的重叠样本数,指定为由“逗号分隔的对”overtaplenth'和范围内的整数(-inf.WindowLength.)。负重叠长度表示不重叠的分析窗口。

数据类型:单身的|双倍的

用于估计间距的方法,指定为由“逗号分隔的对”方法' 和'ncf''PEF''cep''lhs', 或者'srh'。计算音高的不同方法在噪声稳健性,准确性和计算费用方面提供权衡。用于计算间距的算法基于以下论文:

  • 'ncf'- 归一化相关函数[1]

  • 'PEF'- 音高估计滤波器[2]。该功能不使用纸张描述的幅度压缩。

  • 'cep'- 综糖沥青测定[3]

  • 'lhs'- 对数谐波求和[4]

  • 'srh'- 剩余谐波的总和[5]

数据类型:char|细绳

中位过滤器长度用于平滑节距估计随时间,指定为由“逗号分离的对”MedianFilterLength.'和一个积极的整数。默认值,1,对应于没有中值过滤。中值过滤是一种后处理技术,用于在估计音高时删除异常值。功能使用movmedian.使用指定估计音高后方法

数据类型:单身的|双倍的

输出参数

全部收缩

估计在Hz中的基本频率,返回标量,矢量或矩阵。返回的行数取决于值的值WindowLength.overtaplenth名称 - 值对,以及输入信号大小。返回的列(通道)的数量取决于输入信号大小的列数。

数据类型:单身的|双倍的

与基本频率估计相关联的位置,作为标量,向量或矩阵相同的尺寸F0.

基本频率在本地估计在一个地区WindowLength.样品。价值座垫对应于用于估计基波频率的最新样本(最大样本数)。

数据类型:单身的|双倍的

算法

沥青功能段根据音频输入WindowLength.overtaplenth论点。每个帧估计基本频率。位置输出,座垫包含相应帧的最新样本(最大样本号)。

有关用于估计基本频率的算法的描述,请参阅相应的参考:

  • 'ncf'- 归一化相关函数[1]

  • 'PEF'- 音高估计滤波器[2]。该功能不使用纸张描述的幅度压缩。

  • 'cep'- 综糖沥青测定[3]

  • 'lhs'- 对数谐波求和[4]

  • 'srh'- 剩余谐波的总和[5]

参考

[1] Atal,B.S.“基于音高轮廓的自动扬声器识别。”美国声学学会杂志。卷。52,6B,1972,PP。1687-1697。

[2] Gonzalez,Sira和Mike Brookes。“音高估计过滤器鲁棒到高噪声(PEFAC)。”第19届欧洲信号处理会议。巴塞罗那,2011年,第451-455页。

[3] NOLL,Michael A.“克斯特劳斯塔斯统计学。”美国声学学会杂志。卷。31,第2,1967,第29.3页。293-309。

[4]爱马仕,Dik J.“通过次谐求和的音高测量。”美国声学学会杂志。卷。83,第1,1988号,第257.264页。

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

扩展能力

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

在R2018A介绍