【问题标题】:Float array of samples to WAV file format将样本浮点数组转换为 WAV 文件格式
【发布时间】:2017-11-01 03:30:26
【问题描述】:

我正在开发一个对声音文件应用过滤器的应用程序,过滤器应用在频域中,因此我使用带有此代码的 NAudio 库从 .wav 文件中获取样本:

audio = new AudioFileReader(wav_file);
samples = new float[wave.Length];
audio.Read(samples, 0, samples.Length);

在应用前面的代码之后,现在我将样本作为浮点数组,然后对获取频域数据的样本应用短时傅里叶变换,然后对频域数据应用滤波器。
然后对频域数据应用逆短时傅里叶变换,将其转换回时域,该时域应该与初始样本相似,但应用了滤波器。
再次执行步骤:

  1. 从 wav 文件中获取样本(时域数据)数组。
  2. 对样本应用短时傅里叶变换以获得频域数据。
  3. 对频域数据应用过滤器。
  4. 对频域数据应用反短时傅里叶变换来获取样本(时域数据)。
  5. 再次将样本转换回 wav 格式以保存和播放。

现在问题出在最后一步,我有样本的浮点数组(时域数据),如何将其转换为 .wav 文件并播放?

【问题讨论】:

标签: c# audio fft naudio


【解决方案1】:

要将样本保存为 .wav 文件,请使用以下代码:

WaveFormat waveFormat = new WaveFormat(sampleRate, bitDepth, channels);
using (WaveFileWriter writer = new WaveFileWriter("C:\\track1.wav", waveFormat))
{
    writer.WriteSamples(floatOutput, 0, floatOutput.Length);
}

sampleRatebitDepthchannels 从输入文件中提取如下:

sampleRate = wave.WaveFormat.SampleRate;
bitDepth = wave.WaveFormat.BitsPerSample;
channels = wave.WaveFormat.Channels;

【讨论】:

    【解决方案2】:

    1- 创建一个实现 ISampleProvider 的类 2-使用此代码玩 (源是 ISampleProvider)

             var xs = new NAudio.Wave.SampleProviders.SampleToWaveProvider16(source);
                    var l = new NAudio.Wave.WaveOut();
                    l.Init(xs);
                    l.Play();
    

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多