Domanda

Ho creato due file wave utilizzando Audacity. Entrambi hanno frequenza di campionamento 44100Hz, campioni galleggiante 32 bit, sono stati salvati come WAV (Microsoft) a 16 bit con segno e contiene 1s di silenzio (secondo Audacity). La differenza è che un file contiene un canale, mentre gli altri hanno due (stereo). Durante la lettura del file di un canale ho ottenuto fotogrammi come questo:

0x00 0x00  
...  ...  

Proprio come previsto, ma quando si legge il secondo file che ho ottenuto:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

Questo sembra essere un pattern casuale per me. Ha qualcosa a che fare con il modo in cui i canali vengono memorizzati all'interno del file wave? Non dovrebbe essere qualcosa di simile:

0x00 0x00 0x00 0x00  
...  ...  ...  ...  

PS:. Ho pitone utilizzata incorporato modulo 'ondata' di leggere i file

È stato utile?

Soluzione

Il segnale di livello molto basso dove era atteso silenzio, può essere causato da dither usato nella conversione da 32 bit a 16 bit.

Altri suggerimenti

I dati non è casuale

Guardando la cosa mi sembra di vedere 2 valori int per riga, ogni 2 byte little-endian:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

Decodifica come:

 0  0
 1 -1
 0  0
 0  1
-1  1
-2  3

Quindi, vedete quelli molto vicino a 0 numeri (silenzio quasi), sembra come jitter, come altri hanno suggerito.

Da quello che mi ricordo i canali dovrebbero essere alternati, in modo da 1 secondo di 44.1 kHz sarà un flusso di 88.200 k campioni, alternando destra e sinistra o qualsiasi altra cosa le specifiche dice.

Anche Audacity non dovrebbe ottenere float -> int sbagliato di conversione, solo il modo altro intorno. Provare ad avviare con i campioni interi, invece di punto flotatng forse. O avere un canale ad un valore noto (cioè Ox8f8f) e l'altra 0, che potrebbe essere più facile capire.

Codice eliminati e post prev.

Il silenzio: il silenzio "reale" deve essere pari a zero. In caso contrario, è spesso chiamato il silenzio "stanza", un piccolo rumore che è presente in tutto il mondo se non si utilizza un noise gate. (registrazione) Il suo solo un'idea: si ricorda che l'uso di valori con segno causerà 1 bit da utilizzare per firmato il marcatore / unsigned. Forse (non so) questo è ciò che si vede dopo la conversione in un file wave firmato con audacia. Mi dispiace ma non ho il tempo per testare questo.

I file Wave: Io non so quanto sai di soundfiles, ma: Se si desidera solo aggiungere silenzio provare in questo modo: Ogni campione è di dimensioni X bit: quindi è necessario X / 8 byte per un campione. Sai il campionamento tasso così appena è possibile copiare la matrice originale di byte prima in uno dei dimensioni (silence_length_in_samples bytes_per_frame) + (originale) + (silence_length_in_samples bytes_per_frame) e solo scrivere di nuovo in un file audio utilizzando gli strumenti di pitone, che mi auguro possa fare questo.

2 Canali: I byte prime sono organizzati in: [sample1 (channel1_bytes, channel2bytes)] [Sample2 (channel1_bytes, channel2_bytes) .... Spero sia chiaro quello che voglio dire:)

Si può vedere ciò che quei numeri sono con questo codice:

import struct
struct.unpack("f", struct.pack("I", 0xfeff0300))
(-1.6948435790786458e+38,)

Tutti sembrano essere molto piccolo, forse silenziosa, i numeri. Ho generato il silenzio e salvato come un punto di WAV mobile a 32 bit e non ho avuto piccoli numeri. Il mio file conteneva zeri, escludendo l'intestazione.

0,2 secondi di silenzio, 2 canali dati in virgola mobile può essere generato in questo modo:

import array
silence = array.array("f", [0] * int(44100 * 2 * 0.2))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top