c# - 如何使用NAudio的BiQuadFilter?

标签 c# filter naudio

我使用 NAudio 录制麦克风的声音并将其保存在文件中。我用这个:

    public WaveFileWriter m_WaveFile = null;

    m_WaveFile = new WaveFileWriter(strFile, m_WaveSource.WaveFormat);  


    void DataAvailable(object sender, WaveInEventArgs e)
    {
        if (m_WaveFile != null)
        {
            m_WaveFile.Write(e.Buffer, 0, e.BytesRecorded);
        }
    }

现在我想对录制的声音应用高通滤波器和低通滤波器。到目前为止,我发现 BiQuadFilters 可以为我做到这一点,但到目前为止我不明白如何使用它。

我找到的例子都是这样的:

    var r = BiQuadFilter.LowPassFilter(44100, 1500, 1);
    var reader = new WaveFileReader(File.OpenRead(strFile));
    var filter = new MyWaveProvider(reader, r); // reader is the source for filter
    var waveOut = new WaveOut();
    waveOut.Init(filter); // filter is the source for waveOut
    waveOut.Play();

如果我理解正确,那么过滤器将应用于正在播放声音的类。但我不想播放声音,我希望将高通滤波器和对数通滤波器应用于文件并将结果保存在文件中。我怎样才能做到这一点?

编辑: 这是 MyWaveProvider 类:

class MyWaveProvider : ISampleProvider
{
    private ISampleProvider sourceProvider;
    private float cutOffFreq;
    private int channels;
    private BiQuadFilter[] filters;

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

        channels = sourceProvider.WaveFormat.Channels;
        filters = new BiQuadFilter[channels];
        CreateFilters();
    }

    private void CreateFilters()
    {
        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;
    }
}

最佳答案

以下代码应该满足您想要执行的操作:

using (var reader = new WaveFileReader(File.OpenRead(strFile)))
{
    var r = BiQuadFilter.LowPassFilter(44100, 1500, 1);

    // reader is the source for filter
    using (var filter =  new MyWaveProvider(reader, r))
    {
        WaveFileWriter.CreateWaveFile("filteroutput.wav", filter);
    } 
}

关于c# - 如何使用NAudio的BiQuadFilter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47212311/

相关文章:

c# - 在 C# 中填充 Word 2007 模板的最佳方法是什么?

python-3.x - 如何在python中查找 "filter"对象的长度

algorithm - 从大表中消除 "bad"项目的多维过滤器?

c# - 具有效果的Windows 8.1应用程序音频(NAudio或SharpDX)

c# - 使用 naudio 播放 .wav 文件,播放在 1 秒后停止

c# - 字符串转十进制解析C#

c# - 如何开始使用 Microsoft Bot Framework?

c# - 如何在 .NET Core 中发出类型

php - 简单的 Ajax 过滤器不返回结果

c# - 使用 NAudio 更改 wav 文件(到 16KHz 和 8bit)