2010-11-29 14 views
6

Ich möchte eine Lautstärke für Puffer mit Sprachdaten erhöhen. Der Punkt ist, ich benutze DirectSound und ich habe einen primären und einen sekundären Puffer - alle Ströme werden von Hand gemischt. In einem Sprachchat können alle Teilnehmer unabhängige Lautstärkepegel haben. Ich multipliziere jeden Datenstrom mit einem Wert (Verstärkung) und summiere ihn zu einem Puffer. Alles funktioniert gut, aber wenn ich versuche, Daten mit einem Wert größer als 1,0 f zu multiplizieren - höre ich etwas Clipping oder was?Ändern der Lautstärkeverstärkung am Audio-Sample-Puffer

Ich habe versucht, mit Audacity-Effekt-Kompressor, aber das hilft nicht, das seltsame Rauschen zu reduzieren.

Wahrscheinlich sollte ich Verstärkung auf eine andere Weise ändern? Oder verwenden Sie einfach einen anderen Post-Processing-Algorithmus?

UPDATE: Wow, ich habe gerade interessante Sache herausgefunden! Ich habe Audio ausgegeben, bevor ich die Lautstärke erhöht habe und direkt danach.

ist die pic Clipped audio

Sorry für die Qualität - ich denke, das ist, wie der Klang sollte erscheinen (ich habe rote Linie selbst gezeichnet). Sieht wirklich so aus, als würden Werte den Probendaten-Typ überschreiten. Aber ich kann nicht verstehen warum? Mein Sample-Puffer ist BYTE, aber ich greife nur über einen kurzen Zeiger darauf zu. Es ist signiert, aber Clipping passiert sogar, wenn * ptr etwa 15-20 Tausend ist.

+0

Was ist "irgendein Ausschnitt oder was" - überschreiten Ihre Werte tatsächlich die Grenzen für den Beispieldatentyp? und was meinst du mit "versucht mit Audacity Effekt-Kompressor"? Ist es auf dem abgeschnittenen Ausgang oder auf dem Ausgang vor dem Clipping? – lijie

+0

Das Beispiel ist 200ms Audio mit 22050Hz Abtastrate. 2 Bytes - kurz. Wenn ich dieses Beispiel mit 1.f multipliziere - das Originalvolumen - ist alles in Ordnung. Wenn ich mit einem Wert kleiner als 1 f multipliziere, wird die Lautstärke niedriger. Aber wenn ich es z. 1.3f - die Lautstärke wird höher, aber mit hässlichen Kratzern. Ich habe den DAC-Kompressor im gemischten Puffer (mit Clipping) verwendet. – Dalamber

+0

Hier ist meine Antwort mit etwas Code - es ist aus meinem Kopf, also erwarte nicht, dass es so funktioniert wie es ist. –

Antwort

7

Für jedes Sample - konvertieren Sie es in einen größeren Datentyp - wenn Sie 16 Bit signierte Samples haben, passen sie ursprünglich in SHORT - extrahieren Sie es aus dem Stream, dann auf lokales Double, multiplizieren, dann CLIP, dann Cast zurück zu KURZ.

Es muss so arbeiten ...

ich auch Beispielcode zur Verfügung stellen kann, wenn nötig.

EDIT:

Ihr Bild ist genau Hinweise darauf, dass Sie nicht zu größerem Typ vor der Multiplikation haben zu erweitern - man kann nicht ‚Capture‘ Clipping-Zustand auf SHORT, weil es automatisch umbrochen wird.

short* sampleBuffer; 
... 
short sample=*sampleBuffer; 
double dsample=(double)sample * gain; 
if (dsample>32767.0) {dsample=32767.0;} 
if (dsample<-32768.0) {dsample=-32768.0;} 
*sampleBuffer=(short)dsample; 
sampleBuffer++; 

Und noch eine EDIT:

, wenn Sie mehrere Stimmen haben - die erste Stelle setzen sie alle doppelt - dann jeden GAIN - dann sie hinzufügen - und CLIP sie als letzten Schritt.

Noch eine EDIT (+ 1s inspiriert mich):

Wenn Sie STEREO haben, wird gleiches Material auch funktionieren, nur alle Proben zählen x2 d

number of shorts=number of samples*2.

+0

Wow! Das ist nur eine super Antwort!Vielen Dank - ich werde diesen Ansatz morgen versuchen und als beantwortet markieren, wenn alles in Ordnung sein wird;) – Dalamber

+0

Wenn es nicht funktioniert, sprich, wir werden es schaffen! –

+0

Ja, es funktioniert! Ehrlich gesagt, es ist eine Art dummer Fehler, den ich gemacht habe: "(Daniel, vielen Dank für deine Hilfe! – Dalamber