cupyx.scipy.signal.resample_poly#

cupyx.scipy.signal.resample_poly(x, up, down, axis=0, window=('kaiser', 5.0), padtype='constant', cval=None)[source]#

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

信号 x 通过因子 up 进行上采样,然后应用零相位低通 FIR 滤波器,再通过因子 down 进行下采样。结果采样率是原始采样率的 up / down 倍。滤波步骤中,超出信号边界的值被假定为零。

参数:
  • x (array_like) – 要重采样的数据。

  • up (int) – 上采样因子。

  • down (int) – 下采样因子。

  • axis (int, 可选) – x 中要进行重采样的轴。默认为 0。

  • window (字符串, tuple, 或 array_like, 可选) – 用于设计低通滤波器的期望窗口,或使用的 FIR 滤波器系数。详情见下文。

  • padtype (字符串, 可选) – constant, line, mean, median, maximum, minimumcupyx.scipy.signal.upfirdn 支持的任何其他信号扩展模式。更改了对边界外值的假设。如果为 constant,假定为 cval(默认为零)。如果为 line,假定延续由第一个点和最后一个点定义的线性趋势。mean, median, maximumminimum 的工作方式与 cupy.pad 类似,并假定边界外的值分别是沿该轴的数组的均值、中位数、最大值或最小值。

  • cval (float, 可选) – 如果 padtype=’constant’,则使用的值。默认为零。

返回值:

resampled_x – 重采样后的数组。

返回类型:

数组

另请参阅

decimate

在应用 FIR 或 IIR 滤波器后对信号进行下采样。

resample

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

注意事项

当采样点数很大且为素数,或采样点数很大且 updown 具有较大的最大公约数时,这种多相方法可能比 cusignal.resample 中的傅里叶方法更快。使用的 FIR 滤波器的长度取决于 max(up, down) // gcd(up, down),而多相滤波期间的操作次数取决于滤波器长度和 down(详情请参阅 cusignal.upfirdn)。

参数 window 指定了 FIR 低通滤波器的设计。

如果 window 是 array_like 类型,则假定它为 FIR 滤波器系数。请注意,FIR 滤波器是在上采样步骤后应用的,因此它应该设计为在采样频率高于原始信号 up//gcd(up, down) 倍的信号上运行。此函数的输出将相对于此数组居中,因此如果需要零相位滤波器(通常如此),最好传递一个具有奇数采样点的对称滤波器。

对于任何其他类型的 window,将调用函数 cusignal.get_windowcusignal.firwin 来生成相应的滤波器系数。

返回向量的第一个采样点与输入向量的第一个采样点相同。采样点之间的间距从 dx 变为 dx * down / float(up)

示例

请注意,对于 FFT 方法,重采样数据的末端会上升到下一个周期的第一个采样点,而对于多相方法,则会更接近零。

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