Использование эквалайзера в петле NAudio

Я написал этот простой метод, используя 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 ответ

Решение

Я наткнулся на 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;
    };
}
Другие вопросы по тегам