2009-06-30 7 views
5

Kennt jemand eine Möglichkeit, die durchschnittliche Amplitude einer .wav-Datei mit C# zu erhalten (selbst wenn dies bedeutet, dass ein externes Befehlszeilenprogramm aufgerufen und die Ausgabe analysiert wird)? Vielen Dank!Mittlere Amplitude einer .wav in C#

+0

zu erwähnen vergessen, dass die .wav-mono ist, wenn, dass die Situation nicht leichter/von anderen unterscheidet. – BarrettJ

Antwort

3

Hier ist ein Snip, der ein Stereo-Wav einliest und die Daten in zwei Arrays ablegt. Es ist nicht getestet, weil ich einige Codes zu entfernen hatte (Umwandlung einen gleitenden Durchschnitt auf Mono und berechnet)

/// <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

Wenn die WAV-Datei mono ist, könnte ich einfach sRight [x] = (kurz) auskommentieren (fa [s + 3] * 0x100 + fa [s + 2]); Linie und ändern s = s + 4 bis s = s +2? Ich bin nicht sehr vertraut mit dem WAV-Format. Vielen Dank! – BarrettJ

+0

Ich auch nicht, aber ich denke, du könntest sRight einfach überspringen. – Nifle

+2

Nehmen Sie die oben aufgeführten Änderungen vor und deklarieren Sie sLeft als "var sLeft = new short [fa.Length/2];" funktioniert in der Tat für Mono-Dateien. – BarrettJ

1

Normalerweise wird die root-mean-squared Methode verwendet, um die "mittlere" Amplitude von sin (x) -ähnlichen Signalen zu berechnen.

+0

Ich denke, das OP fragt mehr nach dem praktischen Aspekt des Problems. Obwohl er tatsächlich den RMS-Wert berechnen möchte. – Noldorin

+0

Danke für diese Info, da ich mir dessen nicht bewusst war und es tatsächlich sehr geholfen hat. – BarrettJ

3

Die NAudio-Bibliothek für .NET klingt wie Ihre beste Wette. Es ermöglicht den Zugriff auf die Wellenform einer Audiodatei, die zur Berechnung des Werts der mittleren Amplitude durchlaufen werden kann.