scipy.signal.resample_poly

scipy.signal.resample_poly(x, up, down, axis=0, window=('kaiser', 5.0), padtype='constant', cval=None)[源代码]

重采样 x 沿给定轴使用多相滤波。

该信号 x 被因子进行了上采样 up ,应用零相位低通FIR过滤,然后按该因子进行下采样 down 。生成的采样率为 up / down 乘以原始采样率。默认情况下,在滤波步骤期间,信号边界以外的值被假定为零。

参数
xarray_like

要重新采样的数据。

up集成

上采样因子。

down集成

下采样系数。

axis整型,可选

的轴线 x 那是重新取样的。默认值为0。

window字符串、元组或array_like,可选

用于设计低通过滤的所需窗口,或要使用的FIR过滤系数。有关详细信息,请参阅下面的内容。

padtype字符串,可选

constantlinemeanmedianmaximumminimum 或支持的任何其他信号扩展模式 scipy.signal.upfirdn 。更改边界以外的值的假设。如果 constant ,假设是 cval (默认值为零)。如果 line 假定延续由第一个点和最后一个点定义的线性趋势。 meanmedianmaximumminimum 按照中的方式工作 np.pad 并且假设超出边界的值分别是阵列沿轴的平均值、中值、最大值或最小值。

1.4.0 新版功能.

cval浮动,可选

在以下情况下要使用的值 padtype='constant' 。默认值为零。

1.4.0 新版功能.

退货
resampled_x阵列

重新采样的数组。

参见

decimate

施加FIR或IIR过滤后,对信号进行下采样。

resample

使用FFT方法向上或向下重新采样。

注意事项

这种多相方法可能比傅立叶方法更快。 scipy.signal.resample 当样本数较大且质数时,或当样本数较大且 updown 有着巨大的、最伟大的公分母。使用的冷杉过滤的长度将取决于 max(up, down) // gcd(up, down) ,多相滤波过程中的操作次数将取决于过滤长度和 down (请参阅 scipy.signal.upfirdn 有关详细信息,请参见)。

这一论点 window 指定FIR低通过滤设计。

如果 window 是一个类似数组的数组,假设它是FIR过滤系数。请注意,FIR过滤是在上采样步骤之后应用的,因此它应该设计为以比原始频率高1倍的采样频率对信号进行操作 up//gcd(up, down) 。此函数的输出将相对于此数组居中,因此,如果需要零相位过滤(通常情况下),最好传递具有奇数个样本的对称过滤。

对于任何其他类型的 window 、函数 scipy.signal.get_windowscipy.signal.firwin 被调用以生成适当的过滤系数。

返回向量的第一个样本与输入向量的第一个样本相同。样本之间的间距从 dxdx * down / float(up)

示例

默认情况下,对于FFT方法,重采样数据的末尾上升以满足下一个周期的第一个样本,而对于多相方法,重采样数据的末尾变得更接近于零:

>>> from scipy import signal
>>> 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)
>>> import matplotlib.pyplot as plt
>>> 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

可以使用焊盘类型选项更改此默认行为:

>>> import numpy as np
>>> from scipy import signal
>>> 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')
>>> import matplotlib.pyplot as plt
>>> 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