在NAudio环回中使用均衡器

时间:2015-06-02 16:04:14

标签: c# naudio equalizer

我使用 NAudio 编写了这个简单的方法,以便在当前的声音设备上创建混响效果。它已经在运作了。

但是,我想仅在较高的频率上应用混响效果,因为否则你会听到很多基鼓回声,这不是我想要它的声音。

private void CreateReverb()
{
    WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
    BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
    VolumeSampleProvider volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
    WasapiOut wasapiOut = new WasapiOut(AudioClientShareMode.Shared, 0);

    wasapiOut.Init(volumeProvider);
    wasapiOut.Play();
    waveIn.StartRecording();

    waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
    {
        bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
        volumeProvider.Volume = .8f * ReverbIntensity;
    };
}

我尝试了一些我在网上发现的创建均衡器的代码,但我无法将其应用到现有代码中。

问题:如何使用某种euqalizer更改此混响效果以仅影响更高音?

1 个答案:

答案 0 :(得分:1)

我偶然发现 BiQuadFilter ,结果证明它可以用于此目的。

它将样本转换为浮点数,而WasapiLoopbackCapture.DataAvailable返回byte[]。但BitConverter可以将浮动转换为byte[4]Buffer.BlockCopy将其写回流。

这是一个包含均衡器的工作混响。

private void CreateReverb()
{
    WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
    BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
    VolumeSampleProvider volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
    WasapiOut wasapiOut = new WasapiOut(AudioClientShareMode.Shared, 0);
    BiQuadFilter filter = BiQuadFilter.HighPassFilter(44000, 200, 1);

    wasapiOut.Init(volumeProvider);
    wasapiOut.Play();
    waveIn.StartRecording();

    waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
    {
        for (int i = 0; i < e.BytesRecorded; i += 4)
        {
            byte[] transformed = BitConverter.GetBytes(filter.Transform(BitConverter.ToSingle(e.Buffer, i)));
            Buffer.BlockCopy(transformed, 0, e.Buffer, i, 4);
        }
        bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
        volumeProvider.Volume = .8f * ReverbIntensity;
    };
}