【发布时间】:2014-03-14 13:16:21
【问题描述】:
我对 DSP 和滤波领域非常陌生。就像我一周前开始的那样。无论如何,我一直在寻找对我得到的一些数据使用过滤器(低通、高通、陷波等)的方法。数据来自一个双精度数组,我可以在这个数组中获得超过 100 万个点。我试图在给定截止频率的情况下过滤掉声音,但无法让任何算法起作用。我一直在互联网上上下移动并尝试了一堆不同的库和方法,但我无法得到任何结果。我偏爱 NAudio 库,因为它似乎拥有我需要的一切(FFT 和 BiQuadFilter 类过滤)。我很确定我的问题是我极度缺乏获得所需输出的知识和数学。从我读过的内容来看,我认为这个过程应该是这样的:
- 将数据插入 FFT 以将数据放入频域
- 将结果数据传递到过滤器(低、高、缺口)
- 从第 2 步的结果中进行 IFFT 以返回时域
- 播放声音
这是过滤音频的正确方法吗?我可以将整个阵列推入 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 函数。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
标签: c# audio fft naudio lowpass-filter