2015-05-22 18 views
5

sto caricando un wav con il metodo wavefile.read SciPy(), che mi dà la frequenza di campionamento e l'AudiodataStereo a Mono wav in Python

So che i dati questo audio stereo se viene stoccato come un multi-dimensionale serie come ad esempio

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

sto quindi utilizzando questo metodo per creare una nuova serie di dati audio mono prendendo (destra + sinistra)/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') 

e poi scrivo questo per file usando

wavfile.write(newfilename, sr, newaudiodata) 

Questo sta producendo un file wav Mono, ma il suono è sporco e ha clickd ecc tutto

quello che sto facendo di sbagliato?

+0

Elettori di chiusura: non si trattava di un errore tipografico, si trattava di un errore matematico effettivo che coinvolgeva l'overflow e di come prevenirlo. Dovrebbe rimanere aperto. – GreenAsJade

risposta

4

In primo luogo, qual è il tipo di dati di audiodata? Presumo che si tratti di un formato intero a larghezza fissa e quindi si ottiene un overflow. Se si converte in un formato in virgola mobile prima della lavorazione, che funzionerà bene:

audiodata = audiodata.astype(float) 

In secondo luogo, non scrivere il vostro elemento codice Python per elemento; vectorize esso:

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

o meglio ancora

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

Questo sarà notevolmente più veloce rispetto al ciclo elemento per elemento hai scritto.

2

risulta, tutto quello che dovevo cambiare era

(destra + sinistra)/2

a

(destra/2) + (sinistra/2)