resample#
- scipy.signal.resample(x, num, t=None, axis=0, window=None, domain='time')[原始碼]#
使用傅立葉方法沿給定軸將 x 重新取樣為 num 個樣本。
重新取樣的訊號從與 x 相同的值開始,但以
len(x) / num * (x 的間距)
的間距進行取樣。由於使用了傅立葉方法,因此訊號被假定為週期性的。- 參數:
- x類陣列
要重新取樣的資料。
- num整數
重新取樣訊號中的樣本數。
- t類陣列,選項性的
如果給定 t,則假定它是與 x 中的訊號資料相關聯的等間隔樣本位置。
- axis整數,選項性的
要重新取樣的 x 的軸。預設值為 0。
- window類陣列、可呼叫物件、字串、浮點數或元組,選項性的
指定應用於傅立葉域中訊號的視窗。詳情請參閱下方。
- domain字串,選項性的
指示輸入 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)