scipy.signal.

resample_poly#

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 倍。預設情況下,訊號邊界之外的值在濾波步驟中會被假設為零。

參數:
xarray_like

要重新取樣的資料。

upint

升採樣因子。

downint

降採樣因子。

axisint,選用

要重新取樣的 x 軸。預設值為 0。

windowstring、tuple 或 array_like,選用

用於設計低通濾波器的所需視窗,或要使用的 FIR 濾波器係數。詳情請參閱下方。

padtypestring,選用

constantlinemeanmedianmaximumminimumscipy.signal.upfirdn 支援的任何其他訊號擴展模式。變更對邊界之外值的假設。如果為 constant,則假設為 cval(預設為零)。如果為 line,則假設繼續由第一個和最後一個點定義的線性趨勢。meanmedianmaximumminimum 的運作方式與 np.pad 相同,並假設邊界之外的值分別是陣列沿軸的平均值、中位數、最大值或最小值。

在 1.4.0 版本中新增。

cvalfloat,選用

如果 padtype='constant',則使用的值。預設值為零。

在 1.4.0 版本中新增。

回傳值:
resampled_xarray

重新取樣的陣列。

另請參閱

decimate

在應用 FIR 或 IIR 濾波器後,對訊號進行降採樣。

resample

使用 FFT 方法向上或向下重新取樣。

說明

當樣本數量很大且為質數,或者當樣本數量很大且 updown 共享很大的最大公因數時,此多相方法可能會比 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_windowscipy.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()
../../_images/scipy-signal-resample_poly-1_00_00.png

可以使用 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()
../../_images/scipy-signal-resample_poly-1_01_00.png
../../_images/scipy-signal-resample_poly-1_01_01.png