Domanda

Se avessi voluto per ridurre l'ampiezza di un file WAV del 25%, vorrei scrivere qualcosa di simile:

for (int i = 0; i < data.Length; i++)
{
    data[i] *= 0.75;
}

Un sacco di articoli che ho letto sulle tecniche audio, tuttavia, discutere l'ampiezza in termini di decibel. Capisco la natura logaritmica delle unità di decibel in linea di principio, ma non tanto in termini di codice vero e proprio.

La mia domanda è: se avessi voluto attenuare il volume di un file WAV, diciamo, 20 decibel, come farei questo nel codice come il mio precedente esempio

?

Aggiorna : formula (in base alla risposta di Nils Pipenbrinck) per attenuare per un determinato numero di decibel (inserito come un numero positivo per esempio 10, 20, ecc.):

public void AttenuateAudio(float[] data, int decibels)
{
    float gain = (float)Math.Pow(10, (double)-decibels / 20.0);
    for (int i = 0; i < data.Length; i++)
    {
        data[i] *= gain;
    }
}

Quindi, se voglio per attenuare da 20 decibel, il fattore di guadagno è 0,1 .

È stato utile?

Soluzione

Penso che si desidera convertire da decibel da guadagnare.

Le equazioni per l'audio sono:

decibel per ottenere:

  gain = 10 ^ (attenuation in db / 20)

o in C:

  gain = powf(10, attenuation / 20.0f);

Le equazioni di convertire da guadagno per db sono:

  attenuation_in_db = 20 * log10 (gain)

Altri suggerimenti

Se si vuole solo un po 'di adusto audio, ho avuto buoni risultati con la normalizzare pacchetto da nongnu.org. Se si vuole studiare come è fatto, il codice sorgente è liberamente disponibile. Ho usato anche wavnorm , la cui home page sembra essere fuori al momento.

Una cosa da considerare: i file WAV hanno molti formati differenti. Il codice funziona sopra solo per WAVE_FORMAT_FLOAT. Se hai a che fare con i file PCM, quindi i campioni stanno per essere 8, 16, 24 o 32 numeri interi bit (8 bit PCM utilizza numeri interi senza segno da 0..255, 24 bit PCM può essere imballato o non imballato (imballato == 3 valori di byte imballato accanto all'altro valori di byte, sfusi == 3 in un pacchetto 4 byte).

E poi c'è la questione di codifiche alternative - Ad esempio in Win7, tutti i suoni di Windows sono in realtà i file MP3 in un contenitore WAV

.

Non è purtroppo così semplice come sembra: (

.

Ops ho capito male la domanda ... È possibile vedere i miei implementazioni pitone di conversione da dB a un galleggiante (che si può usare come un moltiplicatore sulla ampiezza, come si mostra in alto) e viceversa

https://github.com/jiaaro/pydub/blob/ master / pydub / utils.py

In poche parole si tratta di:

10 ^ (db_gain / 10)

in modo da ridurre il volume di 6 dB sarà necessario moltiplicare l'ampiezza di ciascun campione:

10 ^ (-6 / 10)  ==  10 ^ (-0.6)  ==  0.2512
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top