Pregunta

Quiero aumentar un volumen de buffer con los datos de voz. El punto es que estoy usando DirectSound y que tiene una primaria y una secundaria memoria intermedia - todas las corrientes de mezcla se realiza a mano. En un chat de voz a todos los participantes pueden tener niveles de volumen independientes. I multiplicar cada flujo de datos por un valor (ganancia) y la suma a una memoria intermedia. Todo funciona bien, pero cuando trato de los datos se multiplican por un mayor valor que 1.0f - Oigo algunos recortes o qué.

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

Probablemente debería modificar la ganancia de alguna otra manera? O simplemente utilizar otro algoritmo de post-procesamiento?

ACTUALIZACIÓN: Wow, me acaba de descubrir lo interesante! He vertido de audio antes de aumentar el volumen y justo después de eso.

Aquí está la foto audio recortado

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 la muestra. Pero no puedo entender por qué? Mi samplebuffer es BYTE pero acceder a ella sólo a través de puntero corto. Está firmado, pero el recorte sucede incluso cuando * ptr es de unos 15-20 mil.

¿Fue útil?

Solución

Para cada muestra - convierte a un cierto tipo de datos mayor - si usted tiene 16 muestras bits firmado, encajan originalmente en CORTO - extraerlo de la corriente, y luego echó a locales doble, luego se multiplica, a continuación, CLIP, entonces fundido a SHORT.

Se debe trabajar de esa manera ...

Incluso puede proporcionar la muestra 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' la condición de recorte en 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 una EDITAR más:

Si usted tiene varias voces - en primer lugar poner a todos a doble - luego ganar cada uno - a continuación, añadirlos -. Y el clip como el último paso

Uno más EDITAR (+ 1s me están inspirando):

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

number of shorts = number of samples * 2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top