当前课程知识点:计算机音乐 > 第二章 时域音频处理 > 2.4 端点检测 > 端点检测
同学们大家好
在有了音量计算的基础之后
我们来介绍一下端点检测的算法
音频信号中声音的起始点以及结束点的位置
我们就称之为端点
那么我们的位置就是设计检测的算法
来识别这些起始点以及结束点
我们可以在很多的音频处理软件中
直接观察到音频的信号的时域波形
那么从人眼
我们其实是能够看到音频的起始点以及
结束点的位置的
但是在时域的信号当中
音频的信号是上下进行剧烈的震动的
因此如果我们逐点的去来观察数据的话
我们很难去确定说
哪一点才是声音的起始点
哪一点是声音的结束点
那么如果我们从
RMS曲线也就是音量曲线的角度来看
因为RMS曲线是分窗处理之后
统计出来的局部音量值
它的变化比较均匀
这样的话我们就可以通过设定不同的阈值
Threshold
来确定到底什么地方是声音的起始点
什么地方是声音的结束点
那么这里的阈值的设定是非常有讲究的
那么如果阈值设定太低的话
我们就会过早的决定一个声音的起始点
反之如果我们阈值设定太高
那么这个起始点就会有所延迟
从而也不能达到一个很精确的一个效果
一般来说我们有几种方法可以确定阈值
比如说
我们可以使用音量的最大值的1/10
来作为阈值
也可以使用音量的中位数的10分之1来做阈值
甚至可以使用最小音量的十倍来做阈值
或者使用第一个采样点的五倍来作为阈值
当然不同的设定方法会有不同的效果
接下来我们将演示一下
如何在计算机程序中
实现简单的端点检测的方法
那么我们在刚才的RMS的计算的
基础之上完成端点的检测的程序
我们看到现在版本RMS比起
刚才那个版本是做一点修改的
我们在RMS的前面补充了
2分之1个窗口大小的这么多的采样点
等于说我们把RMS整体往后平移了
半个窗口的长度
目的是什么
目的是为了让他计算出的RMS之后
它的曲线更加能够贴合在
音频的振动上面
等于不会像前面的那样计算的结果一样
因为它是每个窗口起始点是
计算RMS的起始点
那么这样话RMS就会提早的上升
那么我们希望这个曲线能够更贴合在
音频的信号上面
那么在这基础上
首先我们需要去设定一个阈值th
那么这个阈值我们是设定成
RMS最大值的10分之1
然后我们就需要去遍历整个RMS
然后去判断一下每一个点的是不是端点
那么我们判断的一个依据是它的
RMS的这个值要小于th
而下一个值要大于等于th
大于等于这个阈值
这样的话它遍历的范围就必须是
Len RMS减1了
因为后面有个RMS i加1
如果不用减1的话它会产生数组的越界
这样话我们一旦检测出来
这RMS的端点之后
我们就往这个图像上去画一条直线
在i这个点上去画一个直线
那么这直线是从-1到1去画一条直线
那么我们运行一下
看起始点的位置找的是否准确
这样我们看到黑色竖线的位置就是
起始点的位置
那么目前看起来是可以的
显然这个起始点位置还是有点点偏离
原来这波形
因为它的RMS值还是会有点点提早
那么同理我们也可以去把
结束点的位置给画下来
那么只需要
同样的方法去判断一下就是
前面的一个值是大于th的
后面一个值是小于等于th的
那么我同样把这个地方用一条线画下
那么前面这条线我们给它设定一个颜色
橙色的颜色
后面的结束的位置
我们给它设定成红色的颜色
我们运行下看
这样话我们就能清楚地看到
橙色是起始位置
然后红色是结束位置
占橙色和红色的区间就是具有
语音信号的区间
那么橙色跟红色区间就是有语音信号区间
那么我们在做处理的时候
就可以把具有信号的这一段截下来
那么等于说把空白的部分进行舍弃
我们检测到的这样的一些
时间点也可以写到文件里面
那么我们可以放到
Sonic Visualiser里面去
更加清楚地一边听一边看这个结果
这里面我们只需要去
创建一个文件 叫做endpoint
这样端点的这样文件
就是一个txt文件的格式就可以了
它是一个写入类型的
那么在检测到起始点之后
我们就去进行写入write
然后我们需要把这个时间点给进行写入
那么这个时间点我们需要进行一个转换
因为现在i是采样点的序号
那么我们需要把它转换成时间
然后我们把这个时间用九位有效的数字
.9f来进行写入
然后再加上一个制表符
并且写上这个标签是END1这样的一个标签
我写完之后就换一行
写完之后就换一行
那么同理我们可以去写END2的标签
我们需要做一个时间转换
然后去写END2的标签
格式化是不需要加逗号
然后我们去运行一下
在结束程序之前
我们需要用这Fclose来结束写入
然后他才能真正地写入到文件里面
最后我们运行一下
运行结束之后我们就能看到
在endpoint.txt里面
就写上了这样的一些标签
那么这里标注了每一个时间点
那么它是起始点还是这个结束点
现在我们就可以在Sonic Visualiser
里面去更方便的来看到端点
那么我们首先打开
我们刚才的test.wav这个文件
那么可以放大一点
那么我们可以把刚才的检测到这端点
以test的形式进行导入
我们可以通过导入
Import Annotation Layer这样的
指令去导入刚才的endpoint
它会让你确认一下
这些时间点以及这个标签
好 那么这样的话我们就导入了不同的标签
那么我们可以我们可以在播放过程中
能够听到这些标签是否正确的
我们播放一下
那么我们看到基本上
线确实是声音起始这个位置
我们听到
在Sonic Visualiser里面是以
类似脉冲信号的这种形式来展示端点的
这就是有关端点检测的一个演示
这便是有关端点检测的算法介绍
同学们可以在课下尝试使用
不同的阈值设定方法
来看一下是否有不同的效果
-欢迎辞
-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 动态时间规划实现
--动态时间规划实现
-第七章作业