2010-04-03 31 views
4

我有一組數據是週期性的(但不是正弦曲線)。我在一個矢量中有一組時間值,而在第二個矢量中有一組幅度。我想快速估計函數的週期。有什麼建議麼?什麼是使用Octave來近似數據週期的最快方法?

具體來說,這是我現在的代碼。我想用向量t近似向量x(:,2)的週期。最終,我想要做很多初始條件,並計算每個週期並繪製結果。

function xdot = f (x,t) 
     xdot(1) =x(2); 
     xdot(2) =-sin(x(1)); 
endfunction 

x0=[1;1.75];  #eventually, I'd like to try lots of values for x0(2) 
t = linspace (0, 50, 200); 


x = lsode ("f", x0, t) 

plot(x(:,1),x(:,2)); 

謝謝!

約翰

回答

2

離散傅立葉變換可以給你週期性。更長的時間窗口給你更多的頻率分辨率,所以我將你的t定義更改爲t = linspace(0, 500, 2000)time domain http://img402.imageshack.us/img402/8775/timedomain.png(這是一個link to the plot,它看起來更好的託管網站)。 你可以這樣做:

h = hann(length(x), 'periodic'); %# use a Hann window to reduce leakage 
y = fft(x .* [h h]); %# window each time signal and calculate FFT 
df = 1/t(end); %# if t is in seconds, df is in Hz 
ym = abs(y(1:(length(y)/2), :)); %# we just want amplitude of 0..pi frequency components 
semilogy(((1:length(ym))-1)*df, ym); 

frequency domain http://img406.imageshack.us/img406/2696/freqdomain.pngPlot link.

綜觀圖中,第一個高峯是在約0.06赫茲,相當於在plot(t,x)看到16第2期。

儘管這在計算上並不快。 FFT是N * log(N)運算。

+2

對於確定一般週期性,FFT不適用。例如,如果信號是兩個分量的總和,一個週期爲5T,另一個週期爲7T,則信號週期爲35T,但這不會在FFT中顯示。自相關是這項任務的更好選擇。 – tom10 2010-04-04 23:43:32

+0

@ tom10 - FFT方法取決於在觀測中有幾個週期的信號,但我認爲這對任何非分析方法都是正確的,不是嗎? – mtrw 2010-04-04 23:58:27

+0

樣本長度不在我在這裏討論的內容(儘管你對此是正確的)。嘗試繪製sin(t/2)+ sin(t/3)並觀察週期性,然後將其與FFT進行比較,您可以看到週期和FFT沒有如此明顯的相關性。 – tom10 2010-04-05 00:18:21

6

看看自動關聯功能。

Wikipedia

自相關是信號與 本身 互相關。非正式地,它們之間的時間間隔爲 函數的觀測值之間的相似性爲 。這是一個用於查找重複模式, 的數學工具,例如存在已被掩埋在噪音下的週期性信號,或識別其諧波頻率隱含的信號 中的基本頻率。 它通常用於信號處理 用於分析函數或一系列值,如時域信號。

Paul Bourke介紹瞭如何基於快速傅里葉變換(link)有效地計算自相關函數。

+0

這比我的建議好得多。在Octave中,你可以執行以下操作:'[xx,lags] = xcorr(x); plot(lag,xx(:,[1 4]));'(xx的第2和第3列是互相關)並且看看兩個自相關的峯之間的分隔。 – mtrw 2010-04-05 01:09:40

+0

@midtiby你能否更新鏈接? – nouveau 2012-10-20 06:48:05

+1

@Jay鏈接現在已更新。 – midtiby 2012-10-24 13:35:28

相關問題