【问题标题】:How can I resample wav file如何重新采样 wav 文件
【发布时间】:2011-11-03 13:13:05
【问题描述】:

目前我正在录制具有以下规格的音频信号:

  • 频道:1
  • SamplesPerSecond:8000
  • BitsPerSample:16

如何将此 .wav 文件转换为例如以下规格(首选纯 c#):

  • 频道:1
  • SamplesPerSecond:22050
  • BitsPerSample:16

【问题讨论】:

    标签: c# audio wav pcm


    【解决方案1】:

    用于重新采样音频的 Windows API(其中之一)是 Audio Resampler DSP。这个转换类非常简单地设置输入和输出类型,然后推送输入数据和拉取输出。

    您可能需要另外处理的另一项任务是从文件中读取并写入新文件(尽管您没有在原始描述中指定它是否真的需要)。

    您可能还想使用第三方库,例如 NAudio

    另见:

    【讨论】:

    • 演示 @stackoverflow.com/questions/3194184/… 看起来很有前途!
    • 太有趣了...Alvas.Audio 正在使用 MsgBox ...在网页上失败(即使有他们自己的示例 @alvas.net/alvas.audio,tips.aspx#tip24
    • 哈哈 ... 更有趣 ... Alvas.Audio 的 typeInitializer 正在使用 MsgBox ... 所以 ... 不 - 但谢谢!
    • 这就是为什么要小心使用第三方库的原因:)
    【解决方案2】:

    试试Naudio - 它是一个免费的 + 开源 .NET 库,提供多种功能,包括重新采样 AFAIK 的能力。

    As requested sample source for resampling

    【讨论】:

    • @AndreasNiedermair 添加了一个指向重新采样的示例的链接
    【解决方案3】:

    用于重采样的 AS3 函数。您可以轻松更改以将此代码转换为 C#:

        private function resampling(fromSampleRate:int, toSampleRate:int, quality:int = 10):void
        {
            var samples:Vector.<Number> = new Vector.<Number>;
    
            var srcLength:uint = this._samples.length;
            var destLength:uint = this._samples.length*toSampleRate/fromSampleRate;
            var dx:Number = srcLength/destLength;
    
            // fmax : nyqist half of destination sampleRate
            // fmax / fsr = 0.5;
            var fmaxDivSR:Number = 0.5;
            var r_g:Number = 2 * fmaxDivSR;
    
            // Quality is half the window width
            var wndWidth2:int = quality;
            var wndWidth:int = quality*2;
    
            var x:Number = 0;
            var i:uint, j:uint;
            var r_y:Number;
            var tau:int;
            var r_w:Number;
            var r_a:Number;
            var r_snc:Number;
            for (i=0;i<destLength;++i)
            {
                r_y = 0.0;
                for (tau=-wndWidth2;tau < wndWidth2;++tau)
                {
                    // input sample index
                    j = (int)(x+tau);
    
                    // Hann Window. Scale and calculate sinc
                    r_w = 0.5 - 0.5 * Math.cos(2*Math.PI*(0.5 + (j-x)/wndWidth));
                    r_a = 2*Math.PI*(j-x)*fmaxDivSR;
                    r_snc = 1.0;
                    if (r_a != 0)
                        r_snc = Math.sin(r_a)/r_a;
    
                    if ((j >= 0) && (j < srcLength))
                    {
                        r_y += r_g * r_w * r_snc * this._samples[j];
                    }
                }
                samples[i] = r_y;
                x += dx;
            }
    
            this._samples = samples.concat();
            samples.length = 0;
        }
    

    【讨论】:

    • 有趣的东西!只是为了确定:Vector.&lt;Number&gt; 等同于 int[2]?
    • 不,"Vector." 是 32 位浮点数的向量
    【解决方案4】:

    C# resample audio from 8khz to 44.1/48khz试试下面的代码

    static void Resample(string fileName)
    {
        IntPtr formatNew = AudioCompressionManager.GetPcmFormat(2, 16, 44100);
        WaveReader wr = new WaveReader(File.OpenRead(fileName));
        IntPtr format = wr.ReadFormat();
        byte[] data = wr.ReadData();
        wr.Close();
        //PCM 8000 Hz -> PCM 44100
        byte[] dataNew = AudioCompressionManager.Resample(format, data, formatNew);
        WaveWriter ww = new WaveWriter(File.Create(fileName + ".wav"),
            AudioCompressionManager.FormatBytes(formatNew));
        ww.WriteData(dataNew);
        ww.Close();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 2016-02-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多