如何将数组数组减少到具有给定长度和低信息丢失的数组

时间:2017-04-02 14:46:54

标签: ios objective-c arrays swift interpolation

我正在为iOS构建一个音频应用程序,我需要从麦克风中捕获音频并将其可视化。我每隔0.1秒使用AudioKit接收振幅数据(来自AKAmplitudeTracker)并将其存储到数组中。这样可以获得很好的精度,但这会导致600个值/分钟存储在数组中。我正在根据存储在此阵列中的数据构建波形图,并且无法使用数千个波形保持所需的外观。我正在寻找一种方法来减少数组中元素的数量,信息丢失率低到给定的特定数字,如256或512.我不熟悉这个领域的术语,所以任何帮助都是值得赞赏的。

1 个答案:

答案 0 :(得分:1)

您需要通过选择均匀间隔的样本来重新采样阵列。这是一个通用的例程:

=COUNTIF('Usernames and emails'!$A$5:$A$1450;$A7)>0

下采样示例:

func resample<T>(array: [T], toSize newSize: Int) -> [T] {
    let size = array.count
    return (0 ..< newSize).map { array[$0 * size / newSize] }
}
// Create array [0, 1, 2, ..., 98, 99, 100]    
let arr = (0...100).map { $0 }

// Downsample it to 15 items    
let sampled = resample(array: arr, toSize: 15)
print(sampled)

上例示例:

[0, 6, 13, 20, 26, 33, 40, 47, 53, 60, 67, 74, 80, 87, 94]
// Create array [0, 1, 2, 3, 4]
let arr2 = (0...4).map { $0 }

// Upsample it to 15 items
let sampled2 = resample(array: arr2, toSize: 15)
print(sampled2)