Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#下面的低通滤波器代码是如何运行的?_C#_Audio_Naudio_Lowpass Filter - Fatal编程技术网

C#下面的低通滤波器代码是如何运行的?

C#下面的低通滤波器代码是如何运行的?,c#,audio,naudio,lowpass-filter,C#,Audio,Naudio,Lowpass Filter,我在NAudio现场发现了以下低通滤波器的C#代码: public void setValues(ISampleProvider sourceProvider,int cutOffFreq) { this.sourceProvider = sourceProvider; this.cutOffFreq = cutOffFreq; filter_LowPass(); } private void filter_Lo

我在NAudio现场发现了以下低通滤波器的C#代码:

    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;
    }

如果我想在通过低通滤波器后将每个样本乘以一个常量值,那么我应该在哪里编写代码?

NAudio在这里使用拉模型。声卡将需要
waveOut
,因此它将向上游调用
myFilter.Read()
,然后调用
audioFileReader.Read()

如果要添加一些额外增益,可以按照相同的模式创建一个新的ISampleProvider,或将其内联到低通滤波器的读取函数中:

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] = gain * filters[(i % channels)].Transform(buffer[offset + i]);
        //                   ^^^^

    return samplesRead;
}
公共整数读取(浮点[]缓冲区、整数偏移量、整数计数)
{
int samplesRead=sourceProvider.Read(缓冲区、偏移量、计数);
对于(int i=0;i
包含的类是否实现了任何接口?是的,这一个:ISampleProvideris gain=exp10((音频的初始RMS-过滤后的新RMS)/20)?我只是想用它乘以您想要的任何增益。2.0=2x等…你到底想做什么?我正在尝试均衡样本…在通过低通滤波器后,它们的功率/强度降低,导致体积减小…因此,在低通之后,我想用每个样本乘以一个增益因子,但我不知道应该乘以多少,这并不像增加激励那么简单。你需要考虑2个问题。1) 假设你的信号是一个低于截止频率的满标度正弦波,那么满标度信号将不衰减地通过你的滤波器,你添加的任何增益都将驱动它进入削波。2) 如果将整个信号相乘,在整个频带上增加增益,则会增强刚刚过滤掉的部分中的噪声。最好只对你想要的频谱部分应用boost。你可以用naudio做的事情是有限的。尝试级联一个搁置过滤器。我的音频文件是一个录制的声音,没有背景噪音…它只是人声…所有音频都远高于我的截止阈值…因此我可以安全地将采样与增益值相乘:)
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] = gain * filters[(i % channels)].Transform(buffer[offset + i]);
        //                   ^^^^

    return samplesRead;
}