2015-05-22 17 views
5

wczytuję się wav z scipy metoda wavefile.read(), która daje mi próbkowania i Audiodatastereo na mono wav w Pythonie

wiem, że dane tego dźwięku stereo, jeśli jest przechowywany jako wielowymiarowe tablica takich jak

audiodata[[left right] 
      [left right] 
      ... 
      [left right]] 

ja wtedy za pomocą tej metody, aby utworzyć nową tablicę mono danych audio poprzez (prawy + lewy)/2

def stereoToMono(audiodata) 
    newaudiodata = [] 

    for i in range(len(audiodata)): 
     d = (audiodata[i][0] + audiodata[i][1])/2 
     newaudiodata.append(d) 

    return np.array(newaudiodata, dtype='int16') 

a następnie piszę to do pliku przy użyciu

wavfile.write(newfilename, sr, newaudiodata) 

ta produkuje wav Mono, jednak dźwięk jest brudny i ma clickd itp całym

co robię źle?

+0

Bliscy wyborcy: nie był to błąd typograficzny, był to faktyczny błąd matematyczny polegający na przepełnieniu i zapobieganiu temu. Powinien pozostać otwarty. – GreenAsJade

Odpowiedz

4

pierwsze, jaki jest typ danych od audiodata? Zakładam, że jest to jakiś format liczbowy o stałej szerokości i dlatego dostajesz przepełnienie. Jeśli przekształcić go w formacie zmiennoprzecinkowym przed przetwarzaniem, to będzie działać prawidłowo:

audiodata = audiodata.astype(float) 

Po drugie, nie napisać elementu kodu Pythona przez elementu; wektorować go:

d = (audiodata[:,0] + audiodata[:,1])/2 

lub nawet lepiej

d = audiodata.sum(axis=1)/2 

to będzie znacznie szybciej niż pętli element po elemencie, który napisałeś.

2

okazuje, wszystko musiałem zmienić był

(prawy + lewy)/2

do

(prawy/2) + (lewo/2)