2016-07-17 40 views
1

Ich versuche mein Mikrofon-Audio wieder runter zu spielen (für den Transfer). Aber nach dem Prozess ist das Audio ein bisschen kaputt (Shuttering). Sie können es selbst versuchen, wenn Sie ein Mikrofon haben:Audio-Shuttering nach dem Down- und Upsampling

FIDDLE:https://jsfiddle.net/q4yjfxqv/10/ (21.07.16 aktualisiert)

Sie hören die Schalung mehr auf höhere Frequenzen.

I Downsampling durch nur die Hälfte des Arrays Entfernen

function newDownSample(data) { 
    var retBuffer = []; 
    for(var i=0;i<data.length;i++) { 
    if(i%2==0) 
    retBuffer.push(data[i]) 
    } 
    return retBuffer; 
}; 

Und upsampling (liniar)

function newUpSample(data) { 
    var retBuffer = []; 
    for(var i=0;i<data.length;i++) { 
    retBuffer.push(data[i]) 
    if(i<data.length-1) 
     retBuffer.push((data[i]+data[i+1])/2); 
    else 
     retBuffer.push(data[i]); 
    } 
    return retBuffer; 
}; 

I versucht, andere Interpolationsmethoden wie liniar, kubische und lanczos Form here sowie ... mit dem gleichen Shutter-Effekt.

Der Verschluss ist immer an der Kante aus dem Brocken passieren. Sie können dies hören, indem Sie die Chunk-Größe von 1024 bis 4096 im Beispiel chancieren (es wird weniger passieren).

Aber warum? Jeder kann das erklären und lösen?

Jeder Hinweis wird geschätzt :)

Antwort

0

Das Problem mit dem Code für die Interpolation ist, dass Sie nicht wissen, die erster Abtastwert des nächsten Blocks und kann daher den letzten Abtastwert des aktuellen Blocks nicht richtig interpolieren.

Um dies zu umgehen, müssen Sie den letzten Abtastwert aus einem Block speichern, um den ersten interpolierten Abtastwert für den nächsten Block zu berechnen.

https://jsfiddle.net/hhb240ms/1/

usSample[0] = (lastSample + data[0])/2; 
usSample[1] = data[0]; 
for(var i=1;i<512;i++) { 
    usSample[2*i] = (data[i] + data[i-1])/2; 
    usSample[2*i+1] = data[i] 
} 
lastSample = data[data.length-1]; 
+0

sehr nett :) Ich mag! – Cracker0dks

0

Ich bin kein Experte für Audio-Programmierung.

Was ich versuche, wenn ich seltsame Ergebnisse (mit allgemeinen Programmierproblemen) bekam, ist die Parameter des Algorithmus zu ändern und es zu den Grundlagen zurückzubringen.

Was passiert, wenn Sie nicht Downsample?

Audio reagiert sehr empfindlich auf kleinste Fehler. Was ist, wenn der Puffer nicht groß genug ist oder wenn (mit dem Hauptthread) die Verarbeitungsblöcke Sounds abspielen.

Machst du eine andere Verarbeitung als modulierend auf diesem Thread? Was ist mit einem anderen (HTML5) Browser? Momentan kann ich mir keine andere Lösung oder Hinweise vorstellen.

Viel Glück, ich hoffe, das hilft. Bitte posten Sie die Lösung, dies wird auch anderen Programmierern helfen.

+0

hey, danke für die respones ... habe ich versucht, so weit viel. Sie können resample an der Geige umschalten und überprüfen, ob es gut funktioniert. Firefox und Chrome sind (zumindest) kaputt ... Ich werde morgen mehr Computer testen. – Cracker0dks

+0

Probieren Sie diese ..https: //jsfiddle.net/ck3sgan9/9/ ist upscaling notwendig? Da Sie immer Qualität verlieren werden, ist dies eine Arbeit (nicht Upsampling), aber es funktioniert. und ich höre keinen schweren Audioqualitätsverlust. Dieser Fidle verwendet nur Downsampling. – Zezura

+0

WoW danke. Ich weiß nicht, wie das möglich ist ... ist es besser, den gleichen Wert zweimal zu verwenden als zu interpolieren? – Cracker0dks

0

Je nach Betriebssystem und Computer, auf dem Sie arbeiten, möchten Sie möglicherweise die in creatScriptProcessor angegebene Puffergröße erhöhen. Mit der Größe, die Sie haben, höre ich Artefakte, aber wenn ich die Größe auf 16384 vergrößere, höre ich die Artefakte nicht mehr. (Aber jetzt bekomme ich eine ziemlich lange Latenz, bevor ich etwas höre, wie von der großen Puffergröße erwartet).

+0

Wenn ich Chunk-Größe ändere, nur die Dauer zwischen den shuts spreizte – Cracker0dks

0

Wenn i = (data.length-1), erhalten Sie eine Null für Daten [i + 1] - so wird das Upsampling wahrscheinlich die letzte Probe mit Nullmittelung?

(Dies ist nicht groß Downsampling - da es zuerst nicht Bandbreite-ConTrain tut -. Aber ich erwarte, dass wusste)

+0

yeah Ich habe bereits diese data.length-1 Fehler gefunden, aber immer noch shuttering. Ich habe bandwidth contrain für dieses Beispiel entfernt, weil es nicht seine Schuld ist. – Cracker0dks

+0

Wirklich? Ich höre keine Audioprobleme in der überarbeiteten Fiddle auf meinem Macbook oder Desktop. Vielleicht liegt es daran, dass die Maschine, auf der Sie sie ausführen, nicht in der Lage ist, mit den Audioprozess-Ereignissen Schritt zu halten? (Obwohl ich denken würde, dass das seltsam war.) Ihre dynamische Zuweisung und array.push() ist wahrscheinlich ineffizient; Ich habe eine hardcodierte Version unter https://jsfiddle.net/12ubug1o/ geschrieben. Sehen Sie, ob es das gleiche Verhalten zeigt. – cwilso

+0

Sie können auch die Echokompensation deaktivieren - a la https://jsfiddle.net/12ubug1o/1/. – cwilso