0

好的,所以我不确定如何描述这个问题,因为我是音频分析的新手,所以我将逐步解释它。

  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())除以rangeso(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

ETC...

  1. 所以鉴于此,为什么将 when1024设置为range最大值 insorted总是20

附加信息:

  • 我正在使用 lomont FFT
  • 1024 在整个发病检测算法中保持不变
  • onsets.max()像往常一样对待1(我还没有找到onsets.Max()不是 1 的实例)

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

4

1 回答 1

1

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

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

但是,这不会将结果四舍五入为整数。您可以添加任何所需的舍入,例如Math.FloorMath.RoundMath.CeilSelect

var sorted = onsets.Select(onset => Math.Round(onset*rangemult)).ToList();
于 2021-12-16T21:37:07.320 回答