我看到很多文献中都说通过使用fft可以实现更快的卷积运算。我知道需要从结果中获取fft和ifft,但我真的不明白为什么使用fft可以使卷积更快?
我看到很多文献中都说通过使用fft可以实现更快的卷积运算。我知道需要从结果中获取fft和ifft,但我真的不明白为什么使用fft可以使卷积更快?
对于足够大的滤波器,FFT加速卷积,因为每个输出样本的卷积需要N次乘法(和N-1次加法),相反,对于一个包含N个样本的块而言,需要(2)N²个操作。
考虑到为FFT处理而添加零时必须将块大小加倍,因此每个块需要(2)*(2N)*log(2N)个操作以执行FFT,2N个操作以进行乘法,并且再次需要4N*log(2N)个操作以执行逆FFT,当8Nlog2N ≤ 2N²时就达到了盈亏平衡点。
其基本原因如下:
1)离散时间域信号可以表示为频率的和。
2)时间域中的卷积(O(N²))等于频率域中的乘法(O(N))。
3)这种变换是可逆的。
4)存在一种方法可以在不到N²个操作的情况下将信号从时域转换到频域(这就是“快速傅里叶变换”的第一个F)。
直接FT是O(N²),其中每个频域元素F(i)=Σf(i)*exp(i*pi/N)。
然而,FFT基于发现exp(i*pi/N)具有某些对称性,允许计算在奇/偶向量中分割。偶向量可以在O(N)的代价下计算,而奇向量需要一个半尺寸的完整FT。由于这可以重复直到N=2,因此总体复杂度将是(与)Nlog(N)成比例。