我正在尝试从C#的实时音频中确定“每分钟的节拍”。不过,我检测到的不是音乐,而是持续不断的敲击声。我的问题是确定两次点击之间的时间,这样我就可以确定“每分钟的点击次数”,我已经尝试使用WaveIn.cs类,但我并不真正理解它是如何采样的。我不会在一秒钟内拿到一定数量的样本来分析。我想我真的不知道如何在一秒钟内读取样本的确切数量,才能知道样本之间的时间间隔。
如果能帮助我走上正确的方向,我们将不胜感激。
发布于 2009-08-11 21:55:25
我不确定您使用的是哪个WaveIn.cs类,但通常对于录制音频的代码,您可以: A)告诉代码开始录制,然后稍后您告诉代码停止录制,并返回一个包含此时间段内录制的数据的数组(通常是short[]类型的数组);或者B)告诉代码以给定的缓冲区大小开始录制,当每个缓冲区被填满时,代码将回调到您通过引用已填充的缓冲区定义的方法,此过程将继续,直到您告诉它停止录制。
让我们假设您的记录格式是每个样本16位(也就是2字节),每秒44100个样本,单声道(1个通道)。在(A)的情况下,假设您开始录制,然后恰好10秒后停止录制。您将得到一个长度为441,000 (44,100 x 10)个元素的short[]数组。我不知道你用什么算法来检测“点击”,但是假设你检测到这个数组中的元素0,元素22,050,元素44,100,66,150等处的点击。这意味着你每.5秒发现一次点击(因为22,050是每秒44,100个样本的一半),这意味着你每秒有2个点击,因此是120BPM。
在(B)的情况下,假设您开始记录时的缓冲区大小固定为44,100个样本(也称为1秒)。当每个缓冲区进入时,您会在元素0和元素22,050处找到taps。按照与上面相同的逻辑,您将计算出120 BPM。
希望这能有所帮助。对于一般的节拍检测,最好记录相对较长的时间,并通过大量数据来计算节拍。尝试估计“瞬时”节奏更难,也更容易出错,就像实时估计录音的音高比用完整音符的录音更难一样。
发布于 2009-08-11 21:11:11
假设我们讨论的是同一个WaveIn.cs,WaveLib.WaveInRecorder的构造函数接受一个WaveLib.WaveFormat对象作为参数。这允许您设置音频格式,即。采样率,位深度等。只需扫描音频样本的峰值或无论您如何检测“点击”,并记录峰值之间的样本的平均距离。
由于您知道音频流的采样率(例如,44100样本/秒),取平均峰值距离(以样本为单位),乘以1/(样本速率)以获得两次点击之间的时间(以秒为单位),除以60以获得两次点击之间的时间(以分钟为单位),反转以获得每分钟的点击次数。
希望这能有所帮助
https://stackoverflow.com/questions/1262804
复制相似问题