我在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
是我找到的课程on another post here
LowPassSampleProvider
是我创建的一个实现ISampleProvider的类,并将样本传递给BiQuadFilter.LowPassFilter函数。
答案 0 :(得分:4)
NAudio中的BiQuadFilter
在时域中运行。您不需要使用FFT。将每个样本传递到Transform
方法以获取输出样本。如果您有立体声音频,请使用两个滤波器,一个用于左侧,一个用于右侧。
我通常会在Read方法中创建一个ISampleProvider
实现,从源ISampleProvider
读取(例如AudioFileReader
)并将样本传递给过滤器。
答案 1 :(得分:0)
通常,您会通过时域过滤器运行时域数据。另一种等效的方法是采用数据的FFT和滤波器的FFT,将其乘以频域,然后进行逆FFT。对于小型过滤器,时域方法通常更快。您通常会在数据帧上执行此操作,例如通过过滤器传递的8192个样本。然后重复后续帧。没有看你的代码,我无法提供更多的帮助。另外,请使用英特尔的IPP查看这些examples。有时间和频率域的实现应该有助于你前进。