2013-06-04 16 views
8

Otrzymuję przeplatane 16-bitowe próbki PCM przez przewód. Każda próbka jest podpisana:PCM Web Audio Api JavaScript - Otrzymuję zniekształcone dźwięki

Przeczytałem to jako tablicę Int16bit, możemy nazwać to ALL_DATA. Zatem każdy z wpisów tablicy jest próbką 16-bitową.

Ponieważ jest on przeplatany, rozpakowuję go na 2 kanały R-L-R-L Kończę z 2 (16-bitowymi) tablicami o połowę mniejszymi niż tablica ALL_DATA.

Później przejrzałem każdą próbkę i normalizowałem ją do Float32Array, ponieważ to właśnie wykorzystuje interfejs web audio API .

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

Czy to jest właściwy sposób na zrobienie tego.

Dostaję zniekształcone dźwięki. Możesz powiedzieć, co się dzieje. Dosłownie, jeśli słuchasz gitary klasycznej, brzmi to jak elektryczna z dystorsją.

argumentów sake ja odkładając przykładowy kod, ale kod ten obsługuje

MONO SOUND, aby przykład prostsze, więc nie trzeba go przeplatać także

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; 

       }; 

Wszelkie sugestie to może powodować zakłócony dźwięk. Napisałem dane pcm, zanim wyślę je po stronie serwera, aby plik był dobry, a dźwięk jest doskonały.

+0

Twój post w końcu mi audio pracy ... Dzięki za komentarz mnóstwo swoje wysiłki, to podjąłem dźwięku w pobliżu krystalicznie czyste teraz :) – ole

+0

Tu wspomnieć, że użyłeś dźwięk mono, aby go prosty. Próbuję to zrobić za pomocą dźwięku stereo. Czy wiesz jak to zrobić? –

Odpowiedz

17

Zamiast mówić

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

spróbować

var normalizedSample= sample/32768; 

obliczeniach, jak obecnie napisane odwróci negatywne części swojego przebiegu, w sposób podobny do prostownika pełnej fali (twoje próbki będą zawsze liczbami dodatnimi).

enter image description here

+0

Krótko mówiąc, jestem idiotą. :) Nie wiem, dlaczego to zrobiłem. Dziękuję bardzo. Czasami najprostsze rzeczy wracają i mnie prześladują. Gdybym mógł, dałbym dodatkowy punkt tej odpowiedzi dla wykresu. –

Powiązane problemy