2013-09-05 11 views
10

ho questo codice:Scrittura del file wav in Python con wavfile.write da SciPy

import numpy as np 
import scipy.io.wavfile 
import math 

rate, data = scipy.io.wavfile.read('xenencounter_23.wav') 

data2 = [] 

for i in range(len(data)): 
    data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))]) 

data2 = np.asarray(data2) 

print data2 

scipy.io.wavfile.write('xenencounter_23sin3.wav',rate,data2) 

Questo stampa (troncato):

[[-2524 2728] 
[ -423 -2270] 
[ 2270 423] 
..., 
[-2524  0] 
[ 2524 -2728] 
[-2270 838]] 

Il file wav si apre e si svolge in Windows Media Player, quindi almeno è il formato corretto. Tuttavia, aprendolo con Audacity e osservando i singoli campioni, sono tutti 0 e, in modo concorde, il file non emette alcun suono.

Quello che non capisco è come quella matrice numpy sopra elencata diventa tutti 0. Dovrebbe essere inferiore al valore massimo per un campione (o superiore, se è negativo).

+0

cosa succede se lo ricarichi con scipy? sono zeri o i valori che hai salvato? –

+0

Restituisce la stessa cosa stampata prima della scrittura. – JVE999

+0

È possibile aggiungere un'istruzione 'print data' dopo la riga' rate, data = scipy.io.wavfile.read ('xenencounter_23.wav') '. Voglio vedere come sono fatti questi dati. –

risposta

11

Ho trovato che scipy.io.wavfile.write() scrive in un numero intero a 16 bit, che spiega le dimensioni dei file più grandi quando si tenta di utilizzare un numero intero a 32 bit (predefinito). Mentre io non riuscivo a trovare un modo per cambiare questo wavfile.write, ho trovato che cambiando:

data2 = np.asarray(data2) 

a

data2 = np.asarray(data2, dtype=np.int16) 

Potrei scrivere un file di lavoro.

+0

Ciò risolve anche il mio problema. Sarebbe bello per scipy a notare questo nei documenti però: S – TTT

0

Come si è scoperto stampando l'output in diversi punti e ri-salvando ciò che è stato originariamente caricato, la riga data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))]) è la fonte del problema.

Ho il sospetto che 3000 sia troppo grande di un'ampiezza. Prova 1.

+0

Ha fatto la stessa cosa. Penso che i valori di esempio tra -32768 e 32767 dovrebbero andare bene. – JVE999

+0

Prova 'data2.append ([int (data [i] [0]), [int (data [i] [1])]) - sfortunatamente devi continuare a eliminare le cose finché non trovi la funzione che rompe il tuo codice . –

+0

Quello ha fatto la stessa cosa. Capisco che i dati del file wave sono memorizzati come numero di complemento a due per ogni campione. Non so se questo farebbe la differenza. Non viene stampato come numero di complemento a due, quindi suppongo che la conversione sia in wavefile.scrivi – JVE999

1

Nella creazione di file wav tramite scipy.io.wavfile.write(), ho trovato che l'ampiezza è molto importante. se crei un'onda sinusoidale con l'ampiezza 150, suona come il silenzio quando viene riprodotto in VLC. se l'ampiezza è 100, suona come un'onda sinusoidale distorta, e se la si fa 80, inizia a suonare come un normale file.

Sicuramente bisogna fare attenzione all'ampiezza durante la creazione di file wave, ma non mi è chiaro in questo momento qual è il livello massimo prima che inizi a tagliare o scomparire.