在音频上使用低通滤波器

Jus*_*Ask 2 c# audio fft naudio lowpass-filter

我在 DSP 和滤波领域非常陌生。就像我一周前开始的一样。无论如何,我一直在寻找在我得到的一些数据上使用滤波器(低通、高通、陷波等)的方法。数据来自一个双精度数组,我可以在这个数组中获得超过 100 万个点。我试图过滤掉给定某个截止频率的声音,但无法使任何算法起作用。我一直在互联网上下并尝试了一堆不同的库和方法,但我无法得到任何结果。我偏爱 NAudio 库,因为它似乎拥有我需要的一切(通过 BiQuadFilter 类进行 FFT 和过滤)。我很确定我的问题是我极度缺乏获得所需输出的知识和数学。从我所读到的内容来看,我认为这个过程应该如何进行:

  1. 将数据插入 FFT 以将数据放入频域
  2. 将结果数据传递到过滤器(低、高、陷波)
  3. 从步骤 2 中的结果执行 IFFT 以返回时域
  4. 播放声音

这是过滤音频的正确方法吗?我可以将整个阵列推入 FFT 还是必须将其分解成更小的块?我如何处理我在 FFT 结果中得到的复数(即只使用实部并丢弃虚部,或者使用幅度和相位)?我真的不知道什么是“正确的方式”。

编辑

我终于让它工作了!这是我所做的:

        byte[] data = doubleArray.SelectMany(value => BitConverter.GetBytes(value)).ToArray();
        wms = new WaveMemoryStream(data, sampleRate, (ushort)audioBitsPerSample, (ushort)channels);
        WaveFileReader wfr = new WaveFileReader(wms);
        SampleChannel sample = new SampleChannel(wfr, false);
        LowPassSampleProvider sampleProvider = new LowPassSampleProvider(sample);
        WaveOutEvent player = new WaveOutEvent();
        player.Init(sampleProvider);
        player.Play();
Run Code Online (Sandbox Code Playgroud)

doubleArray 是我的加速度计数据的数组,目前拥有 100 万个点,每个点都在 1.84 左右......

WaveMemoryStream是我在另一篇文章中找到的课程

LowPassSampleProvider 是我创建的一个类,它实现了 ISampleProvider 并将样本传递给 BiQuadFilter.LowPassFilter 函数。

Mar*_*ath 5

在BiQuadFilter时域中的n音讯操作。您不需要将 FFT 与它一起使用。将每个样本传递到Transform方法中以获取输出样本。如果您有立体声音频,请使用两个滤波器,一个用于左侧,一个用于右侧。

我通常会ISampleProvider在 Read 方法中实现一个从源ISampleProvider(例如AudioFileReader)读取并将样本通过过滤器的实现。