如何重新采样 wav 文件

发布于 2024-12-14 00:49:33 字数 254 浏览 5 评论 0原文

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

  • Channels: 1
  • SamplesPerSecond: 8000
  • BitsPerSample: 16

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

  • Channels: 1
  • SamplesPerSecond: 22050
  • BitsPerSample: 16

Currently I'm recording an audio signal with following specs:

  • Channels: 1
  • SamplesPerSecond: 8000
  • BitsPerSample: 16

How can I convert this .wav-file to eg following specs (pure c# is preferred):

  • Channels: 1
  • SamplesPerSecond: 22050
  • BitsPerSample: 16

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

固执像三岁 2024-12-21 00:49:33

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

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

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

另请参阅:

Windows API (one of) to resample audio is Audio Resampler DSP. This transform class is pretty straightforward to set up input and output types, then push input data and pull output.

Another task you would possible deal additionally with is reading from file and writing into a new file (you did not specify if it is actually needed in your original description though).

You might also want to use third party libraries like NAudio.

See also:

眼趣 2024-12-21 00:49:33

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

按照请求的示例源进行重采样< /a>

try Naudio - it is a free + opensource .NET library offering several things including the ability to resample AFAIK.

As requested sample source for resampling

清泪尽 2024-12-21 00:49:33

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;
    }

AS3 function for resampling. You can easy change to convert this code to 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;
    }
峩卟喜欢 2024-12-21 00:49:33

尝试下面的代码 C# 将音频从 8khz 重新采样到 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();
}

Try code below from 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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文