2017-07-14 47 views
1

我想對每個片段的具體樣本長度對我的數據執行短時傅里葉變換。我想使用來自信號子模塊的SciPy功能stft。但是,當我創建長度10e5以下方式的音頻陣列:使用SciPy stft函數指定片段中的樣本數量以進行短時傅立葉變換

fs = 10e3 # Sampling frequency 
N = 1e5 # Number of samples 
time = np.arange(N)/fs 
x = 500*np.cos(time) # Some random audio wave 
# x.shape gives (100000,) 

而且隨着nperseg=1000應用SciPy的stft功能,我並不如預期獲得100段。取而代之的是,輸出的形狀是:

f, t, Zxx = signal.stft(x, fs, nperseg=1000) 
print(Zxx.shape) # -> (501, 201) 

其中如果我理解文檔正確地501是「頻率籃子」和20001的數目是不同的時間段的數量,這是我原先打算是N/nperseg或10e5/1000 = 100.我確實看到該函數有一些參數來指定填充和重疊,但在N可被nperseg整除時,它究竟幹什麼?

回答

1

當我運行的代碼片段:

In [1]: import numpy as np 

In [2]: import scipy.signal as signal 

In [3]: fs = 10e3 # Sampling frequency 
    ...: N = 1e5 # Number of samples 
    ...: time = np.arange(N)/fs 
    ...: x = 500*np.cos(time) # Some random audio wave 
    ...: 

In [4]: f, t, Zxx = signal.stft(x, fs, nperseg=1000) 
    ...: print(Zxx.shape) # -> (501, 20001) 
    ...: 
(501, 201) 

我看到的Zxx輸出爲501 201

501,正如你說的,(頻率倉的數量1000時間塊每個分段在經過實數FFT之後變成501個頻率分區;如果您想要完全複雜的FFT,您可以通過return_onesided=False)。

201是因爲npersegnoverlap的組合。 docs表示noverlap是「段之間重疊的點數。如果None,noverlap = nperseg // 2。「因此,STFT是而不是製作1e5/1e3 = 1e2」段「,它重疊1e3長段500個樣本(半段),所以你最終多了200 重疊細分市場。

爲了得到你想要的東西,說noverlap=0

In [7]: f, t, Zxx = signal.stft(x, fs, nperseg=1000, noverlap=0) 

In [8]: Zxx.shape 
Out[8]: (501, 101) 

,我真的不知道爲什麼它會返回101段,而不是100 ...