Jus*_*Ask 2 c# audio fft naudio lowpass-filter
我在 DSP 和滤波领域非常陌生。就像我一周前开始的一样。无论如何,我一直在寻找在我得到的一些数据上使用滤波器(低通、高通、陷波等)的方法。数据来自一个双精度数组,我可以在这个数组中获得超过 100 万个点。我试图过滤掉给定某个截止频率的声音,但无法使任何算法起作用。我一直在互联网上下并尝试了一堆不同的库和方法,但我无法得到任何结果。我偏爱 NAudio 库,因为它似乎拥有我需要的一切(通过 BiQuadFilter 类进行 FFT 和过滤)。我很确定我的问题是我极度缺乏获得所需输出的知识和数学。从我所读到的内容来看,我认为这个过程应该如何进行:
这是过滤音频的正确方法吗?我可以将整个阵列推入 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();
Run Code Online (Sandbox Code Playgroud)
doubleArray 是我的加速度计数据的数组,目前拥有 100 万个点,每个点都在 1.84 左右......
WaveMemoryStream是我在另一篇文章中找到的课程
LowPassSampleProvider 是我创建的一个类,它实现了 ISampleProvider 并将样本传递给 BiQuadFilter.LowPassFilter 函数。
在BiQuadFilter时域中的n音讯操作。您不需要将 FFT 与它一起使用。将每个样本传递到Transform方法中以获取输出样本。如果您有立体声音频,请使用两个滤波器,一个用于左侧,一个用于右侧。
我通常会ISampleProvider在 Read 方法中实现一个从源ISampleProvider(例如AudioFileReader)读取并将样本通过过滤器的实现。