为什么将开头列表排序为歌曲的样本深度 (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
好的,所以我不太确定如何描述这个问题,因为我对整个音频分析还是陌生的,所以我将逐步解释它。
- 所以我在这里用 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);
}
}
}
- 这是它的作用:
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 = 10
到 2, 4, 8, 9, 10
range = 20
到 4, 8, 16, 18, 20
等...
- 那么为什么当
1024
设置为 range
时 sorted
中的最大值总是 20
?
附加信息:
- 我正在使用 lomont FFT
- 1024 在整个起始检测算法中保持不变
- 一如既往地对待
onsets.max()
1
(我还没有找到 onsets.Max()
不是 1 的实例)
如果你能提供哪怕是最细微的错误提示,我将不胜感激 - 如果这里没有足够的信息或不需要这些信息,请通知我,因为我还是新手,所以我很难尝试以准确的方式解释我的问题 - 谢谢你的理解:)
鉴于您的明显目的,您只需要一个简单的 LINQ 语句:
var rangemult = range/onsets.Max();
var sorted = onsets.Select(onset => onset*rangemult).ToList();
但是,这不会将结果四舍五入为整数。您可以在 Select
:
中添加任何所需的舍入,例如 Math.Floor
或 Math.Round
或 Math.Ceil
var sorted = onsets.Select(onset => Math.Round(onset*rangemult)).ToList();
好的,所以我不太确定如何描述这个问题,因为我对整个音频分析还是陌生的,所以我将逐步解释它。
- 所以我在这里用 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);
}
}
}
- 这是它的作用:
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 = 10
到 2, 4, 8, 9, 10
range = 20
到 4, 8, 16, 18, 20
等...
- 那么为什么当
1024
设置为range
时sorted
中的最大值总是20
?
附加信息:
- 我正在使用 lomont FFT
- 1024 在整个起始检测算法中保持不变
- 一如既往地对待
onsets.max()
1
(我还没有找到onsets.Max()
不是 1 的实例)
如果你能提供哪怕是最细微的错误提示,我将不胜感激 - 如果这里没有足够的信息或不需要这些信息,请通知我,因为我还是新手,所以我很难尝试以准确的方式解释我的问题 - 谢谢你的理解:)
鉴于您的明显目的,您只需要一个简单的 LINQ 语句:
var rangemult = range/onsets.Max();
var sorted = onsets.Select(onset => onset*rangemult).ToList();
但是,这不会将结果四舍五入为整数。您可以在 Select
:
Math.Floor
或 Math.Round
或 Math.Ceil
var sorted = onsets.Select(onset => Math.Round(onset*rangemult)).ToList();