我是一个非常新的世界的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函数。
发布于 2014-02-15 08:28:33
BiQuadFilter在NAudio中运行在时间域中。你不需要对它使用FFT。将每个示例传递到Transform方法中,以获得输出示例。如果您有立体声音响,请使用两个过滤器,一个用于左边,一个用于右边。
我通常做一个ISampleProvider实现,在Read方法中从源ISampleProvider (例如AudioFileReader)读取并通过过滤器传递样本。
发布于 2014-02-15 00:39:52
通常,您将通过时域筛选器运行时间域数据。另一种等效的方法是将数据的FFT和滤波器的FFT相乘,然后在频域内进行反FFT。对于小滤波器,时域方法通常更快。您通常会在数据帧上这样做,比如通过过滤器传递的8192个样本。然后对随后的帧重复。如果不查看您的代码,我将无法提供更多的帮助。另外,看看这些使用英特尔IPP的示例。有时间和频域实现,应该有助于您的工作。
https://stackoverflow.com/questions/21791877
复制相似问题