SciPy 离散正弦变换的有效大小选择

Efficient size choice for SciPy Discrete Sine Transform

我注意到 SciPy 有一个离散正弦变换的实现,我将它与 MATLAB 中的实现进行了比较。 MATLAB 文档指出,为了获得最佳性能,输入的大小应该为 2^p -1,大概是为了分而治之的策略。 SciPy 实施也是如此吗?

虽然这个问题很老了,但我碰巧 运行 做了一些测试,然后偶然发现了这个问题。 答案是。在内部,scipy 似乎将数组转换为大小 M = 2*(N+1)。 理想情况下,M = 2^i,对于某个整数 i。因此,N应该跟在N = 2^i - 1之后。下图显示了时序如何随 fft-size 缩放。请注意,o运行ge 线更平滑,表明没有意外的内存开销。

  • 绿线:N = 2^i
  • 蓝线:N = 2^i + 1
  • O运行ge行:N = 2^i - 1

更新 在深入研究 scipy.fftpack 的文档后,我发现上述答案只是部分正确。根据文档,"SciPy’s FFTPACK has efficient functions for radix {2, 3, 4, 5}"。这意味着它可以处理任何 M = 2^i * 3^j * 5^k(4 不是质数),而不是有效地处理大小为 M = 2^i 的数组。 scipy.fftpack.dst(或 dct)的最佳选择是 M - 1。找到这些数字可能有点尴尬,但幸运的是也有一个 function

请注意,上图是双对数刻度,因此 40 左右的加速并不少见。因此,选择一个快速的大小可以让你的计算速度提高几个数量级! (我很难发现这一点)。