为什么将开头列表排序为歌曲的样本深度 (1024) 大小的数字总是导致 20

Why does sorting a list of onsets into numbers the size of the Sample Depth of the song (1024) always result in 20

好的,所以我不太确定如何描述这个问题,因为我对整个音频分析还是陌生的,所以我将逐步解释它。

  1. 所以我在这里用 csharp 编写了这个算法
// Put into groups
for (int i = 0; i < onsets.Count-1; i++){
    for (float i2 = 1f; i2 < range+1; i2++){
        if (onsets[i] >= rangemult*(i2-1f) && onsets[i] <= rangemult*i2){
           sorted.Add(((rangemult*i2)*2f)*10f);
        }
    }
}
  1. 这是它的作用:

onsets --> 包含找到的起始点的列表(不包括任何 0)

范围 --> 歌曲采样深度 (1024)

rangemult --> 是起始列表中的最大值 (so onsets.Max()) 除以 range 所以 (max DIV range)

sorted --> 列出已排序的起点被添加到

(rangemult*i2)*2f)*10f --> 我这样做是为了让值成为一个整数(这在大多数情况下不会发生,但实际上只是为了整洁 - 所以为了大部分可以忽略)

原则上,该算法会将数组 (0.1, 0.2, 0.4, 0.45, 0.5) 转换为

range = 102, 4, 8, 9, 10

range = 204, 8, 16, 18, 20

等...

  1. 那么为什么当 1024 设置为 rangesorted 中的最大值总是 20

附加信息:

如果你能提供哪怕是最细微的错误提示,我将不胜感激 - 如果这里没有足够的信息或不需要这些信息,请通知我,因为我还是新手,所以我很难尝试以准确的方式解释我的问题 - 谢谢你的理解:)

鉴于您的明显目的,您只需要一个简单的 LINQ 语句:

var rangemult = range/onsets.Max();
var sorted = onsets.Select(onset => onset*rangemult).ToList();

但是,这不会将结果四舍五入为整数。您可以在 Select:

中添加任何所需的舍入,例如 Math.FloorMath.RoundMath.Ceil
var sorted = onsets.Select(onset => Math.Round(onset*rangemult)).ToList();