2010-11-29 6 views
6

Quiero aumentar un volumen en la memoria intermedia con datos de voz. El punto es que estoy usando DirectSound y tengo un buffer primario y uno secundario: todas las secuencias se mezclan a mano. En un chat de voz, todos los participantes pueden tener niveles de volumen independientes. Multiplico cada flujo de datos por un valor (ganancia) y lo sumo en un buffer. Todo funciona bien, pero cuando intento multiplicar los datos por un valor superior a 1.0f, escucho un recorte o qué.Modificar la ganancia de volumen en la memoria tampón de muestra de audio

He intentado usar el compresor de efectos Audacity, pero esto no ayuda a reducir el ruido extraño.

Probablemente debería modificar la ganancia de alguna otra manera? ¿O simplemente usa otro algoritmo de postprocesamiento?

ACTUALIZACIÓN: ¡Wow, acabo de enterarme de algo interesante! He descargado el audio antes de aumentar el volumen y justo después de eso.

Aquí es el pic Clipped audio

Lo siento por la calidad - Creo que así es como se supone que el sonido a aparecer (He dibujado la línea roja a mí mismo). Realmente parece que los valores exceden el tipo de datos de muestra. Pero no puedo entender ¿POR QUÉ? Mi samplebuffer es BYTE, pero solo accedo a él mediante un puntero corto. Está firmado pero el recorte ocurre incluso cuando * ptr es aproximadamente de 15 a 20 mil.

+0

¿Qué es "algo de recorte o qué"? ¿Sus valores realmente exceden los límites para el tipo de datos de muestra? y ¿qué quiere decir con "intenté usar el compresor de efecto Audacity"? ¿Está en la salida recortada o en la salida antes del recorte? – lijie

+0

La muestra es de audio de 200 ms con una frecuencia de muestreo de 22050 hz. 2 bytes - corto. Si multiplico esta muestra por 1.f - el volumen original - todo está bien. Si multiplico por un valor menor que 1.f, el volumen se vuelve más bajo. Pero si lo multiplico, p. Ej. 1.3f - el volumen se vuelve más alto pero con un ruido de scratch feo. Usé un compresor de efecto audacity en el buffer mixto (con recorte). – Dalamber

+0

Aquí está mi respuesta con un código: está fuera de sí, así que no esperes que funcione como está. –

Respuesta

7

Para cada muestra, conviértala a un tipo de datos más grande: si tiene muestras de 16 bits, originalmente se ajustan en CORTO, extraiga la secuencia, luego duplique a local, luego multiplique, luego CLIP, luego moldee volver a CORTO.

Se debe trabajar de esa manera ...

incluso puedo dar ejemplo de código si es necesario.

EDIT:

Su imagen es la evidencia exacta que no se expandió a un tipo más grande antes de la multiplicación - no se puede 'capturar' recorte condición a corto, ya que se ajuste automáticamente.

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++; 

Y uno más EDITAR:

si tiene varias voces - en primer lugar poner a todos a doble - luego ganar cada uno - a continuación, añadir ellos - y el clip como el último paso.

Una EDIT más (+ 1s me están inspirando):

Si tiene STEREO, misma materia funcionará también, simplemente contar todas las muestras x2 es decir

number of shorts=number of samples*2.

+0

¡Guau! ¡Esa es solo una súper respuesta!Muchas gracias. Probaré este enfoque mañana y marcaré como respondido si todo estará bien;) – Dalamber

+0

¡Si no funciona, habla, lo haremos funcionar! –

+0

¡Sí, funciona! Honestamente, es una especie de error estúpido que he hecho: '(Daniel, ¡muchas gracias por tu ayuda! – Dalamber

Cuestiones relacionadas