Python知识: scipy signal.chirp用法例
一、說明
scipy signal.chirp是產(chǎn)生波形的函數(shù),可以虛擬出聲音波形。與Wave配合可以實(shí)現(xiàn)虛擬音響。
二、函數(shù)用法?
scipy.signal.chirp(t, f0, t1, f1, method='linear', phi=0, vertex_zero=True)Frequency-swept余弦發(fā)生器。
在下文中,‘Hz’應(yīng)解釋為“每單位循環(huán)數(shù)”;此處不要求單位為一秒。重要的區(qū)別是旋轉(zhuǎn)單位是周期,而不是弧度。同樣,t可以表示空間而不是時間。
參數(shù):
t:array_like
評估波形的時間。
f0:float
在時間t = 0處的頻率(例如Hz)。
t1:float
指定f1的時間。
f1:float
在時間t1處的波形頻率(例如Hz)。
method:{‘linear’, ‘quadratic’, ‘logarithmic’, ‘hyperbolic’}, 可選參數(shù)
頻率掃描的種類。如果未給出,則假定為線性。有關(guān)更多詳細(xì)信息,請參見下面的注釋。
phi:float, 可選參數(shù)
相位偏移,以度為單位。默認(rèn)值為0。
vertex_zero:bool, 可選參數(shù)
僅當(dāng)方法為‘quadratic’時才使用此參數(shù)。它確定拋物線的頂點(diǎn)(即頻率的圖表)是在t = 0還是在t = t1。
返回值:
y:ndarray
包含在t處以請求的time-varying頻率評估的信號的numpy數(shù)組。更準(zhǔn)確地說,函數(shù)返回cos(phase?+?(pi/180)*phi)其中相是整數(shù)(從0到t的)2*pi*f(t)。f(t)在下面定義。
注意:
該方法有四個選項。以下公式給出了由chirp()生成的信號的瞬時頻率(以Hz為單位)。為了方便起見,也可以使用下面顯示的簡稱。
1)線性簡稱:linear, lin, li:
f(t)?=?f0?+?(f1?-?f0)?*?t?/?t1
2) 拋物線形:quadratic, quad, q:
頻率f(t)的曲線是一條通過(0,f0)和(t1,f1)的拋物線。默認(rèn)情況下,拋物線的頂點(diǎn)位于(0,f0)。如果vertex_zero為False,則頂點(diǎn)位于(t1,f1)。公式是:
if vertex_zero is True:
f(t)?=?f0?+?(f1?-?f0)?*?t**2?/?t1**2
else:
f(t)?=?f1?-?(f1?-?f0)?*?(t1?-?t)**2?/?t1**2
To use a more general quadratic function, or an arbitrary polynomial, use the function?scipy.signal.sweep_poly.
3 )對數(shù)形 logarithmic, log, lo:
f(t)?=?f0?*?(f1/f0)**(t/t1)
f0 and f1 must be nonzero and have the same sign.
This signal is also known as a geometric or exponential chirp.
4)雙曲形hyperbolic, hyp:
f(t)?=?f0*f1*t1?/?((f0?-?f1)*t?+?f1*t1)
f0 and f1 must be nonzero.
三、例子?
示例中將使用以下內(nèi)容:
>>> from scipy.signal import chirp, spectrogram >>> import matplotlib.pyplot as plt對于第一個示例,我們將繪制10秒內(nèi)從6 Hz到1 Hz的線性chi的波形:
>>> t = np.linspace(0, 10, 5001) >>> w = chirp(t, f0=6, f1=1, t1=10, method='linear') >>> plt.plot(t, w) >>> plt.title("Linear Chirp, f(0)=6, f(10)=1") >>> plt.xlabel('t (sec)') >>> plt.show()對于其余示例,我們將使用更高的頻率范圍,并使用scipy.signal.spectrogram。我們將以8000 Hz的頻率采樣10秒。
fs = 8000 T = 10 t = np.linspace(0, T, T*fs, endpoint=False)在10秒內(nèi)從1500 Hz到250 Hz的二次chi(頻率的拋物線曲線的頂點(diǎn)在t = 0處):
w = chirp(t, f0=1500, f1=250, t1=10, method='quadratic') ff, tt, Sxx = spectrogram(w, fs=fs, noverlap=256, nperseg=512, nfft=2048) plt.pcolormesh(tt, ff[:513], Sxx[:513], cmap='gray_r') plt.title('Quadratic Chirp, f(0)=1500, f(10)=250') plt.xlabel('t (sec)') plt.ylabel('Frequency (Hz)') plt.grid() plt.show()在10秒內(nèi)從1500 Hz到250 Hz的二次chi(頻率的拋物線曲線的頂點(diǎn)在t = 10處):
>>> w = chirp(t, f0=1500, f1=250, t1=10, method='quadratic', ... vertex_zero=False) >>> ff, tt, Sxx = spectrogram(w, fs=fs, noverlap=256, nperseg=512, ... nfft=2048) >>> plt.pcolormesh(tt, ff[:513], Sxx[:513], cmap='gray_r') >>> plt.title('Quadratic Chirp, f(0)=1500, f(10)=250\n' + ... '(vertex_zero=False)') >>> plt.xlabel('t (sec)') >>> plt.ylabel('Frequency (Hz)') >>> plt.grid() >>> plt.show()在10秒內(nèi)從1500 Hz到250 Hz的對數(shù)chi:
>>> w = chirp(t, f0=1500, f1=250, t1=10, method='logarithmic') >>> ff, tt, Sxx = spectrogram(w, fs=fs, noverlap=256, nperseg=512, ... nfft=2048) >>> plt.pcolormesh(tt, ff[:513], Sxx[:513], cmap='gray_r') >>> plt.title('Logarithmic Chirp, f(0)=1500, f(10)=250') >>> plt.xlabel('t (sec)') >>> plt.ylabel('Frequency (Hz)') >>> plt.grid() >>> plt.show()在10秒內(nèi)從1500 Hz到250 Hz的雙曲chi:
>>> w = chirp(t, f0=1500, f1=250, t1=10, method='hyperbolic') >>> ff, tt, Sxx = spectrogram(w, fs=fs, noverlap=256, nperseg=512, ... nfft=2048) >>> plt.pcolormesh(tt, ff[:513], Sxx[:513], cmap='gray_r') >>> plt.title('Hyperbolic Chirp, f(0)=1500, f(10)=250') >>> plt.xlabel('t (sec)') >>> plt.ylabel('Frequency (Hz)') >>> plt.grid() >>> plt.show()源碼:
scipy.signal.chirp的API實(shí)現(xiàn)見:[源代碼]
總結(jié)
以上是生活随笔為你收集整理的Python知识: scipy signal.chirp用法例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python知识:生成声波并显示
- 下一篇: QT教程2:QT5的体系构架