我有一个应用程序,它使用44100的采样率输出代表1/96拍(让我们称之为脉冲)的缓冲块。
在恒定的120 bpm下,我每秒有2拍,所以每拍有22050个样本,因此每脉冲有2296875个样本。这些是我从应用程序中获得的第一个值:

0
230
459
689
919
1148
1378
1608
1838
2067
2297
2527
2756
2986
3216
3445
3675
3905
4134
4364
4594
4823
5053
5283
5512
5742
5972
6202
6431

注意两件事:
它使用Round half to Even对值进行取整;
由于舍入,缓冲器之间的距离可以是229或230。
在恒定190 bpm的情况下,我每脉冲有1450657895个样本。我得到的第一个值是:
0
145
290
435
580
725
870
1015
1161
1306
1451
1596
1741
1886
2031
2176
2321
2466
2611
2756
2901
3046
3191
3337
3482
3627
3772
3917
4062

和以前一样,一半到一半,现在的距离可以是145或146。
好吧,没什么难的现在!如果我以120 bpm的速度启动应用程序,并且在25次脉冲后切换到190 bpm,那么切换后的距离会很奇怪:
0
230     // distance 230
459     // distance 229
689     // distance 230
919     // distance 230
1148    // distance 229
1378    // distance 230
1608    // distance 230
1838    // distance 230
2067    // distance 229
2297    // distance 230
2527    // distance 230
2756    // distance 229
2986    // distance 230
3216    // distance 230
3445    // distance 229
3675    // distance 230
3905    // distance 230
4134    // distance 229
4364    // distance 230
4594    // distance 230
4823    // distance 229
5053    // distance 230
5283    // distance 230
5512    // distance 229
5742    // distance 230 - here I switch
5887    // distance 145
6032    // distance 145
6177    // distance 145
6322    // distance 145
6468    // distance 146

为什么最后146个值(6468)?
在您看来,由于“什么”的距离prev缓冲区是146而不是145?尝试在每次迭代中舍入next/prev,但在那里获得145作为值似乎是正确的取而代之的是146。
把我所有的柜台都弄糊涂了。有线索吗?

最佳答案

 229.6875 * 25 = 5742.1875
 145.0657895 * 5 = 725.3289475
 5742.1875 + 725.3289475 = 6467.5164475 rounding to 6468

请注意,基本的计算是用精确的(仅仅是浮点数)数字进行的

关于algorithm - 您可以帮助我确定此申请的四舍五入吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37481791/

10-10 17:14