我该如何重新采样wav文件

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

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

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

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

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

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

您可能还想使用像NAudio这样的第三方库。

也可以看看:

  • C#重新采样音频从8khz到44.1 / 48khz
  • C#中的音频DSP

尝试Naudio – 它是一个免费的+ opensource .NET库,提供了一些function,包括重新采样AFAIK的function。

作为重新采样的请求样本源

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

private function resampling(fromSampleRate:int, toSampleRate:int, quality:int = 10):void { var samples:Vector. = new Vector.; 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= 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; } 

请尝试以下代码从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(); }