在音频上使用低通滤波器

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

  • 将数据插入FFT以将数据置入频域
  • 将结果数据传入过滤器(低,高,缺口)
  • 从步骤2的结果中进行IFFT以回到时间域
  • 播放声音
  • 这是过滤音频的正确方法吗? 我可以将整个阵列推入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();
    

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

    WaveMemoryStream是我在另一篇文章中发现的类

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


    BiQuadFilter中的BiQuadFilter在时域中运行。 你不需要使用FFT。 将每个样本传递给Transform方法以获取输出样本。 如果您有立体声音频,请使用两个过滤器,一个用于右侧。

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


    通常,您可以通过时域过滤器运行时域数据。 另一种相同的方法是将数据的FFT和滤波器的FFT进行FFT,在频域中将其相乘,然后进行逆FFT。 对于小型滤波器,时域方法通常更快。 您通常会在数据帧上执行此操作,例如通过过滤器传递8192个样本。 然后重复以后的帧。 不看你的代码,我无法提供更多的帮助。 另外,使用英特尔的IPP来看看这些例子。 有时间和频率域的实现应该有助于让你走。

    链接地址: http://www.djcxy.com/p/62141.html

    上一篇: Using a low pass filter on audio

    下一篇: Chebyshev LPF introducing noise