當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy signal.resample_poly用法及代碼示例


本文簡要介紹 python 語言中 scipy.signal.resample_poly 的用法。

用法:

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

使用多相濾波沿給定軸重新采樣 x。

信號x被因子上采樣向上, 應用zero-phase low-pass FIR 濾波器,然後按因子下采樣.結果采樣率為up / down倍原始采樣率。默認情況下,超出信號邊界的值在濾波步驟中被假定為零。

參數

x array_like

要重新采樣的數據。

up int

上采樣因子。

down int

下采樣因子。

axis 整數,可選

重新采樣的 x 軸。默認值為 0。

window 字符串、元組或類似數組,可選

用於設計low-pass 濾波器或要采用的 FIR 濾波器係數的所需窗口。詳情見下文。

padtype 字符串,可選

常量,,意思是,中位數,最大,最低限度或任何其他支持的信號擴展模式scipy.signal.upfirdn.改變對超出邊界的值的假設。如果常量, 假定是cval(默認為零)。如果假設繼續由第一個點和最後一個點定義的線性趨勢。意思是,中位數,最大最低限度像在一樣工作np.pad並假設超出邊界的值分別是沿軸的數組的平均值、中值、最大值或最小值。

cval 浮點數,可選

如果 padtype='constant' 時使用的值。默認為零。

返回

resampled_x 數組

重新采樣的數組。

注意

這種多相方法可能比傅裏葉方法更快scipy.signal.resample當樣本數很大且質數時,或當樣本數很大且向上共享一個很大的最大公分母。使用的 FIR 濾波器的長度取決於max(up, down) // gcd(up, down),並且多相濾波期間的操作數將取決於濾波器長度和(參考scipy.signal.upfirdn詳情)。

參數窗口指定 FIR low-pass 濾波器設計。

如果 window 是 數組 ,則假定它是 FIR 濾波器係數。請注意,FIR 濾波器是在上采樣步驟之後應用的,因此應將其設計為以比原始采樣頻率高 up//gcd(up, down) 倍的采樣頻率對信號進行操作。此函數的輸出將相對於此數組居中,因此如果通常需要 zero-phase 過濾器,則最好通過具有奇數個樣本的對稱過濾器。

對於任何其他類型的窗戶, 函數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()
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()
scipy-signal-resample_poly-1_01_00.png
scipy-signal-resample_poly-1_01_01.png

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.resample_poly。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。