以一定间隔从WAV文件中读取幅度数据

时间:2014-06-29 13:46:44

标签: c# wav amplitude

所以我试图读取.wav文件的幅度数据,以便稍后在DFT中使用它,我使用此代码获取C#中的幅度数据并将其放入.txt文件中

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NAudio.Wave;

namespace SoundToAmplitudes
{
    class Program
    {
        private static int Main(string[] args)
        {
#if DEBUG
            Console.WriteLine(String.Join(", ", args));
            args = new[] { @"C:\Users\s550c\Documents\visual studio 2010\Projects\DFT\DFT\newrecord.wav" };
#endif
            return Cli(args);
        }

        static int Cli(string[] args)
        {
            System.IO.StreamWriter file = new System.IO.StreamWriter("d:\\test6.txt");
            string fileName = args[0];
            var soundFile = new FileInfo(fileName);
            foreach (float s in AmplitudesFromFile(soundFile))
            {
                Console.WriteLine(s);

                file.WriteLine(s);


            }
            file.Close();
            //Console.WriteLine();
#if DEBUG
            Console.Read();
#endif
            return 0;
        }

        public static IEnumerable<float> AmplitudesFromFile(FileInfo soundFile)
        {
            var reader = new AudioFileReader(soundFile.FullName);
            int count = 4096; // arbitrary
            float[] buffer = new float[count];
            int offset = 0;
            int numRead = 0;
            while ((numRead = reader.Read(buffer, offset, count)) > 0)
            {
                foreach (float amp in buffer.Take(numRead))
                {
                    yield return amp;
                }
            }
        }
    }
}

该程序为我提供了一个长达1秒的声音文件数据列表(确切地说是145920数据),所以我的问题是:

  1. 每个数据之间的时间间隔是多少? (比如1 ^ -10秒或smt?),我怎么知道呢?

  2. 如果我想自己设置每个数据之间的间隔,我应该如何更改代码?

1 个答案:

答案 0 :(得分:1)

回答问题1:数据的间隔由采样率决定。这可以通过reader.WaveFormat.SampleRate访问。这是每秒的样本数,因此样本之间的时间是1 / SampleRate。

对于问题2:我不熟悉NAudio所以我不知道它是否有任何功能,但你可以跳过样本只获得你想要的样本。