2013-06-04 19 views
8

Ricevo campioni PCM a 16 bit interlacciati via cavo. Ogni campione è firmatoPCM Web Audio Api Javascript - Sto ricevendo suoni distorti

L'ho letto come array Int16bit, consente di chiamare questo ALL_DATA. Quindi ciascuna delle voci dell'array è un campione a 16 bit.

Poiché è interlacciato, lo estraggo in 2 canali R-L-R-L Finisco con 2 (16 bit) matrici della dimensione della matrice ALL_DATA.

Dopodiché analizzo ciascun campione e lo normalizzo in Float32Array perché è quello che utilizza l'API di audio Web .

var normalizedSample = (campione> 0)? sample/32768: sample/-32768;

È questo il modo giusto per farlo.

I suoni vengono distorti. Puoi dire cosa sta succedendo. Quindi, letteralmente, se ascolti la chitarra classica sembra che sia elettrico con distorsione.

Per amor di argomenti sto mettendo giù il codice di esempio, ma questo codice gestisce

MONO SOUND per rendere l'esempio più semplice, in modo che non devono interleave esso pure

var startTime = 0; 
    var fileReader = new FileReader(); 
    fileReader.onload = function (e) { 
         var data = new DataView(e.target.result); 

        var audio = new Int16Array(data.byteLength/Int16Array.BYTES_PER_ELEMENT); 
        var len = audio.length; 
        for (var jj = 0; jj < len; ++jj) { 
         audio[jj] = data.getInt16(jj * Int16Array.BYTES_PER_ELEMENT, true); 
        } 

        var right = new Float32Array(audio.length); 

        var channleCounter = 0; 
        for (var i = 0; i < audio.length;) { 
         var normalizedRight = (audio[i] > 0) ? audio[i]/32768 : audio[i]/-32768; 

         i = i + 1; 
         right[channleCounter] = normalizedRight; 

         channleCounter++; 
        } 






        var source = audioContext.createBufferSource(); 


        var audioBuffer = audioContext.createBuffer(1, right.length, 44100); 
        audioBuffer.getChannelData(0).set(right); 


        source.buffer = audioBuffer; 


        source.connect(audioContext.destination); 

        source.noteOn(startTime); 
        startTime += audioBuffer.duration; 

       }; 

Qualche suggerimento potrebbe essere la causa del suono distorto. Ho scritto i dati di pcm prima di inviarlo sul lato server a un file è buono e il suono è perfetto.

+0

Il tuo post mi ha fatto FINALMENTE far funzionare audio ... Grazie una tonnellata per la pubblicazione i vostri sforzi, ha fatto il mio audio vicino cristallino ora :) – ole

+0

Qui lei ha detto che si è utilizzato MONO suono per renderlo semplice. Sto provando a farlo con il suono stereo. sai come si fa? –

risposta

17

Invece di dire

var normalizedSample= (sample > 0) ? sample/32768 : sample/-32768; 

provare

var normalizedSample= sample/32768; 

il calcolo, come attualmente scritta, sarà invertire le parti negative della forma d'onda, in modo simile a un raddrizzatore ad onda intera (i tuoi campioni saranno sempre numeri positivi).

enter image description here

+0

Per farla breve, sono un idiota. :) Non so perché l'ho fatto. Grazie mille. A volte le cose più semplici tornano e mi perseguitano. Se potessi dare un punto in più a questa risposta per il grafico. –