Hia*_*iam 8 c++ fft filter vst convolution
首先,抱歉没有在这里发布代码.出于某种原因,当我试图输入我在此页面上的代码时,所有代码都搞乱了upp,无论如何发布它可能太多了,无法接受.这是我的代码:http://pastebin.com/bmMRehbd
现在从我所说的,我无法从这段代码中获得好结果的原因是因为我没有使用重叠添加.我试图在互联网上阅读几个来源,为什么我需要使用重叠添加,但我无法理解它.似乎实际过滤器工作,导致任何高于给定截止值,确实切断.
我应该提到这是为vst2-sdk工作的代码.
有人能告诉我为什么我需要添加它以及如何在给定代码中实现重叠添加代码?
我还应该提到,当谈到算法和数学时,我真的很愚蠢.我是那些需要在视觉上抓住我正在做的事情的人之一.那或者通过代码解释的东西:),然后我的意思是实际的重叠.
Overlad添加理论:http://en.wikipedia.org/wiki/Overlap%E2%80%93add_method
感谢您提供的所有帮助!
需要重叠相加方法来处理每个 fft 缓冲区的边界。问题在于 FFT 域中的乘法会导致时域中的循环卷积。这意味着执行 IFFT 后,帧末尾的结果会环绕并破坏帧开头的输出样本。
这样考虑可能更容易:假设您有一个长度为 的过滤器N
。该滤波器与输入样本的线性卷积M
实际上返回M+N-1
输出样本。然而,在 FFT 域中完成的循环卷积会产生相同数量的输入和输出样本M
。来自线性卷积的额外N-1
样本“包裹”并破坏了第一个N-1
输出样本。
这是一个示例(matlab 或八度):
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
Run Code Online (Sandbox Code Playgroud)
请注意,最后 2 个样本已缠绕并添加到圆形盒中的前 2 个样本中。
重叠添加/重叠保存方法基本上是处理这种环绕的方法。由于循环卷积返回的未损坏输出样本数量少于输入样本数量,因此需要 FFT 缓冲区的重叠。