2012-03-09 96 views
4

我有一個模擬程序產生的信號。由於該程序中的求解器具有可變的時間步長,因此我有一個信號間隔不均勻的數據。我有兩個列表,一個帶有信號值的列表,另一個列出每個值發生的時間。數據可能是這樣的頻率分析與Python中的不均勻間隔數據

npts = 500 
t=logspace(0,1,npts) 
f1 = 0.5 
f2 = 0.6 
sig=(1+sin(2*pi*f1*t))+(1+sin(2*pi*f2*t)) 

我想能夠使用python執行此信號的頻率分析。看來我不能在numpy中使用fft函數,因爲這需要均勻間隔的數據。有沒有什麼標準功能可以幫助我找到這個信號中包含的頻率?

回答

6

解決此類問題的最常用算法稱爲頻率的Least-Squares Spectral analysis。看起來這將在scipy.signals package的未來版本中。也許有一個當前的版本,但我似乎無法找到它...此外,有一些代碼可從Astropython,我不會複製它的全部,但它本質上創建一個Lomb類,您可以使用下面的代碼來得到一些價值出來..你需要做的是:

import numpy 
import lomb 
x = numpy.arange(10) 
y = numpy.sin(x) 
fx,fy, nout, jmax, prob = lomb.fasper(x,y, 6., 6.) 
+1

在lomb類中似乎確實存在一些縮進問題,但除此之外,它正如我所希望的那樣工作! – Katt 2012-03-09 16:01:59

+0

固定縮進的要點鏈接:https://gist.github.com/louismullie/1cb1cae74ef76513827a – user2398029 2015-01-05 01:42:21

2

很簡單,只是仰望公式傅立葉變換,並執行它作爲您的數據值離散總和:

給定的一組值f(x)通過一些組x,則對於每個頻率k

F(k) = sum_x (exp(+/-i * k *x)) 

選擇您的k的範圍從02*pi/min separation in x

,並可以使用2 * pi/max(x)作爲增量大小

爲測試條件下,使用的東西,你知道正確的答案,C.F.,對於一些k'一個cos(k' * x),或高斯。

+1

請考慮回答一個示例輸出,因爲它會幫助很多用戶如何找到這個問題。 – 2015-05-05 15:54:43

+0

這只是該功能的原理圖。 F(k)在你選擇的任何一組k值上將是複數值。 – DrM 2015-05-05 17:52:49

+0

還有一點評論,這種方法將自變量的輸入集作爲一組delta函數來處理,這與FFT中隱含的相同。 – DrM 2015-05-05 18:51:45