当前课程知识点:计算机音乐 > 第六章 高音跟踪 > 6.1 音高跟踪概述 > 音高跟踪
同学们大家好
欢迎回到计算机音乐的课堂
今天我们会介绍
计算机音乐的一个应用方向
也是一个非常重要的课题
就是音高跟踪
音高跟踪在上个世纪的计算机音乐的
早期研究当中已经很受重视
最主要的一个原因是因为
音高在音频编码中具有很重要的地位
而音频编码又是上个世纪
无线通讯领域中的一个重要课题
让我们先来看一段声音的频谱图
频谱图基本上可以大致地体现人说话时
或者乐器演奏时候的音高变化
那么从这张频谱图里面我们可以看出
在每一个时刻
音高的
共振峰
它的分布基本上都是等距的
随着时间往前走
这些距离会发生变化
音高也就随之发生变化
那么人在说话的时候
可以通过控制自己的声带
来完成这些音高的变化
同时通过我们的听觉
也可以感知到这些变化
作为音频的一种基本的特征
我们依然会从时域和频域两个观点来看
时域的观点直接对应于
数字音频的存储
而频域的观点跟人的感知更加接近
这就是计算机音乐里面
信号处理的一个基本的思路
从时域的角度
所谓的音高跟踪
就是从周期信号里面去计算它的周期
或者频率
那么如果声音
在理论上是一个周期的信号
那么这个定义是非常的严谨的
但实际上
我们能够感受到音高并不是
要求这个声音必须是
严格的周期的
因此我们就需要对每个周期
出现的不同形状
进行对策
通常我们会使用分窗的形式进行统计
这样的一种做法
那么这时候窗口的大小的选择
就会非常的关键了
比如说正弦波
一个周期正好是过两次零
好
下面这一段音频是来自钢琴的
C4这个音
我们可以看到
它在一个周期里面会过四次零
这样我们只需要选择适合的窗口
统计窗口内的信号过零的次数
再根据窗口的长度
就可以计算出周期了
那我们仔细来看一下
根据过零率
计算周期以及频率的一个过程
那么我们假设过零率
用zcr来表示
那么一个窗口内
过零的总次数
我们用zc来表示
一个周期内过零的次数
用zc0来表示
t表示窗口的时长
大T表示周期
N表示窗口内包含周期的个数
那么根据这个
过零率的定义
zcr就等于zc除以t
而zc
是过零的总的次数
所以我们可以用N乘以zc0来表示
t是一个窗口的时长
因为这个窗口包含N个周期
所以窗口时长t就等于NT
这样的话呢
zcr就等于zc0除以T
这样话我们就可以通过
一个周期内过零的次数
跟周期来换算出
这个zcr
这样的话我们就可以直接把频率
f等于T分之1给计算出来
那么在数值计算的过程中
我们可以通过连续性的假设
来计算过零率
假设我们获取的信号是连续的
那么在数字化过程中
假设有两个相邻的点
它的符号是相反的
那么由于连续函数的介质定理
我们可以推断出这两点之间
一定会过一次零
比如说我们在这个信号里面
我们
可以检测两个相邻的采样点
如果他们符号是相反的
那么
比如连续性的假设他一定会穿过零一次
这样的话
我们就可以通过
两个相邻的采样点符号改变的次数
来计算过零率
那么这个计算通过python的程序
来完成的是会非常简单的
那么在python里面我们很容易可以用
numpy下面的一些模块
来计算
一个列表里面符号变化的次数
也就是能够计算出过零率
那么我们首先随便的定义一个列表
好这个列表我们看一下它一共有
一二三
三次的符号的变化
我们希望把它统计出来
所以首先我们使用
numpy下面sign符号函数来显示它的
正负号
得到这正负号之后我们还可以用
差异函数diff来显示正负号的
相邻的两个数之间的差
这样的话我们只要统计一下
这里面一共有
多少个不是零的数字
那么这样的话我们就能知道
符号变化次数
一共有多少个了
那么我们只需要用这个
np的where
那么我们去统计一下这一串数字里面
不是零的
数字是
它的下标是哪一些
这样的话我们就能统计出来说
0号2号3号
他们的下标都不是零
这样的话我们就可以
直接去看一下
这个列表
一共有多少个元素
这样的话就能知道
它的符号变化次数有多少次了
我们可以用这样的计算方式来
计算过零率
那么接下来我们就来录制一段乐器的声音
来检验过零率的
计算是否可靠
那么我们先来录制一段哨笛的A5的声音
好我们刚才录制是一段
哨笛的A5也就是880hz的声音
那我们可以
把这个声音导出
存成
whistle_A5
之后我们可以观察一下
这个波形
我们把它放大一点
那么我们可以观察出来了
每个周期它会过123456
6次零这样的一个过零次数
所以我们只需要
按照刚才的过零率以及
周期的换算公式
就可以计算出这个
声音的周期
我们到python程序里面来看一下
那么首先我们会调用
之前我们一直使用的这个分窗函数
做完分窗之后
对每一个窗口我们去
再去计算它的过零率
那么过零率的计算
首先我们要统计出它过零的次数
之后我们要看一下
这一段窗口它的长度
是多少时间
然后用ZC除以t获得过零率
最后我们读取这个音频文件
分窗
分窗完之后
我们再进行
过零率的计算
那么计算出来之后
我们可以看一下过零率的一个统计
我们可以看到
基本上
在前面一段后面一段会有些不稳定
因为它是音的开头跟结尾
之后基本上它就处于
大致是这样一个高度的数值
那么我们可以
稍微计算一下
这个zcrate
那么我们刚才说了一个周期有
六次过零
所以我们可以除以六
这样的话计算出来
大致上它的数值在882附近去震荡
那么基本上就是
哨笛A5也就是882赫兹的这个
音高
那么它基本上是在882赫兹的
上下幅度上进行震荡的
对于某些乐器从肉眼上看
每个周期的形状还是比较稳定的
但是从信号的角度
过零的次数就不那么稳定了
比如我们接下来录制的尤克里里的
A4的声音呢
就不那么稳定了
好了录下这段声音之后
我们给它放大一下来观察它的波形
那么比较稳定的音高的部分
应该是后面的这一部分
但是我们看到现在有一个这样的问题
从肉眼上看她的每个周期都是一样的
但是在零附近如果我们再进一步
放大的话
或者说看一下前面一些
音高比较大的部分
那么我们会看到这些
比较接近零的地方
有些时候他是过一次零
有些时候它是
一次零也不过
那么有些时候
它会过两次零
所以这些地方我们在估算他的
一个周期内过零的次数的时候
就会非常的
不精确
那么如果我们到python程序里面去看
它将会产生
并不是非常理想的效果
例如我们用刚才的程序
去打开尤克里里的这个
标准A的声音
那如果运行下
那么我们会看到它的过零率
非常的不稳定
前面一直在变化
那么到这个地方会稍微的
稳定一点
到这个地方会稍微稳定一点
但是有一大段都是非常的不稳定
当然这些地方我们也可以用
刚才得到的公式去计算它的
音高应该是440赫兹应该是准的
但是前面会有非常不稳定的部分
本质上人耳对于过零率
并不是特别的敏感的
主要是因为人耳
基本上是在频域的信息之下工作的
那么在频域当中人耳特别对
整数倍分布的峰值非常的敏感
在整数倍峰值的分布的前提之下
其实我们也可以
在频率的角度
把音高定义成第一个峰值所在的
频率的大小
那么这个频率我们通常也叫做基频
也就是F0
但是其实
这里面依然会有一些问题
一个在肉眼看起来非常明显的峰值
那么我们通常都会用自己的经验来判断
但是如果要让计算机去
判断哪一个点是峰值
就需要经过一些严格的规则了
除此之外
如果一个声音是和旋
那么这个峰值就不是整数倍的关系了
这时候怎么去定义根音又是一个问题
接下来我们会分别介绍在时域和频域当中
比较经典的音高跟踪算法
最后我们会以K歌评分中的音高跟踪算法
作为一个具体的应用来展示
音高跟踪在当今的计算机音乐里面的应用
非常广泛
那么包括哼唱搜索普通话
语调识别
英语的音调评分
语音合成中的韵律分析
变调与变速等等的应用
都需要以音高跟踪作为基础
那让我们来期待一下今天的内容
-欢迎辞
-1.1 计算机音乐导言
--计算机音乐导言
-1.2 计算机音乐课程主要内容
-1.3计算机音乐课程资源
-1.4 音乐的基本表达
--音乐的基本表达
-第一章作业
-2.1时域音频处理概述
--时域音频处理概述
-2.2 分窗处理1:OLA叠放
-2.3 分窗处理2:音量计算
-2.4 端点检测
--端点检测
-2.5 振幅包络
--振幅包络
-2.6 音频信号相乘
--音频信号相乘
-2.7 环形调制
--环形调制
-2.8 频率调制
--频率调制
-2.9 频率调制在音乐上的应用
-第二章作业
-3.1 频谱概述
--频谱概述
-3.2 傅里叶变换
--傅里叶变换
-3.3 短时傅里叶变换
--短时傅里叶变换
-3.4 加法合成
--加法合成
-3.5 线性滤波器
--线性滤波器
-3.6 京剧锣鼓经分析
--京剧锣鼓经分析
-第三章作业
-4.1 音色合成概述
--音色合成概述
-4.2 质点弹簧阻尼模型
--质点弹簧阻尼模型
-4.3 双线性滤波器
--双线性滤波器
-4.4 Modal合成
--Modal合成
-第四章测试
-5.1 一维振动模型概述
--一维振动模型概述
-5.2 弦振动模型
--弦振动模型
-5.3 达朗贝尔的行波解
--达朗贝尔的行波解
-5.4 梳状滤波器
--梳状滤波器
-5.5 Karplus Strong算法
-5.6 管状气鸣乐器模型
--管状气鸣乐器模型
-第五章作业
-6.1 音高跟踪概述
--音高跟踪
-6.2 时域音高跟踪
--时域音高跟踪
-6.3 频域音高跟踪
--频域音高跟踪
-6.4 K歌评分
--K歌评分
-第六章作业
-7.1 音频同步概述
--音频同步概述
-7.2 音乐特征提取 CQT
-7.3 音乐特征提取 Chroma
-7.4 动态时间规划概述
--动态时间规划概述
-7.5 动态时间规划实现
--动态时间规划实现
-第七章作业