在音频上使用低通滤波器

时间:2014-02-15 00:33:20

标签: c# audio fft naudio lowpass-filter

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

  1. 将数据插入FFT以将数据置入频域
  2. 将结果数据传递到过滤器(低,高,缺口)
  3. 从步骤2的结果中进行IFFT以回到时域
  4. 播放声音
  5. 这是过滤音频的正确方法吗?我可以将整个阵列推入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是我找到的课程on another post here

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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