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