8

首先,很抱歉没有在这里发布代码。由于某种原因,当我尝试在此页面上输入我拥有的代码时,所有代码都搞砸了,无论如何发布可能太多了,无法接受。这是我的代码: http: //pastebin.com/bmMRehbd

现在从我被告知的情况来看,我无法从这段代码中获得好的结果的原因是因为我没有使用重叠添加。我试图阅读互联网上的几个来源,了解为什么我需要使用重叠添加,但我无法理解。似乎实际过滤器有效,导致任何高于给定截止值的东西,确实被截止。

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

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

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

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

感谢您提供的所有帮助!

4

4 回答 4

4

当您通过对两个输入信号的离散傅里叶变换的乘积进行逆离散傅里叶变换来进行卷积(使用有限脉冲响应滤波器)时,您实际上是在实现循环卷积。我在此将其称为“在频域中计算的卷积”。(如果您不知道什么是循环卷积,请查看此链接。它基本上是一个卷积,您假设域是循环的,即,将信号从两侧移开使其“环绕”到另一侧领域。)

您通常希望通过对大信号使用快速傅立叶变换来执行卷积,因为它的计算效率更高。

重叠添加(及其表亲重叠保存)是解决在频域中完成的卷积实际上是循环卷积这一事实的方法,但实际上我们很少想要进行循环卷积,而是通常更喜欢线性卷积。

重叠添加是通过输入信号的“零填充”块来实现的,然后适当地使用循环卷积的部分(在频域中完成)。重叠保存通过仅保留与线性卷积相对应的信号部分并丢弃被循环移位“损坏”的部分来实现。

这是两种方法的维基百科的两个链接。

Overlap-add:这个有一个很好的数字来解释发生了什么。

重叠保存

Orfanidis 的这本书很好地解释了这一点。请参阅第 9.9.2 节。在我看来,这不是信号处理的“事实上的”标准,但它写得非常好,并且比其他书籍更好地介绍。

于 2012-04-04T17:53:49.273 回答
4

需要使用重叠添加方法来处理每个 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 个样本中。

重叠添加/重叠保存方法基本上是处理这种环绕的方法。由于循环卷积返回的未损坏输出样本少于输入样本的数量,因此需要 FFT 缓冲区的重叠。

于 2012-04-04T18:08:19.653 回答
0

首先,要明白时域中的卷积等价于频域中的乘法。在卷积中,您大致处于 O(n*m) 的位置,其中 n 是 FIR 长度,m 是要过滤的样本数。在频域中,使用 FFT,您正在运行 O(n * log n)。对于足够大的 n,在频域中进行滤波的成本要低得多。但是,如果 n 相对较小,则好处会减少到在时域中更容易过滤的程度。这个断点是主观的,但是,图 50 到 100 是您可以切换的点。

于 2012-04-04T17:54:22.960 回答
0

是的,就改变频率响应而言,卷积滤波器将“起作用”。但是频域中的这种乘法也会在一端与来自另一端的数据污染时域数据,反之亦然。重叠添加/保存扩展 FFT 大小并切断“污染”端,然后使用该端数据修复后续 FFT 窗口的开始。

于 2012-04-04T18:07:10.247 回答