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
要重采样的数据。
- upint
上采样因子。
- downint
下采样因子。
- axisint, 可选
要重采样的 x 的轴。默认为 0。
- windowstring, tuple, or array_like, 可选
用于设计低通滤波器的期望窗口,或要使用的 FIR 滤波器系数。有关详细信息,请参见下文。
- padtypestring, 可选
constant、line、mean、median、maximum、minimum 或
scipy.signal.upfirdn
支持的任何其他信号扩展模式。更改边界之外值的假设。如果 constant,则假定为 cval(默认值为零)。如果 line,则假定为继续由第一个和最后一个点定义的线性趋势。mean、median、maximum 和 minimum 的工作方式与 np.pad 中相同,并假定边界之外的值分别是沿轴的数组的均值、中值、最大值或最小值。在 1.4.0 版本中添加。
- cvalfloat, 可选
如果 padtype='constant',则要使用的值。默认为零。
在 1.4.0 版本中添加。
- 返回:
- resampled_xarray
重采样后的数组。
说明
当样本数量较大且为素数,或者当样本数量较大且 up 和 down 共享一个较大的最大公约数时,此多相方法可能比
scipy.signal.resample
中的傅里叶方法更快。所使用的 FIR 滤波器的长度将取决于max(up, down) // gcd(up, down)
,并且多相滤波期间的操作次数将取决于滤波器长度和 down (有关详细信息,请参阅scipy.signal.upfirdn
)。参数 window 指定 FIR 低通滤波器设计。
如果 window 是 array_like,则假定它是 FIR 滤波器系数。请注意,FIR 滤波器是在上采样步骤之后应用的,因此它应该被设计为在比原始频率高 up//gcd(up, down) 倍的采样频率下对信号进行操作。此函数的输出将以此数组为中心,因此如果需要零相位滤波器(通常情况下),最好传递具有奇数个样本的对称滤波器。
对于任何其他类型的 window,将调用函数
scipy.signal.get_window
和scipy.signal.firwin
来生成适当的滤波器系数。返回向量的第一个样本与输入向量的第一个样本相同。样本之间的间距从
dx
更改为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()
可以通过使用 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()