我试图从C#中的实时音频中确定“每分钟节拍”。这不是我正在探测的音乐,只是一种持续的敲击声。我的问题是确定这些点击之间的时间,所以我可以确定“每分钟点击次数”我尝试过使用WaveIn.cs类,但我真的不明白它的采样方式。我没有得到一定数量的样本一秒钟进行分析。我想我真的只是不知道如何在一秒钟内读取确切数量的样本以了解样本之间的时间。
任何有助于我朝着正确方向前进的帮助将不胜感激。
我不确定你正在使用哪个WaveIn.cs类,但通常使用记录音频的代码,你要么A)告诉代码开始录制,然后在稍后你告诉代码停止,你得到返回一个数组(通常为short []类型),它包含在此时间段内记录的数据;或者B)告诉代码以给定的缓冲区大小开始记录,并且当每个缓冲区被填充时,代码回调一个你已经定义的方法,并引用填充的缓冲区,这个过程一直持续到你告诉它为止停止录音
假设您的记录格式是每个样本16位(也称为2个字节),每秒44100个样本和单声道(1个通道)。在(A)的情况下,假设您开始录制,然后在10秒后停止录制。最终会得到一个short []数组,长度为441,000(44,100 x 10)个元素。我不知道你用什么算法来检测“点击”,但是假设您在元素0,元素22,050,元素44,100,元素66,150等处检测到此数组中的点击。这意味着您每次都会发现点击。 5秒(因为22,050是每秒44,100个样本的一半),这意味着你每秒有2个抽头,因此120 BPM。
在(B)的情况下,假设您开始使用固定缓冲区大小为44,100个样本(也称为1秒)进行录制。当每个缓冲区进入时,您会在元素0和元素22,050处找到抽头。按照与上面相同的逻辑,您将计算120 BPM。
希望这可以帮助。通常使用节拍检测,最好记录相对较长的时间并通过大量数据计算节拍。试图估计“瞬时”节奏更加困难并且容易出错,就像估计录音的音高实时更难以录制完整音符一样。
我想你可能会用“水龙头”来混淆样品。
样本是表示给定时刻的声波高度的数字。典型的波形文件可能每秒采样44,100次,因此如果您有两个立体声通道,则每秒有88,200个16位数(采样)。
如果您获取所有这些数字并绘制图形,您将获得以下内容:
(来源:vbaccelerator.com)
What you are looking for is this peak ------------^
这是水龙头。
假设我们正在谈论相同的WaveIn.cs,WaveLib.WaveInRecorder的构造函数将WaveLib.WaveFormat对象作为参数。这允许您设置音频格式,即。采样率,位深度等。只需扫描音频样本的峰值,或者您正在检测“点击”并记录峰值之间样本的平均距离。
由于你知道音频流的采样率(例如44100样本/秒),取你的平均峰值距离(样本中),乘以1 /(采样率)得到抽头之间的时间(以秒为单位),除以60获得点击之间的时间(以分钟为单位),并反转以获得点击/分钟。
希望有所帮助