集成音频和滤波器方法

时间:2014-10-08 10:01:15

标签: c# naudio lowpass-filter

嗨我有一个音频轨道,我希望在通过低通滤波器后播放。我正在使用NAudio的BiQuadFilter类作为滤波器部分。它有一个Inbuilt方法。第一个参数是采样率,第二个是截止频率,第三个是质量因子Q.我无法将Filter方法与我的音频部分集成。 这是我的代码:

        var r = BiQuadFilter.LowPassFilter(44100, 1500, 1);
        var reader = new WaveFileReader(File.OpenRead(@"D:1.wav"));
        var waveOut=new WaveOut();
        waveOut.Init(reader);
        waveOut.Play();

我管理,最终让它工作。不知道它是否正确。这就是我的所作所为:

    public MyFilter(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;
    }

这是正确的吗?

2 个答案:

答案 0 :(得分:1)

BiQuadFilter有一个方法Transform(float[] inBuffer, float[] outBuffer)可能会为您解决问题。要进行转换,我会创建一个调用方法的IWaveProvider

IWaveProvider是一个提供音频数据的类。我建议在构造函数中设置音频数据的来源:

public class MyWaveProvider : NAudio.Wave.IWaveProvider
{
    private readonly NAudio.Wave.IWaveProvider inWaveProvider;

    public MyWaveProvider(NAudio.Wave.IWaveProvider inWaveProvider)
    {
        this.inWaveProvider = inWaveProvider;
        this.WaveFormat = inWaveProvider.WaveFormat;
    }

    public NAudio.Wave.WaveFormat WaveFormat { get; private set; }

    public int Read(byte[] outBuffer, int offset, int count)
    {
        return this.inWaveProvider.Read(outBuffer, offset, count);
    }
}

您在Read()方法中看到从源读取字节并将其写入目标缓冲区。此时,您可以使用BiQuadFilter.Transform(float [] inBuffer,float [] outBuffer)来操纵数据。我将类型不一致作为练习留给你。我真的不知道。

当您使用Read()方法使用BiQuadFilter.Transfrom()方法时,您可以调用以下代码:

var r = BiQuadFilter.LowPassFilter(44100, 1500, 1);
var reader = new WaveFileReader(File.OpenRead(@"D:1.wav"));
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();

祝你好运!

答案 1 :(得分:0)

创建一个派生自ISampleProvider的类,然后在Read方法中,使用BiQuadFilter方法将来自源的样本传递到Transform。举个例子,看看NAudio WPF Demo中的source for the Equalizer class