2009-06-30 10 views
5

Qualcuno conosce un modo per ottenere l'ampiezza media di un file .wav usando C# (anche se ciò significa chiamare un programma da riga di comando esterno e analizzare l'output)? Grazie!Ampiezza media di un .wav in C#

+0

dimenticato di dire che il wav è mono, se questo fa la situazione più facile/diverso. – BarrettJ

risposta

3

Ecco uno snip che legge in un wav stereo e inserisce i dati in due array. E 'non provato perché ho dovuto togliere un po' di codice (la conversione in mono e calcolare una media mobile)

/// <summary> 
    /// Read in wav file and put into Left and right array 
    /// </summary> 
    /// <param name="fileName"></param> 
    private void ReadWavfiles(string fileName) 
    { 
     byte[] fa = File.ReadAllBytes(fileName); 

     int startByte = 0; 

     // look for data header 
     { 
      var x = 0; 
      while (x < fa.Length) 
      { 
       if (fa[x]  == 'd' && fa[x + 1] == 'a' && 
        fa[x + 2] == 't' && fa[x + 3] == 'a') 
       { 
        startByte = x + 8; 
        break; 
       } 
       x++; 
      } 
     } 

     // Split out channels from sample 
     var sLeft = new short[fa.Length/4]; 
     var sRight = new short[fa.Length/4]; 

     { 
      var x = 0; 
      var length = fa.Length; 
      for (int s = startByte; s < length; s = s + 4) 
      { 
       sLeft[x] = (short)(fa[s + 1] * 0x100 + fa[s]); 
       sRight[x] = (short)(fa[s + 3] * 0x100 + fa[s + 2]); 
       x++; 
      } 
     } 

     // do somthing with the wav data in sLeft and sRight 
    } 
+0

Se il file wav è mono, sarei in grado di commentare solo sRight [x] = (breve) (fa [s + 3] * 0x100 + fa [s + 2]); linea e cambia s = s + 4 a s = s +2? Non ho molta familiarità con il formato wav. Grazie! – BarrettJ

+0

Neanche io, ma penso che potresti semplicemente saltare sRight. – Nifle

+2

Apportare le modifiche che ho elencato sopra e dichiarare sLeft come "var sLeft = new short [fa.Length/2];" funziona davvero per i file mono. – BarrettJ

1

Normalmente il metodo root-mean-squared viene utilizzato per calcolare l'ampiezza "media" dei segnali sin (x) -like.

+0

Penso che il PO chieda di più in relazione all'aspetto pratico del problema. Sebbene in effetti, vorrà calcolare il valore RMS. – Noldorin

+0

Grazie per queste informazioni perché non ne ero a conoscenza e ha davvero aiutato molto. – BarrettJ

3

La libreria NAudio per .NET suona come la soluzione migliore. Consente l'accesso alla forma d'onda di un file audio, che può eseguire il looping per calcolare il valore dell'ampiezza media.