2017-04-02 60 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採樣率。 –