c++ - 具有 FFT 卷积的低通 FIR 滤波器 - 重叠添加,原因和方式

标签 c++ filter fft convolution vst

首先,很抱歉没有在这里发布代码。出于某种原因,当我试图输入我在这个页面上的代码时,所有的代码都被弄乱了,而且无论如何张贴的代码可能太多了,无法接受。这是我的代码:http://pastebin.com/bmMRehbd

据我所知,我无法从这段代码中得到好的结果是因为我没有使用重叠添加。我试图阅读互联网上的多个资源,了解为什么我需要使用重叠添加,但我无法理解。看起来实际过滤器起作用了,导致任何高于给定截止值的东西都被截止了。

我应该提到这是为 vst2-sdk 工作的代码。

有人能告诉我为什么我需要添加它以及如何将重叠添加代码实现到给定代码中吗?

我还应该提到,在算法和数学方面,我非常愚蠢。我是那些需要从视觉上掌握我正在做的事情的人之一。那或得到代码解释的东西:),然后我的意思是实际重叠。

叠加理论:http://en.wikipedia.org/wiki/Overlap%E2%80%93add_method

感谢您提供的所有帮助!

最佳答案

需要overlap-add方法来处理每个fft缓冲区的边界。问题在于 FFT 域中的乘法会导致时域中的循环卷积。这意味着在执行 IFFT 之后,帧末尾的结果环绕并破坏了帧开头的输出样本。

这样想可能更容易:假设您有一个长度为 N 的过滤器。此过滤器与 M 输入样本的线性卷积实际上返回 M+N-1 输出样本。但是,在 FFT 域中进行的循环卷积会导致相同数量的输入和输出样本 M。来自线性卷积的额外 N-1 样本“环绕”并破坏了第一个 N-1 输出样本。

这是一个例子(matlab 或 Octave ):

a = [1,2,3,4,5,6];
b = [1,2,1];
conv(a,b)  %linear convolution

    1    4    8   12   16   20   17    6

ifft(fft(a,6).*fft(b,6))  %circular convolution

    18   10    8   12   16   20

请注意,最后 2 个样本已环绕并添加到圆形案例中的前 2 个样本中。

overlap-add/overlap-save 方法基本上是处理这种环绕的方法。需要 FFT 缓冲区的重叠,因为循环卷积返回的未损坏输出样本少于输入样本的数量。

关于c++ - 具有 FFT 卷积的低通 FIR 滤波器 - 重叠添加,原因和方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015958/

相关文章:

c++ - 字符代表前缀 '0x0'的int十六进制数

python - 执行 FFT 和峰值检测后如何获取 BPM

java - 快速傅里叶变换(FFT)输入输出分析Java音频文件的频率?

c++ - constexpr 是否暗示 noexcept?

c++ - 进程列表及其子进程

c++ - 如何使用键而不是标量检索 map 节点?

css - IE6 透明度问题

python - 隐藏在 django-filter 中产生零结果的过滤器项

matlab - 在 MATLAB 中用高斯白噪声过滤信号

java - 在 Java 中使用 FFT 从 .wav 创建频谱图