salida raw que muestreo formato flujo audio pcm

audio - raw - Cómo cambiar el volumen de una secuencia de datos PCM(experimento fallido)



raw audio (1)

Su 4to intento es definitivamente el enfoque correcto. Suponiendo que su rango de muestra se centra alrededor de 0, multiplicar cada muestra por otro valor es cómo puede cambiar el volumen o la ganancia de una señal.

Sin embargo, en este caso, supongo que algo gracioso sucede detrás de las escenas cuando estás multiplicando un int por un float y volviendo a int. Es difícil de decir sin saber qué idioma está usando, pero eso podría ser lo que está causando el problema.

Resuelto

Mi código nunca se utilizó antes para procesar valores firmados y, como tal, bytes -> conversión corta manejaba incorrectamente el bit de signo. Hacer eso resolvió adecuadamente el problema.

La pregunta era ...

Estoy tratando de cambiar el volumen de una secuencia de datos PCM. Puedo extraer datos de un solo canal de un archivo estéreo, hacer varios efectos experimentales tontos con las muestras salteándolos / duplicándolos / insertando ceros / etc, pero parece que no puedo encontrar la forma de modificar los valores de muestra reales de ninguna manera y obtener una salida sensible

Mis intentos son realmente simples: http://i.imgur.com/FZ1BP.png

  1. fuente de datos de audio
  2. valores - 10000
  3. valores + 10000
  4. valores * 0.9
  5. valores * 1.1

(value = -value funciona bien - invierte la onda y suena igual)

El código para hacer esto es igualmente simple (E / S usa valores sin signo en el rango 0-65535) <- ese era el problema, leyendo los valores correctamente firmados resolvió el problema :

// NOTE: INVALID CODE int sample = ...read unsigned 16 bit value from a stream... sample -= 32768; sample = (int)(sample * 0.9f); sample += 32768; ...write unsigned 16 bit value to a stream... // NOTE: VALID CODE int sample = ...read *signed* 16 bit value from a stream... sample = (int)(sample * 0.9f); ...write 16 bit value to a stream...

Estoy tratando de hacer que la muestra sea más silenciosa. Me imagino que reducir la amplitud (muestra * 0.9) daría como resultado un archivo más silencioso, pero tanto 4. como 5. anteriores son claramente inválidos. Hay una pregunta similar en SO donde MusiGenesis dice que obtuvo los resultados correctos con el tipo de código ''sample * = 0.75'' (sí, experimenté con otros valores además de 0.9 y 1.1).

La pregunta es: ¿estoy haciendo algo estúpido o la idea de multiplicarme es un error constante? Me gustaría que el resultado final sea algo como esto: http://i.imgur.com/qUL10.png