将样本浮点数组转换为 WAV 文件格式
Float array of samples to WAV file format
我正在开发一个在声音文件上应用过滤器的应用程序,过滤器应用于频域,所以我使用 NAudio 库从 .wav 文件中获取样本,代码如下:
audio = new AudioFileReader(wav_file);
samples = new float[wave.Length];
audio.Read(samples, 0, samples.Length);
应用前面的代码后,现在我将样本作为浮点数组,然后对样本应用短时傅里叶变换以获得频域数据,然后在频域上应用滤波器数据。
然后对频域数据应用逆短时傅里叶变换,将其转换回时域,时域应该类似于初始样本,但应用了滤波器。
再次执行步骤:
- 从wav文件中获取样本(时域数据)数组。
- 对样本应用短时傅立叶变换以获得频域数据。
- 对频域数据应用过滤器。
- 对频域数据应用逆短时傅里叶变换得到样本(时域数据)。
- 再次将样本转换回 wav 格式以保存和播放。
现在问题出在最后一步,我有样本的浮点数组(时域数据),如何将其转换为.wav文件并播放?
要将示例保存为 .wav 文件,使用以下代码:
WaveFormat waveFormat = new WaveFormat(sampleRate, bitDepth, channels);
using (WaveFileWriter writer = new WaveFileWriter("C:\track1.wav", waveFormat))
{
writer.WriteSamples(floatOutput, 0, floatOutput.Length);
}
sampleRate
、bitDepth
和 channels
从输入文件中提取如下:
sampleRate = wave.WaveFormat.SampleRate;
bitDepth = wave.WaveFormat.BitsPerSample;
channels = wave.WaveFormat.Channels;
1- 创建一个实现 ISampleProvider 的 class
2- 使用此代码播放
(来源是 ISampleProvider)
var xs = new NAudio.Wave.SampleProviders.SampleToWaveProvider16(source);
var l = new NAudio.Wave.WaveOut();
l.Init(xs);
l.Play();
我正在开发一个在声音文件上应用过滤器的应用程序,过滤器应用于频域,所以我使用 NAudio 库从 .wav 文件中获取样本,代码如下:
audio = new AudioFileReader(wav_file);
samples = new float[wave.Length];
audio.Read(samples, 0, samples.Length);
应用前面的代码后,现在我将样本作为浮点数组,然后对样本应用短时傅里叶变换以获得频域数据,然后在频域上应用滤波器数据。
然后对频域数据应用逆短时傅里叶变换,将其转换回时域,时域应该类似于初始样本,但应用了滤波器。
再次执行步骤:
- 从wav文件中获取样本(时域数据)数组。
- 对样本应用短时傅立叶变换以获得频域数据。
- 对频域数据应用过滤器。
- 对频域数据应用逆短时傅里叶变换得到样本(时域数据)。
- 再次将样本转换回 wav 格式以保存和播放。
现在问题出在最后一步,我有样本的浮点数组(时域数据),如何将其转换为.wav文件并播放?
要将示例保存为 .wav 文件,使用以下代码:
WaveFormat waveFormat = new WaveFormat(sampleRate, bitDepth, channels);
using (WaveFileWriter writer = new WaveFileWriter("C:\track1.wav", waveFormat))
{
writer.WriteSamples(floatOutput, 0, floatOutput.Length);
}
sampleRate
、bitDepth
和 channels
从输入文件中提取如下:
sampleRate = wave.WaveFormat.SampleRate;
bitDepth = wave.WaveFormat.BitsPerSample;
channels = wave.WaveFormat.Channels;
1- 创建一个实现 ISampleProvider 的 class 2- 使用此代码播放 (来源是 ISampleProvider)
var xs = new NAudio.Wave.SampleProviders.SampleToWaveProvider16(source);
var l = new NAudio.Wave.WaveOut();
l.Init(xs);
l.Play();