C# - 如何使BiQuadFilter代码工作

时间:2015-03-15 06:43:14

标签: c# naudio lowpass-filter

我必须遵循C#代码,它通过低通滤波器传递我的WAV文件。我正在使用NAudio' BiQuadFilter。然而,声音没有变化,它仍然是相同的。

我的代码:

    public void setValues(ISampleProvider sourceProvider,int cutOffFreq)
    {
        this.sourceProvider = sourceProvider;
        this.cutOffFreq = cutOffFreq;

        filter_LowPass();
    }

    private void filter_LowPass()
    {
        channels = sourceProvider.WaveFormat.Channels;
        filters = new BiQuadFilter[channels];

        for (int n = 0; n < channels; n++)
            if (filters[n] == null)
                filters[n] = BiQuadFilter.LowPassFilter(44100, cutOffFreq, 1);
            else
                filters[n].SetLowPassFilter(44100, cutOffFreq, 1);
    }

    public WaveFormat WaveFormat { get { return sourceProvider.WaveFormat; } }

    public int Read(float[] buffer, int offset, int count)
    {
        int samplesRead = sourceProvider.Read(buffer, offset, count);

        for (int i = 0; i < samplesRead; i++)
            buffer[offset + i] = filters[(i % channels)].Transform(buffer[offset + i]);

        return samplesRead;
    }

这是在一个名为MyFilter的类中,我这样称呼它:

        audioFileReader = new AudioFileReader("a.wav");

        myFilter.setValues(audioFileReader, currentCutOff);

        waveOut.Init(audioFileReader);

        waveOut.Play();

传递的截止值(仅按此顺序)为:3000,2500,2000,1500和1000,但是,当切断变化时,感觉没有变化。

1 个答案:

答案 0 :(得分:1)

您需要将过滤器传递到waveOut.Init而不是audioFileReader,以便将文件中的音频拉过过滤器。

waveOut.Init(myFilter);