我是FFT的新手,所以我对某些概念感到有些困惑。到目前为止,我在方程乘法中看到的FFT示例涉及具有连续指数的方程(即A(x) = 1 + 3x + 5x^2 +...
和B(x) = 4 + 6x + 9x^2 + ...
以及C(x) = A(x)*B(x)
)。但是,可以在两个没有相同指数的方程上使用FFT吗?例如,是否可以使用FFT乘以:
A(x) = 1 + 3x^2 + 9x^8
和
B(x) = 5x + 6 x^3 + 10x^8
在O(nlogn)
时间?
如果没有,是否存在运行时为O(nlogn)
的情况?例如,如果产品中的字词数为O(n)
而不是O(n^2)
?
即使运行时间超过O(nlogn)
,我们如何使用FFT来最小化运行时间呢?
答案 0 :(得分:0)
是的,可以在非等指数多项式上使用 DFFT ......
缺少的指数只是乘以0
,这也是一个数字......只需重写多项式:
A(x) = 1 + 3x^2 + 9x^8
B(x) = 5x + 6x^3 + 10x^8
这样的事情:
A(x) = 1x^0 + 0x^1 + 3x^2 + 0x^3 + 0x^4+ 0x^5+ 0x^6+ 0x^7 + 9x^8
B(x) = 0x^0 + 5x^1 + 0x^2 + 6x^3 + 0x^4+ 0x^5+ 0x^6+ 0x^7 + 10x^8
所以 DFFT 的矢量是:
A = (1,0,3,0,0,0,0,0, 9)
B = (0,5,0,6,0,0,0,0,10)
添加零,因此向量是正确的结果大小(最大A指数+1 +最大B指数+1),并且对于 DFFT 的使用情况也会向2
舍入最接近的幂{x}}原始尺寸为9,9 -> 9+9 -> 18 -> round up -> 32
A = (1,0,3,0,0,0,0,0, 9,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0)
B = (0,5,0,6,0,0,0,0,10,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0)
// | original | correct result | nearest power of 2 |
并执行您想要的 DFFT 内容......我假设您要执行以下操作:
A' = DFFT(A)
B' = DFFT(B)
C(i)' = A'(i) * B'(i) // i=0..n-1
C= IDFFT(C')
是O(n*log(n))
。 不要忘记如果你使用 DFFT (不是DFT) n = 32 而不是18 !!!因为对于 DFT 的快速算法,n
必须是2
的强大功能,如果你想要性能改进而不是看 DFFT 权重矩阵 DFFT(A),DFFT(B)它们是相同的,所以不需要计算它们两次......