scipy.signal.

resample#

scipy.signal.resample(x, num, t=None, axis=0, window=None, domain='time')[源代码]#

使用傅里叶方法沿给定轴将 x 重采样为 num 个样本。

重采样的信号起始值与 x 相同,但采样间隔为 len(x) / num * (x 的间隔)。由于使用了傅里叶方法,因此假定信号是周期性的。

参数:
xarray_like

要重采样的数据。

numint

重采样信号中的样本数。

tarray_like,可选

如果给定了 t,则假定它是与 x 中的信号数据相关的等间隔样本位置。

axisint,可选

要重采样的 x 的轴。默认值为 0。

windowarray_like, callable, string, float, or tuple,可选

指定应用于傅里叶域中信号的窗口。有关详细信息,请参见下文。

domainstring,可选

一个字符串,指示输入 x 的域:time 将输入 x 视为时域(默认),freq 将输入 x 视为频域。

返回:
resampled_x 或 (resampled_x, resampled_t)

重采样后的数组,或者,如果给定了 t,则返回一个包含重采样数组和相应重采样位置的元组。

另请参见

decimate

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

resample_poly

使用多相滤波和 FIR 滤波器进行重采样。

注释

参数 window 控制傅里叶域窗口,该窗口在零填充之前逐渐减小傅里叶频谱,以减轻采样信号的重采样值中的振铃效应,而您并不打算将其解释为带限信号。

如果 window 是一个函数,则会使用指示频率箱的输入向量调用该函数(即 fftfreq(x.shape[axis]) )。

如果 window 是与 x.shape[axis] 长度相同的数组,则假定它是直接在傅里叶域中应用的窗口(首先是直流和低频)。

对于任何其他类型的 window,将调用函数 scipy.signal.get_window 来生成窗口。

返回向量的第一个样本与输入向量的第一个样本相同。样本之间的间距从 dx 更改为 dx * len(x) / num

如果 t 不是 None,则仅用于计算重采样位置 resampled_t

如上所述,resample 使用 FFT 转换,如果输入或输出样本的数量很大且为质数,则可能会非常慢;请参见 fft。在这种情况下,可以先使用 resample_poly 将长度为 n 的信号下采样 n//num 倍,然后再使用 resample。请注意,此方法会更改抗混叠滤波器的特性。

示例

请注意,重采样数据的末端会上升以满足下一个周期的第一个样本

>>> import numpy as np
>>> from scipy import signal
>>> x = np.linspace(0, 10, 20, endpoint=False)
>>> y = np.cos(-x**2/6.0)
>>> f = signal.resample(y, 100)
>>> xnew = np.linspace(0, 10, 100, endpoint=False)
>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y, 'go-', xnew, f, '.-', 10, y[0], 'ro')
>>> plt.legend(['data', 'resampled'], loc='best')
>>> plt.show()
../../_images/scipy-signal-resample-1_00_00.png

考虑以下信号 y,其中 len(y) 是一个很大的质数

>>> N = 55949
>>> freq = 100
>>> x = np.linspace(0, 1, N)
>>> y = np.cos(2 * np.pi * freq * x)

由于 N 是质数,

>>> num = 5000
>>> f = signal.resample(signal.resample_poly(y, 1, N // num), num)

运行速度明显快于

>>> f = signal.resample(y, num)