И быстрый, и очень медленный scipy.signal.resample с одинаковым размером ввода - PullRequest
0 голосов
/ 14 сентября 2018

Согласно документации scipy.signal.resample, скорость должна варьироваться в зависимости от длины ввода :

Как уже отмечалось, для повторной выборки используется БПФпреобразования, которые могут быть очень медленными, если число входных выборок велико и простое, см. 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 может сильно измениться с большим коэффициентом, то это действительно не пригодится на самом делеиспользовать.Тогда для какого приложения это полезно?

Примечание: моя цель - ресэмплирование звука (повторное воспроизведение и т. Д.)

Редактировать: наконец-то лучше всего использовать , чтобы использовать .

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Процесс повторной выборки состоит из БПФ (входной размер), заполнения нулями и обратного БПФ (выходной размер). Таким образом, неудобный размер вывода замедлит его так же, как и неудобный размер ввода.

только для того, чтобы добавить, что это только для повышения частоты дискретизации. для понижающей дискретизации используется следующий процесс: FFT -> multiply -> iFFT -> downsample. поэтому при понижающей дискретизации FFT / iFFT не имеет ничего общего с размером вывода, а только с размером ввода.

0 голосов
/ 14 сентября 2018

Строка документа, несколько вводящая в заблуждение, описывает одну часть истории.Процесс повторной выборки состоит из FFT (входной размер), дополнения нулями и обратного FFT (выходной размер).Таким образом, неудобный размер вывода замедлит его так же, как и неудобный размер ввода.

Крис Луенго предложил использовать прямую интерполяцию в пространственной области, которая должна быть здесь быстрее.Например, 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

Не тот же вывод, что и при повторной выборке (другой метод в конце концов), но для гладких данных (в отличие от случайного ввода используется здесь) они должны быть близки.

...