scipy.signal.

resample_poly#

scipy.signal.resample_poly(x, вверх, вниз, ось=0, window=('kaiser', 5.0), padtype='constant', cval=None)[источник]#

Resample x вдоль заданной оси с использованием полифазной фильтрации.

Сигнал x увеличивается выборкой с коэффициентом вверх, применяется низкочастотный КИХ-фильтр с нулевой фазой, а затем он прореживается с коэффициентом вниз. Результирующая частота дискретизации составляет up / down раз исходной частоты дискретизации. По умолчанию значения за границами сигнала предполагаются нулевыми на этапе фильтрации.

Параметры:
xarray_like

Данные для повторной выборки.

вверхint

Коэффициент повышения частоты дискретизации.

внизint

Коэффициент понижающей дискретизации.

осьint, необязательный

Ось x который передискретизируется. По умолчанию 0.

windowстрока, кортеж или array_like, необязательно

Желаемое окно для использования при проектировании фильтра нижних частот или коэффициенты КИХ-фильтра для применения. Подробности см. ниже.

padtypestring, optional

константа, line, mean, медиана, maximum, минимум или любой из других режимов расширения сигнала, поддерживаемых scipy.signal.upfirdn. Изменяет предположения о значениях за границей. Если константа, предполагается, что cval (по умолчанию ноль). Если line предполагается продолжение линейного тренда, определённого первой и последней точками. mean, медиана, maximum и минимум работают как в np.pad и предполагает, что значения за границей являются средним, медианой, максимумом или минимумом массива вдоль оси соответственно.

Добавлено в версии 1.4.0.

cvalfloat, опционально

Значение для использования, если padtype=’constant’. По умолчанию равно нулю.

Добавлено в версии 1.4.0.

Возвращает:
resampled_xмассив

Передискретизированный массив.

Смотрите также

decimate

Понижение частоты дискретизации сигнала после применения КИХ или БИХ фильтра.

resample

Передискретизация вверх или вниз с использованием метода БПФ.

Примечания

Этот полифазный метод, вероятно, будет быстрее, чем метод Фурье в scipy.signal.resample когда количество выборок велико и простое, или когда количество выборок велико и вверх и вниз имеют большой общий делитель. Длина используемого КИХ-фильтра будет зависеть от max(up, down) // gcd(up, down), и количество операций при полифазной фильтрации будет зависеть от длины фильтра и вниз (см. scipy.signal.upfirdn подробности).

Аргумент window определяет конструкцию ФНЧ-фильтра.

Если window является array_like, предполагается, что это коэффициенты КИХ-фильтра. Обратите внимание, что КИХ-фильтр применяется после шага повышения частоты дискретизации, поэтому он должен быть разработан для работы с сигналом на частоте дискретизации, превышающей исходную в up//gcd(up, down). Выходные данные этой функции будут центрированы относительно этого массива, поэтому лучше передавать симметричный фильтр с нечётным количеством отсчётов, если, как обычно, требуется фильтр с нулевой фазой.

Для любого другого типа window, функции scipy.signal.get_window и scipy.signal.firwin вызываются для генерации соответствующих коэффициентов фильтра.

Первый отсчёт возвращаемого вектора совпадает с первым отсчётом входного вектора. Расстояние между отсчётами изменяется с dx to dx * down / float(up).

Примеры

По умолчанию конец передискретизированных данных поднимается, чтобы встретить первую выборку следующего цикла для метода FFT, и приближается к нулю для полифазного метода:

>>> import numpy as np
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(0, 10, 20, endpoint=False)
>>> y = np.cos(-x**2/6.0)
>>> f_fft = signal.resample(y, 100)
>>> f_poly = signal.resample_poly(y, 100, 20)
>>> xnew = np.linspace(0, 10, 100, endpoint=False)
>>> plt.plot(xnew, f_fft, 'b.-', xnew, f_poly, 'r.-')
>>> plt.plot(x, y, 'ko-')
>>> plt.plot(10, y[0], 'bo', 10, 0., 'ro')  # boundaries
>>> plt.legend(['resample', 'resamp_poly', 'data'], loc='best')
>>> plt.show()
../../_images/scipy-signal-resample_poly-1_00_00.png

Это поведение по умолчанию можно изменить с помощью опции padtype:

>>> N = 5
>>> x = np.linspace(0, 1, N, endpoint=False)
>>> y = 2 + x**2 - 1.7*np.sin(x) + .2*np.cos(11*x)
>>> y2 = 1 + x**3 + 0.1*np.sin(x) + .1*np.cos(11*x)
>>> Y = np.stack([y, y2], axis=-1)
>>> up = 4
>>> xr = np.linspace(0, 1, N*up, endpoint=False)
>>> y2 = signal.resample_poly(Y, up, 1, padtype='constant')
>>> y3 = signal.resample_poly(Y, up, 1, padtype='mean')
>>> y4 = signal.resample_poly(Y, up, 1, padtype='line')
>>> for i in [0,1]:
...     plt.figure()
...     plt.plot(xr, y4[:,i], 'g.', label='line')
...     plt.plot(xr, y3[:,i], 'y.', label='mean')
...     plt.plot(xr, y2[:,i], 'r.', label='constant')
...     plt.plot(x, Y[:,i], 'k-')
...     plt.legend()
>>> plt.show()
../../_images/scipy-signal-resample_poly-1_01_00.png
../../_images/scipy-signal-resample_poly-1_01_01.png