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()
考虑以下信号
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)