循环卷积和线性卷积以及快速卷积计算

做block AEC 的时候看不懂对w补零,x加入上一帧,fft和ifft计算后舍弃前一半数据的操作。深入调查了一下循环卷积和overlap save。
https://www.zhihu.com/question/25525824中表示,循环卷积我理解是使用DFT(FFT)计算线性卷积时的衍生品。首先连续时间没有循环卷积概念,因为用FFT的时候在频率维度采样,照成时域延拓,因此FFT频域相乘等价于时域延拓后的两个序列的卷积,也就是圆卷积!
https://blog.robertelder.org/overlap-add-overlap-save/
中动态描述了overlap save和 overlap add 算法。 overlap add很好理解,就是每个frame补零,使得N>=L+M-1(两个序列之和-1),此时圆卷积的结果就是线性卷积。
overlap save 还是很不好理解,因为它依然使用了圆卷积。表现为前面补入上一帧的数据,两帧的数据与滤波器进行圆卷积,然后丢弃前一半的结果,得到线性卷积。(可以理解成当前帧的输出等于上一帧数据和这一帧数据的圆卷积)
对了,圆卷积可以通过矩阵运算计算,非常直观。可以看到overlap add 右上角由于补0都是不参与计算的。

他们的不同如下所示,
Here is a simple summary of differences between overlap add and overlap save that might influence which one you use:

Overlap add will involve adding a number of values in the output to recover the final signal, whereas overlap save does not require any addition in this step. This might be important to you if you want to consider the numerical precision of your output, or if you want to reduce the number of addition operations.
The Overlap add method can be computed using linear convolution since the zero padding makes the circular convolution equal to linear convolution in these cases.
The Overlap save method doesn’t do as much zero padding, but instead re-uses values from the previous input interval. In overlap save, some values are considered contaminated due to aliasing of the circular convolution, so they are discarded from the output.
In overlap save there is less zero padding. In fact, the only time you need to zero pad is before the first interval, and after the last interval if the length of the input sequence isn’t evenly divided by L.

猜你喜欢

转载自blog.csdn.net/weixin_39987672/article/details/126349128