2012-05-05 40 views
4

简而言之: 我有一个方法被称为44,100次/秒。我想知道如果需要在13781.25号方法调用中打勾声音,那么该怎么办 - 这是每分钟192次)。我可以选择将这个数字四舍五入,并在13781st方法调用中使声音打勾,这意味着我会让声音在第0.25个时刻过早。这相当于0.00000566893424太早。节拍器精度算法数学

经过100次嘀嘀确定延迟肯定会加起来。有没有什么聪明的工作能够跟踪延迟,以及延迟何时超过某个点,然后可能是+;一些数字再次保持节奏?

这里是低于到目前为止,我的代码..

int counter; // used to track down the amount of times the method has been called 

signalMethod(){ 
    if(counter % ceil(2,646,000/10) == 0){ //the ceil function turns the decimal point into a whole number so it can be used for analysis. but this will cut off delay.. and over time im sure it will add up.. which will cause the beats to fluctuate... 
     playSound(); 
    } 
    counter++; 
} 
+3

音频应用中这样做的一个标准方法是建立一个双T,最初为零。每个样本,将t增加1.0/44100.0,并检查t>(60.0/192.0)。如果是这样,请调用节拍器功能并将t减60.0/192.0。 t一旦减少,剩下的金额将按照第二段描述的方式执行,以防止随着时间的推移而出现错误。 –

回答

6

您的问题是这个问题的另一种变体处理“布氏算法”,但不是增加有一定坡度绘制的线的Y坐标(斜率将是拍子频率),你会发出滴答声。

Wikipedia on Bresenham's Algorithm

+0

啊是的我很熟悉这个算法,就像在屏幕上绘制像素来代表线条一样。我明白,在这两种情况下,我们都必须处理错误累计值。然而,我不知道如何随着时间的推移调整滴答的准确性,如果累积误差足够大,需要根据什么样的新样本对滴答样式进行修改,然后使其成为精确的再次。 – Pavan

+0

@Pavan:建议的方法避免了错误积累(如果使用Bresenhams算法中的整数完成)。它会引入一点点抖动,你的节拍不会全部在完美的时间,但只要它们在大约1(甚至可能高达10)毫秒的地方,它们应该在哪里,没有人会注意到,而不是耳朵。再次,这里没有错误积累。 –