2009-07-19 13 views
8

Se avessi voluto per ridurre l'ampiezza di un file WAV del 25%, vorrei scrivere qualcosa di simile:Come faccio ad attenuare un file WAV con un dato valore di decibel?

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 reale.

La mia domanda è: se volessi attenuare il volume di un file WAV, diciamo, 20 decibel, come dovrei farlo in codice come nell'esempio sopra riportato?

Aggiornamento: formula (in base alla risposta di Nils Pipenbrinck) per attenuare per un determinato numero di decibel (inserito come un numero ad esempio positiva 10, 20 etc.):

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 di decibel, il fattore di guadagno è .1.

+0

@sth: come ti permetti di modificare la mia domanda? Solo per quello, ti sto dando un casino di badge e una "k" dopo il tuo rappresentante. – MusiGenesis

+2

':)' – sth

risposta

11

Penso che tu voglia convertire da decibel a guadagno.

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) 
+0

Vuole guadagno di tensione o guadagno di potenza per la conversione? Non potrò mai ricordare. – Nosredna

+2

Penso che sia il guadagno di tensione. Nils sembra avere ragione. Fonte: http://www.sengpielaudio.com/calculator-gainloss.htm – Nosredna

+0

Grazie, Nils. Imparo sempre meglio da una buona formula di ogni altra cosa. – MusiGenesis

1

Se si ju s voglio adust audio, ho avuto buoni risultati con il pacchetto normalize da nongnu.org. Se vuoi studiare come è fatto, il codice sorgente è liberamente disponibile. Ho anche usato wavnorm, la cui home page sembra essere fuori al momento.

+0

Questo è in realtà per un sintetizzatore software, per normalizzare le note con tonalità diverse. Il pacchetto di normalizzazione nel tuo collegamento utilizza RMS, che non cambia in modo significativo in quanto varia il tono (non ho idea di cosa facciano wavnorm). Ho scoperto che attenuando il volume di una nota di circa 5 decibel (usando la funzione di Nils) per ottava sopra un pitch di base si ottiene un volume percepito costante su tutto il range di una scala. – MusiGenesis

1

Una cosa da considerare: i file .WAV hanno MOLTI formati diversi. Il codice sopra funziona solo per WAVE_FORMAT_FLOAT. Se hai a che fare con i file PCM, i tuoi campioni saranno interi a 8, 16, 24 o 32 bit (PCM a 8 bit utilizza interi non firmati da 0..255, PCM a 24 bit può essere compresso o decompresso (imballato == Valori di 3 byte compressi uno accanto all'altro, spacchettati == 3 valori di byte in un pacchetto di 4 byte)

E poi c'è il problema delle codifiche alternative - Per esempio in Win7, tutti i suoni di Windows sono in realtà file MP3 in un Contenitore WAV

Purtroppo non è così semplice come sembra :(.

+0

Spiacente, "File WAV" era solo una scorciatoia per dati audio campionati, genericamente. So tutto sui formati di file WAV e MP3, anche se devo dire che non ho mai incontrato file PCM a 24 bit o 32 bit in natura. – MusiGenesis

+0

Sto cercando di indovinare quale sarebbe lo scopo di un file WAV PCM decompresso a 24 bit. Pensato per registrare l'output da un mixer a 24 bit, direi? – MusiGenesis

+0

Ho appena finito di leggere una buona parte del tuo blog. Come programmatore audio, mi inchino davanti a te. :) – MusiGenesis

1

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 da:

10^(-6/10) == 10^(-0.6) == 0.2512 
Problemi correlati