c# - 对音频使用低通滤波器

标签 c# audio fft naudio lowpass-filter

我对 DSP 和滤波领域非常陌生。就像我一周前开始的那样。不管怎样,我一直在寻找对我得到的一些数据使用滤波器(低通、高通、陷波等)的方法。数据来自 double 组,我可以在该数组中获得超过 100 万个点。我试图在给定一定截止频率的情况下滤除声音,但无法使任何算法发挥作用。我在互联网上到处寻找并尝试了很多不同的库和方法,但我无法得到任何结果。我偏爱 NAudio 库,因为它似乎拥有我需要的一切(FFT 和 BiQuadFilter 类的过滤)。我很确定我的问题是我极度缺乏获得所需输出的知识和数学。从我读到的内容来看,我认为这个过程应该是这样的:

  1. 将数据插入FFT,将数据放入频域
  2. 将结果数据传递到过滤器(低、高、陷波)
  3. 对第 2 步中的结果进行 IFFT 以返回时域
  4. 播放声音

这是过滤音频的正确方法吗?我可以将整个数组放入 FFT 中,还是必须将其分成更小的 block ?我该如何处理 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 函数。

最佳答案

NAudio 中的 BiQuadFilter 在时域中运行。您不需要使用 FFT。将每个样本传递到 Transform 方法中以获取输出样本。如果您有立体声音频,请使用两个滤波器,一左一右。

我通常会创建一个 ISampleProvider 实现,在 Read 方法中从源 ISampleProvider(例如 AudioFileReader)读取数据并传递样本通过过滤器。

关于c# - 对音频使用低通滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21791877/

相关文章:

c# - 检查字符串是否包含通用列表中的值并替换它

c# - 编码不带傅立叶函数的 UnsharpMask

c# - 领域层的日志接口(interface)

c# - 从 Python 或其他语言中使用 MassTransit

audio - 如何将 AUDIO 组与 VIDEO 流结合并使用 ffmpeg 生成新的 .ts 文件?

iphone - 从哪里开始制作将 MP3 文件转换为 iphone 有声读物 (M4B) 格式的程序?

html - 如何在网络浏览器中播放 MKV 视频?

Python频率检测

python - python 中的 fft 带通滤波器

c# - 是否必须根据 HTTP 请求处理 Windows.Web.Http.HttpClient?