5

Does anyone know a way to get the mean amplitude of a .wav file using C# (even if it means calling an outside command line program and parsing the output)? Thanks!

Matthew Groves
  • 25,181
  • 9
  • 71
  • 121
BarrettJ
  • 3,431
  • 2
  • 29
  • 26

3 Answers3

3

The NAudio library for .NET sounds like your best bet. It allows access to the waveform of an audio file, which can loop over to calculate the value of the mean ampltiude.

Noldorin
  • 144,213
  • 56
  • 264
  • 302
3

Here is a snip that reads in a stereo wav and puts the data in two arrays. It's untested because I had to remove some code (converting to mono and calculate a moving average)

    /// <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
    }
Nifle
  • 11,745
  • 10
  • 75
  • 100
  • If the wav file is mono, would I be able to just comment out the sRight[x] = (short)(fa[s + 3] * 0x100 + fa[s + 2]); line and change s = s + 4 to s = s +2? I'm not very familiar with the wav format. Thanks! – BarrettJ Jun 30 '09 at 18:28
  • Not me either but I think you could just skip sRight. – Nifle Jun 30 '09 at 20:00
  • 2
    Making the changes I listed above and declaring sLeft as "var sLeft = new short[fa.Length / 2];" does indeed work for mono files. – BarrettJ Jul 02 '09 at 14:21
1

Normally the root-mean-squared method is used to calculate the "mean" amplitude of sin(x)-like signals.

Esteban Araya
  • 29,284
  • 24
  • 107
  • 141
  • I think the OP is asking more in relation to the practical aspect of the problem. Though indeed, he will want to calculate the RMS value. – Noldorin Jun 30 '09 at 15:11
  • Thank you for this info as I wasn't aware of this and it did indeed help a lot. – BarrettJ Jul 02 '09 at 14:21