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массив
Передискретизированный массив.
Смотрите также
Примечания
Этот полифазный метод, вероятно, будет быстрее, чем метод Фурье в
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вызываются для генерации соответствующих коэффициентов фильтра.Первый отсчёт возвращаемого вектора совпадает с первым отсчётом входного вектора. Расстояние между отсчётами изменяется с
dxtodx * 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()
Это поведение по умолчанию можно изменить с помощью опции 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()