Matlab 什么';用八度音阶近似数据周期的最快方法是什么?

Matlab 什么';用八度音阶近似数据周期的最快方法是什么?,matlab,signal-processing,fft,octave,Matlab,Signal Processing,Fft,Octave,我有一组周期性的数据(但不是正弦曲线)。我在一个向量中有一组时间值,在第二个向量中有一组振幅。我想快速估算一下函数的周期。有什么建议吗 具体来说,这是我当前的代码。我想用向量t来近似向量x(:,2)的周期。最后,我想对很多初始条件进行计算,计算每个条件的周期,并绘制结果 function xdot = f (x,t) xdot(1) =x(2); xdot(2) =-sin(x(1)); endfunction x0=[1;1.75]; #event

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

具体来说,这是我当前的代码。我想用向量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));
谢谢大家!


约翰

离散傅里叶变换可以给出周期性。更长的时间窗口提供了更高的频率分辨率,因此我将您的
t
定义更改为
t=linspace(05002000)
。 (这是一个例子,它在托管网站上看起来更好)。 你可以做:

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);

查看图表,第一个峰值约为0.06 Hz,对应于
绘图(t,x)
中显示的16秒周期


但计算速度并没有那么快。FFT是N*log(N)运算。

看看自相关函数

自相关是最重要的 信号与信号的互相关 它本身非正式地说,这是 作为一个整体的观察结果之间的相似性 分时功能 在他们之间。这是一个数学问题 用于查找重复模式的工具, 例如周期性的 被掩埋在地下的信号 噪音,或识别丢失的 信号中的基频 由其谐波频率暗示。 它通常用于信号处理 用于分析函数或一系列 值,例如时域信号


Paul Bourke描述了如何基于快速傅里叶变换()有效地计算自相关函数。

FFT无法很好地确定一般周期性。例如,如果信号是两个分量的总和,一个是周期5T,另一个是周期7T,则信号的周期将为35T,但这不会显示在FFT中。对于这项任务来说,自相关是一个更好的选择。@tom10-FFT方法取决于观测中有几个周期的信号,但我认为这对于任何非分析方法都是正确的,不是吗?样本长度不是我在这里所说的(尽管你说得对)。试着画sin(t/2)+sin(t/3)并观察周期性,然后将其与FFT进行比较,你会发现周期和FFT之间没有那么明显的相关性。。。O(N logn)相当快。如果你怀疑某个特定的频率或频带,有更快的算法,但你肯定不会比O(N)做得更好。这比我的建议要好得多。在倍频程中,可以执行以下操作:
[xx,lags]=xcorr(x);绘图(滞后,xx(:,[14])(xx的第2列和第3列是互相关)并查看两个自相关峰之间的分离。