2013-07-03 37 views
1

我希望將波形文件解構爲小塊,以不同的順序重新組合它,然後將其寫入磁盤。 我似乎在重新編譯組件之後出現問題,因此現在我只是嘗試調試此部分,稍後再考慮其他問題。 基本上我讀取原稿的wav成2D numpy的陣列,將其分爲100塊存儲更小的2D numpy的陣列的列表內,然後垂直使用vstack堆疊這些陣列:構建一個wav文件並使用scipy將其寫入磁盤

import scipy.io.wavfile as sciwav 
import numpy 
[sr,stereo_data] = sciwav.read('filename') 
nparts = 100 
stereo_parts = list() 
part_length = len(stereo_data)/nparts 

for i in range(nparts): 
    start = i*part_length 
    end = (i+1)*part_length 
    stereo_parts.append(stereo_data[start:end]) 

new_data = numpy.array([0,0]) 
for i in range(nparts): 
    new_data = numpy.vstack([new_data, stereo_parts[i]]) 
sciwav.write('new_filename', sr, new_data) 

到目前爲止我證實NEW_DATA看起來類似於stereo_data,但有兩個例外: 1.它在開頭填充[0,0]。 2.因爲len(stereo_data)/ nparts沒有餘數沒有分割,所以它縮短了88個樣本。

當我試圖聽到由此產生的new_data eave文件時,我聽到的所有內容都是沉默,我認爲這沒什麼意義。

感謝您的幫助! omer

+0

'stereo_data'和'new_data'的形狀是什麼? – Jaime

回答

1

這很可能是dtype是不同的。當您在開始時生成零填充時,您沒有指定dtype,因此它們可能是np.int32。您的原始數據可能是np.uint8np.uint16,因此整個陣列被升級到np.int32,這不是數據的正確位深度。簡單地做:

new_data = numpy.array([0,0], dtype=stereo_data) 

我真的寧願做:

new_data = numpy.zeros((1, 2), dtype=stereo_data.dtype) 

你可以,順便說一下,精簡你的代碼相當多,並且擺脫了大量的for循環的:

sr, stereo_data = sciwav.read('filename') 
nparts = 100 
part_length = len(stereo_data) // nparts 

stereo_parts = numpy.split(stereo_data[:part_length*nparts], nparts) 

new_data = numpy.vstack([numpy.zeros((1, 2), dtype=stereo_data.dtype)] + 
         stereo_parts) 

sciwav.write('new_filename', sr, new_data) 
+0

就是這樣!非常感謝 :) –