aumento de volumen en Modificar en tampón de muestra de audio
-
29-09-2019 - |
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
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.
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
.