使用Octave估算数据周期的最快方法是什么?

时间:2010-04-03 19:43:29

标签: matlab signal-processing fft octave

我有一组周期性的数据(但不是正弦的)。我在一个向量中有一组时间值,在第二个向量中有一组幅度。我想快速估算一下这个函数的周期。有什么建议吗?

具体来说,这是我目前的代码。我想近似矢量x(:,2)对矢量t的周期。最后,我想在很多初始条件下执行此操作并计算每个条件的周期并绘制结果。

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 个答案:

答案 0 :(得分:6)

查看自动关联功能。

来自Wikipedia

  

自相关是   信号的互相关   本身。非正式地,它是   观察结果之间的相似性   时间分离的功能   它们之间。这是一个数学   寻找重复模式的工具,   例如存在周期性的   被掩埋的信号   噪音,或识别失踪   信号中的基频   其谐波频率暗示。   它通常用于信号处理   用于分析功能或系列   值,例如时域信号。

Paul Bourke描述了如何根据快速傅立叶变换(link)有效地计算自相关函数。

答案 1 :(得分: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.png Plot link.

查看图表,第一个峰值约为0.06 Hz,相当于plot(t,x)中的16秒周期。

这在计算上不是那么快。 FFT是N * log(N)运算。