【发布时间】:2016-05-27 11:01:31
【问题描述】:
我有一个应用程序,它使用 44100 的采样率输出代表 1/96 节拍的缓冲区块(我们称之为脉冲)。
在恒定的 120 BPM 下,我每秒有 2 拍,所以每拍 22050 个样本,因此每个脉冲 229,6875 个样本。这些是我从应用程序中获得的第一个值:
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 下,我每个脉冲有 145,0657895 个样本。我得到的第一个值:
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?尝试在每次迭代时舍入下一个/上一个,但在那里获得 145 作为值似乎是正确的。取而代之的是 146。
这让我所有的计数器都感到困惑。有什么线索吗?
【问题讨论】:
标签: algorithm function math rounding approximation