2017-04-02 35 views
0

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

+1

该技术使用是'downsampling'。 – paulvs

回答

1

您需要通过选择均匀间隔的采样重新采样数组。这里是一个小的通用程序,做的是:

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) 
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
+2

值得指出的是,特别是由于OP正在处理数字音频,因此如果不首先应用适当的滤波器(例如低通滤波器)而直接进行下采样可能会导致混叠(直接下采样将无法实现[Nyquist-Shannon采样定理] ://en.wikipedia.org/wiki/Nyquist-Shannon_sampling_theorem))。 – dfri

+1

虽然在这种情况下,他不再真正处理音频,因为它已经被下采样到10hz采样率。 –