基频估计算法简介
基频估计算法 F0 estimate methods
估计F0的方法可以分为三类:基于时域、基于频域、或混合方法。本文详细介绍了这些方法。
所有的算法都包含如下三个主要步骤:
1.预处理:滤波,加窗分帧等
2.搜寻:可能的基频值F0(候选值)
3.跟踪:选择最可能的F0轨迹(这很重要,因为每个时刻我们都有几个候选轨迹)
基于时域
首先,基本情况。在应用时域方法之前,对信号进行滤波以只留下低频。设置阈值:最小频率和最大频率,例如75 ~ 500hz。F0估计仅对谐波。那些有停顿或噪声斑点的部分不仅没有观察意义,还可能改变相邻帧,并在应用插值或平滑时导致错误。所选帧的长度使其至少包含三个基频周期。
自相关
主要的算法就是自相关,随后又出现了一系列在此基础上的改进算法。自相关方法非常简单:计算自相关函数,然后定义它的第一个最大值,该最大值将反映信号中最显著的频率成分。那么,在使用自相关的问题是什么,为什么第一个最大值不能总是对应所需的频率?即使在高质量录音的近乎完美的条件下,由于信号的复杂结构,算法也容易出现错误。在接近真实的情况下,错误的数量急剧增加。此外,在最初质量较差和有噪声的录音中,我们可能会面临缺乏所期望的峰值等问题。
YIN算法
尽管自相关算法存在错误,但由于其基本的简单性和逻辑性,该方法较受欢迎。它被广泛应用于包括YIN在内的许多算法中。YIN这个名字本身指的是自相关的便利和不准确之间的平衡:YIN这个名字来自东方哲学的阴和阳,暗指它所涉及的自相关和抵消之间的相互作用。
YIN的创造者试图解决这个问题。他们改变的第一件事是使用累积平均归一化差分函数,该函数被认为可以降低信号对幅度调制的灵敏度,并使峰值更加明显。
YIN试图避免当窗口函数的长度不能被波动周期整除时出现的错误。为此,应用抛物线插值来近似最小值。在音频信号处理的最后一步,使用最佳局部估计函数来避免值的快速波动。(很难说是好是坏。)
基于频域
当我们谈到频域时,最突出的方面似乎是信号的谐波结构。换句话说,谱峰的频率可以被F0整除。在倒谱分析的帮助下,您可以将这种周期性模式转换为一个明显的峰值。倒谱是估计功率谱对数的傅里叶变换(FFT)。倒谱峰对应于频谱中最具周期性的分量。
混合法
有一个相当有说服力的名字YAAPT Yet Another algorithm of Pitch Tracking。它被归类为混合,因为它同时使用时间和频率数据。
YAAPT包括几个阶段,首先预处理开始。在这一阶段,初始信号的值被平方。这一步与YIN中的累积平均归一化差函数的目标相同:放大和恢复自相关的阻塞峰值。两个版本的信号都经过滤波,通常在50-1500 Hz或50- 900 Hz的频谱范围内。
然后,根据变换后信号的频谱,计算出F0的基本轨迹。利用谱谐波相关函数(Spectral Harmonics Correlation,SHC)确定F0的候选值。
其中S(t,f)是第t帧和频率f的幅度频谱,WL是窗口的长度,单位为Hz, NH是谐波的数量(本文作者建议使用前三个谐波)。
基于功率谱对有音-无音帧进行了定义。然后,考虑音高加倍/音高减半的可能性,寻找最优轨迹。
然后,对于初始信号和转换信号,用归一化交叉相关(Normalized Cross Correlation,NCCF)来确定F0的候选信号,而不是自相关。
下一步是评估所有可能的候选值并计算他们的权重。候选的权重不仅取决于NCCF的振幅峰值,还取决于它们与F0轨迹的接近程度,这也是由频谱决定的。因此,频域被认为是相当稳定的。
对于所有剩余的候选值对,转移成本矩阵计算转移成本,以找到最佳的可能轨迹。
例子
我们选取了几段男女声音的片段,既有中性的声音,也有带有情感色彩的声音,并将它们组合在一起。让我们看一下信号的频谱图,它的强度(橙色)和F0(蓝色)。你可以在Praat用Ctrl+O(打开从文件中读取)打开它,然后按查看&编辑。
从录音中可以清楚地看出,男性和女性在带感情说话的音调都更高。此外,男性情感言语的F0与女性的F0相似。
跟踪Tracking
在菜单中选择Analyze periodicity to Pitch (ac),通过自相关估计F0。设置窗口允许为F0候选估计设置3个参数,以及为在所有候选中构建最可能的F0轨迹的寻径算法设置6个参数。
路径查找器结果可以通过单击OK和View &编辑Pitch文件。从图中可以看出,除了选定的轨道之外,还有其他频率较低的候选轨道。
让我们以两个提供音高跟踪的库为例。首先是aubio,其中默认算法是YIN。并利用YAAPT算法进行amfm_分解。将Praat中的F0值插入到一个单独的文件(PraatPitch.txt)中(您可以手动操作:选择音频文件,单击“查看和编辑”,选择整个文件,然后在上面的菜单中选择“Pitch-Pitch列表”)。
现在比较这三种算法(YIN, YAAPT, Praat)的结果。
import amfm_decompy.basic_tools as basic
import amfm_decompy.pYAAPT as pYAAPT
import matplotlib.pyplot as plt
import numpy as np
import sys from aubio
import source, pitch
# load audio
signal = basic.SignalObj('/home/eva/Documents/papers/habr/media/audio.wav')
filename = '/home/eva/Documents/papers/habr/media/audio.wav'
# YAAPT pitches
pitchY = pYAAPT.yaapt(signal, frame_length=40, tda_frame_length=40, f0_min=75, f0_max=600)
# YIN pitches
downsample = 1
samplerate = 0
win_s = 1764 // downsample # fft size
hop_s = 441 // downsample # hop size
s = source(filename, samplerate, hop_s)
samplerate = s.samplerate
tolerance = 0.8
pitch_o = pitch("yin", win_s, hop_s, samplerate) pitch_o.set_unit("midi")
pitch_o.set_tolerance(tolerance)
pitchesYIN = []
confidences = []
total_frames = 0
while True:samples, read = s()pitch = pitch_o(samples)[0]pitch = int(round(pitch))confidence = pitch_o.get_confidence()pitchesYIN += [pitch]confidences += [confidence]total_frames += readif read < hop_s:break
# load PRAAT pitches
praat = np.genfromtxt('/home/eva/Documents/papers/habr/PraatPitch.txt', filling_values=0)
praat = praat[:,1]
# plot
fig, (ax1,ax2,ax3) = plt.subplots(3, 1, sharex=True, sharey=True, figsize=(12, 8))
ax1.plot(np.asarray(pitchesYIN), label='YIN', color='green')
ax1.legend(loc="upper right")
ax2.plot(pitchY.samp_values, label='YAAPT', color='blue')
ax2.legend(loc="upper right")
ax3.plot(praat, label='Praat', color='red')
ax3.legend(loc="upper right") plt.show()
正如我们所看到的,在默认参数下,YIN不如Praat,显示出一个非常平坦的轨迹,相对于Praat的值更低。此外,它完全失去了男声和女声之间的过渡,以及情感和非情感话语之间的过渡。
YAAPT在女性情感言语的高音测试中失败,但总体上表现出较好的效果。我们不能肯定地说为什么它的效果更好,但我们可以假设它与从三个来源提取候选值以及比YIN更准确地计算他们的权重有关。
将Praat作为语音处理的标准算法(因为它在研究人员中被广泛使用),我们可以得出结论,YAAPT比YIN更可靠和准确,尽管我们的测试对它来说相当困难。
相关文章:

基频估计算法简介
基频估计算法 F0 estimate methods 估计F0的方法可以分为三类:基于时域、基于频域、或混合方法。本文详细介绍了这些方法。 所有的算法都包含如下三个主要步骤: 1.预处理:滤波,加窗分帧等 2.搜寻:可能的基频值F0(候选…...

linux修改DNS 系统版本Kylin V10桌面版
配置DNS在银河麒麟桌面操作系统V10 SP1 中修改DNS信息,直接修改/etc/resolv.conf文件中的DNS信息,不能生效。应该参考如下步骤:一、首先修改 /etc/systemd/resolved.conf文件,在其中添加DNS信息在终端中执行以下命令:s…...
如何使用 AWS Lambda 运行 selenium
借助 AWS Lambda 运行 selenium 来爬取网络数据。 简介 与手动从网站收集数据相比,爬虫可以为我们节省很多时间,对于爬虫的每次请求而言,这相当于 AWS Lambda 的每次函数的运行。 AWS Lambda 是一种将脚本部署到云的简单且价格低廉的服务&…...

认识Cesium旋转大小变量
前文代码中有如下;矩阵乘以旋转大小,还放入mat; Cesium.Matrix4.multiply(mat, rotationX, mat); 初看以为rotationX是一个数值,因为矩阵可以和数相乘; 但是看它的代码,rotationX是由一长串代码获得的&a…...
异响加持、吐槽声不断,小鹏G9难解困局
小鹏汽车的烦恼就好比红尘中的三千青丝,小鹏G9“惊魂48小时”的恐慌还未平息,车门异响等问题就已经层出不穷,再次将小鹏汽车推上风口浪尖。 可以毫不客气的说,G9承载着小鹏汽车盈利的希望,但在原本处于上升之势的G9却…...

【react】react18的学习
一、安装 $ create-react-app [Project name]默认支持sass 二、核心依赖 react:react 核心 react-dom:用于开发渲染web 应用; react-scripts:封装webpack服务; "start": "react-scripts start&quo…...

Ep_操作系统面试题-什么是线程,线程和进程的区别
1. 一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间),但是每个线程有自己的程序计数器、虚拟机栈和 本地方法栈。 2.进程是资源分配的最小单位,线程是CPU调度的最小单位 视频讲解: https://edu.csdn.net/course/detail/38090 点我…...

最流行的自动化测试工具,总有一款适合你(附部分教程)
前言 在自动化测试领域,自动化工具的核心地位毋庸置疑。本文总结了最顶尖的自动化测试工具和框架,这些工具和框架可以帮助组织更好地定位自己,跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。 1)Selenium …...
Shell高级——进程替换vs管道
以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。 1、问题引入 这里将Shell中的“进程替换”与“管道”放在一起讲,是因为两者的作用几乎类似。 进程替换:将一个命令的输出结果传递给另一个(组)命令。 管…...

国内有哪些支持定制化的低代码平台?
编者按:贴合企业业务需求的系统才是好系统,高程度的定制能力平台意味着可以提供更高契合度的产品,更好地匹配业务需求。本文介绍了国内支持定制化的老厂商低代码平台,具有源码交付、私有化部署、国产化、数据对接等优势。关键词&a…...

Altair 宣布将于3月举办 Future.Industry 2023 全球虚拟大会
Altair(纳斯达克股票代码:ALTR)近日宣布将于 2023 年 3 月 8 - 9 日 举办年度全球虚拟大会 Future.Industry 2023。旨在探索影响全球未来的新趋势,并深入探讨仿真、高性能计算 (HPC)、人工智能(AI)和数据分…...

react lazyLoad学习记录
react lazyLoad学习记录1.lazyLoad用处2.使用2.1 react-router-dom5版本写法2.2 react-router-dom6版本写法1.lazyLoad用处 默认例如首页,如果有好十几个甚至百个路由,react是会默认一下全部把路由组件一下全部加载的,极可能造成页面卡顿。r…...

29 openEuler管理网络-配置网络绑定
文章目录29 openEuler管理网络-配置网络绑定29.1 使用nmcli29.2 使用命令行29.2.1 检查是否已安装Bonding内核模块29.2.2 创建频道绑定接口29.2.3 创建从属接口29.2.4 激活频道绑定29.2.5 创建多个绑定29 openEuler管理网络-配置网络绑定 29.1 使用nmcli 创建名为bond0的绑定&…...

RTT 全志D1s RDC2022纪念版开发板开箱使用分享与折腾记录
原文链接:https://bbs.aw-ol.com/topic/3021/ 作者caoxuetian 1:开发板介绍 RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板,尺寸仅为5.5cm*4cm,能够已非常小的体积带来舒适的开发感受&#…...
24日常实习万得一面面径
文章目录分析与复盘面试题分析与复盘 应该将项目进行复习好的,两个项目都应该对简历写的那些进行复习,以为日常不问项目的一面。哭死… 面试题 1.自我介绍 2.为什么从土木转到开发,学习java有哪些途径 3.介绍下项目中你觉得最有设计的模…...
MySQL的DML和DDL操作(1)
这里介绍几种DML操作INSERT INTO——插入记录插入一条记录插入一条记录 INSERT INTO table [(column [, column . ])] VALUES(value [,value . ]); 例子: insert into student values( 1,"承太郎" )default charset utf8;插入多条记录插入多条…...

Kafka系列之:Kafka生产者和消费者
Kafka系列之:Kafka生产者和消费者 一、Kafka生产者发送流程二、提高生产者吞吐量三、Kafka消费方式四、Kafka消费者总体工作流程五、按照时间消费Kafka Topic一、Kafka生产者发送流程 batch.size:只有数据积累到batch.size之后,sender才会发送数据,默认16K。linger.ms:如果…...

Linux进程间通信:信号量(一)
前提知识 在介绍信号量之前,先来看看一些概念和一些简单的前提知识: 进程间通信的前提是让不同的进程看到同一份资源。于是,就有提出让这种资源成为一种公共资源的方法,方法的提出,导致了一种新的问题的出现…...
Python笔记一之excel的读取
这里我常用的 python 对于 excel 的读取库有两个,一个是 xlsxwriter 用于操作 excel 的写入,一个是 xlrd 用于 excel 文件的读取。 使用的库的版本如下: xlsx1.2.6xlrd1.1.0 xlsxwriter 写入 excel 新建一个 excel import xlsxwriterpat…...

JavaScript Number 数字对象
文章目录JavaScript Number 数字对象JavaScript 数字所有 JavaScript 数字均为 64 位精度八进制和十六进制无穷大(Infinity)NaN - 非数字值数字可以是数字或者对象数字属性数字方法JavaScript Number 数字对象 JavaScript 只有一种数字类型。 可以使用也…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...