2010-04-03 38 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

相关问题