首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在音频上使用低通滤波器

在音频上使用低通滤波器
EN

Stack Overflow用户
提问于 2014-02-15 00:33:19
回答 2查看 5.2K关注 0票数 2

我是一个非常新的世界的DSP和滤波。就像我一周前开始的那样。无论如何,我一直在寻找使用过滤器的方法(低通、高通、凹槽等)。根据我得到的一些数据。数据是一个双倍数组,我可以在这个数组中得到超过100万个点。我试图过滤声音,给定一定的截止频率,但无法使任何算法工作。我上上下下地上网,尝试了很多不同的库和方法,但是我没有得到任何结果。我偏爱NAudio库,因为它似乎拥有我所需的一切(FFT和BiQuadFilter类的过滤)。我很确定我的问题是我极度缺乏知识和数学来达到预期的结果。从我所读到的情况来看,我认为这个过程应该如何进行:

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

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

编辑

我终于让它起作用了!以下是我所做的:

代码语言:javascript
复制
        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函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-15 08:28:33

BiQuadFilter在NAudio中运行在时间域中。你不需要对它使用FFT。将每个示例传递到Transform方法中,以获得输出示例。如果您有立体声音响,请使用两个过滤器,一个用于左边,一个用于右边。

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

票数 5
EN

Stack Overflow用户

发布于 2014-02-15 00:39:52

通常,您将通过时域筛选器运行时间域数据。另一种等效的方法是将数据的FFT和滤波器的FFT相乘,然后在频域内进行反FFT。对于小滤波器,时域方法通常更快。您通常会在数据帧上这样做,比如通过过滤器传递的8192个样本。然后对随后的帧重复。如果不查看您的代码,我将无法提供更多的帮助。另外,看看这些使用英特尔IPP的示例。有时间和频域实现,应该有助于您的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21791877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档