具有相同输入大小的快速和非常慢的scipy.signal.resample

时间:2018-09-14 17:30:28

标签: python numpy scipy fft resampling

根据scipy.signal.resample的文档,速度应根据输入的长度而有所不同:

  

如前所述,重采样使用FFT转换,如果输入采样的数量较大且质数较大,则转换速度可能非常慢,请参阅scipy.fftpack.fft。

但是我使用相同的输入的时序(系数x14)非常不同,并且所需输出尺寸只有很小的变化:

import numpy as np, time
from scipy.signal import resample

x = np.random.rand(262144, 2)
y = np.random.rand(262144, 2)

t0 = time.time()
resample(x, 233543, axis=0)
print time.time() - t0          # 2.9 seconds here

t0 = time.time()
resample(y, 220435, axis=0)
print time.time() - t0          # 40.9 seconds here!

问题:我可以将输入零填充为2的幂(以照常加速FFT计算),但是由于我的重采样因子是固定的,所以我不能同时具有2的幂表示输入大小,2的幂表示所需的输出大小。

如何加快scipy.signal.resample的速度?

如果不可能的话,并且如果scipy.signal.resample的性能可以很大程度地变化很大,那么它真的不方便实际使用。那对哪个应用有用呢?

注意:我的目标是音频重采样(重音等)

编辑:最好的解决方案是to use this

1 个答案:

答案 0 :(得分:1)

  

重采样过程由FFT(输入大小),零填充和逆FFT(输出大小)组成。因此,不便的输出大小将使其速度降低,与不便的输入大小一样。

仅需补充一点,这仅适用于上采样。下采样的过程是:FFT->乘法-> iFFT->下采样。因此在下采样中,FFT / iFFT与输出大小无关,而与输入大小无关。