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

问题描述 投票:0回答:2

根据scipy.signal.resample的文档,速度应根据输入的长度而变化:

如上所述,resample使用FFT转换,如果输入样本的数量很大且为prime,则转换速度非常慢,请参阅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

python numpy scipy fft resampling
2个回答
2
投票

有点误导性的文档说明了故事的一部分。重采样过程包括FFT(输入大小),零填充和反向FFT(输出大小)。因此,不方便的输出尺寸会减慢它的速度,就像输入尺寸不方便一样。

Cris Luengo建议在空间域中使用直接插值,这应该更快。例如,ndimage.zoom使用它(默认为三次样条插值):

from scipy.ndimage import zoom
t0 = time.time()
zoom(y, (220435./262144., 1))   # maybe with prefilter=False ? up to you
print(time.time() - t0)         # about 200 times faster than resample

与resample不同的输出(毕竟是一种不同的方法),但对于平滑数据(与此处使用的随机输入不同),它们应该接近。


1
投票

重采样过程包括FFT(输入大小),零填充和反向FFT(输出大小)。因此,不方便的输出尺寸会减慢它的速度,就像输入尺寸不方便一样。

只是补充说,这只是上采样的情况。对于下采样的过程是:FFT - >乘法 - > iFFT - >下采样。因此在下采样中,FFT / iFFT与输出大小无关,只与输入大小有关。

© www.soinside.com 2019 - 2024. All rights reserved.