2009-06-30 20 views
5

Quelqu'un sait-il un moyen d'obtenir l'amplitude moyenne d'un fichier .wav en utilisant C# (même si cela signifie appeler un programme de ligne de commande à l'extérieur et l'analyse syntaxique de la sortie)? Merci!amplitude moyenne d'un .wav en C#

+0

oublié de mentionner que le .wav est mono, si cela rend la situation plus facile/différente. – BarrettJ

Répondre

3

Voici un snip qui lit dans un wav stéréo et met les données dans deux tableaux. Il est non testé parce que je devais retirer un peu de code (conversion en mono et calculer une moyenne 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

Si le fichier wav est mono, serais-je capable de commenter le sRight [x] = (court) (fa [s + 3] * 0x100 + fa [s + 2]); ligne et changez s = s + 4 à s = ​​s +2? Je ne suis pas très familier avec le format wav. Merci! – BarrettJ

+0

Pas moi non plus mais je pense que vous pourriez juste sauter sRight. – Nifle

+2

Faire les changements que j'énumérés ci-dessus et en déclarant sLeft comme "var = new sLeft court [fa.Length/2];" fonctionne en effet pour les fichiers mono. – BarrettJ

1

Normalement, la méthode root-mean-squared est utilisée pour calculer la « moyenne » amplitude de sin (x) des signaux -comme.

+0

Je pense que le PO demande plus en ce qui concerne l'aspect pratique du problème. Bien que, en effet, il voudra calculer la valeur RMS. – Noldorin

+0

Merci pour cette info car je n'étais pas au courant de cela et cela m'a vraiment beaucoup aidé. – BarrettJ

3

La bibliothèque NAudio pour .NET sonne comme votre meilleur pari. Il permet d'accéder à la forme d'onde d'un fichier audio, qui peut faire une boucle pour calculer la valeur de l'amplitude moyenne.