C# 在NAudio环回中使用均衡器

C# 在NAudio环回中使用均衡器,c#,naudio,equalizer,C#,Naudio,Equalizer,我使用NAudio编写了这个简单的方法,在当前的声音设备上创建混响效果。它已经开始工作了 然而,我只想在更高的频率上应用混响效果,因为否则你会听到很多基本鼓的回声,这不是我想要的声音 private void CreateReverb() { WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture(); BufferedWaveProvider bufferedWaveProvider = new BufferedWave

我使用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改变混响效果,使其只影响更高的音调?

我偶然发现了
双四元滤波器
,结果证明它可以用于此目的

它将样本转换为浮点,而
WasapiLoopbackCapture.DataAvailable
返回一个
字节[]
。但是
BitConverter
可以将浮点值转换成
字节[4]
缓冲区。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;
    };
}
private void CreateReverb()
{
WasapiLoopbackCapture waveIn=新的WasapiLoopbackCapture();
BufferedWaveProvider BufferedWaveProvider=新的BufferedWaveProvider(waveIn.WaveFormat);
VolumeSampleProvider volumeProvider=新的VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
WasapiOut WasapiOut=新WasapiOut(AudioClientShareMode.Shared,0);
BiQuadFilter=BiQuadFilter.HighPassFilter(44000,200,1);
wasapiOut.Init(volumeProvider);
wasapiOut.Play();
waveIn.StartRecording();
waveIn.DataAvailable+=委托(对象发送方,WaveInEventArgs e)
{
对于(int i=0;i
一般来说,您会使用均衡器在声源上设置高通滤波器,防止低音频率(比如200Hz或更低)通过,然后将该部分音频流发送到您的混响方法。我找到并尝试了
BiQuadFilter
,但它没有提供转换缓冲区的方法(只有一个浮点数,而不是字节[])。我还没有在NAudio这个奇怪的对象模型中发现这个类/方法。有什么想法吗?对不起,我对这些都不熟悉。