我注意到SciPy有离散正弦变换的实现,我将它与MATLAB中的那个进行比较。 MATLAB文档指出,为了获得最佳性能,输入的大小应为2 ^ p -1,大概是为了分而治之的策略。这对于SciPy实现也是如此吗?
答案 0 :(得分:0)
尽管这个问题很古老,但我碰巧刚刚进行了一些测试,然后偶然发现了这个问题。
答案是 是 。在内部,scipy似乎将数组转换为大小M = 2*(N+1)
。
理想情况下,M = 2^i
用于一些整数i。因此,N应该紧跟N = 2^i - 1
。下图显示了时序如何随fft-size缩放。请注意,橙色线要平滑得多,这表明没有意外的内存开销。
更新
在深入研究scipy.fftpack的文档后,我发现以上答案仅部分正确。根据文档,“ SciPy的FFTPACK具有有效的基数{2,3,4,5}功能”。这意味着它不能有效地处理大小为M = 2^i
的数组,而是可以处理任何M = 2^i * 3^j * 5^k
(4不是素数)。这样,scipy.fftpack.dst(或dct)的最佳值为M - 1
。找到这些数字可能有点尴尬,但是幸运的是,还有一个function!
请注意,上图是对数-对数比例,因此提速40左右并不罕见。因此,选择一个快速的大小可以使您的计算速度更快! (我很难做到这一点)。