我想知道如何确定一系列数据是否是周期性的。
我想使用傅立叶变换/级数。我的数据看起来不是周期性的
[111100001111000110010101010000101]
或定期
[11001100110011001100]
我需要自动决定它是哪个。我可以执行哪些类型的分析或计算来确定信号是否是周期性的?
我想知道如何确定一系列数据是否是周期性的。
我想使用傅立叶变换/级数。我的数据看起来不是周期性的
[111100001111000110010101010000101]
或定期
[11001100110011001100]
我需要自动决定它是哪个。我可以执行哪些类型的分析或计算来确定信号是否是周期性的?
我会做一个归一化的自相关来确定周期性。如果它是周期个样本处看到峰值。“1”的归一化结果意味着完美的周期性,“0”意味着在该周期根本没有周期性,介于两者之间的值意味着不完美的周期性。在进行自相关之前从数据序列中减去数据序列的平均值,因为它会使结果产生偏差。
由于重叠样本较少,峰值将趋向于远离中心越远而减小。您可以通过将结果乘以重叠样本百分比的倒数来减轻这种影响。
编辑:这是如何判断序列是否是周期性的示例。下面是matlab代码。
s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
plot(xcorr(s1n, 'unbiased'))
xcorr 函数的“无偏”参数告诉它执行上面等式中描述的缩放。但是,自相关并未归一化,这就是为什么中心的峰值在 0.25 而不是 1 左右的原因。不过,这并不重要,只要我们记住中心峰值是完全相关的。我们看到除了最外边缘没有其他对应的峰。那些无关紧要,因为只有一个样本重叠,所以这没有意义。
s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
plot(xcorr(s2n, 'unbiased'))
在这里,我们看到序列是周期性的,因为存在多个与中心峰值具有相同幅度的无偏自相关峰值。
吉姆的回答让我思考如何在统计上对此进行测试。这使我想到了Durbin-Watson 自相关检验。
它的概括是形成:
我在 scilab 中实现这一点的尝试是:
// http://en.wikipedia.org/wiki/Durbin%E2%80%93Watson_statistic
s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
xs1 = xcorr(s1n,"unbiased");
N1 = length(xs1);
s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
xs2 = xcorr(s2n,"unbiased");
N2 = length(xs2);
dwstat1 = [];
dwstat2 = [];
for lag = 1:15,
dxs1 = xs1((lag+1):N1) - xs1(1:(N1-lag));
dxs2 = xs2((lag+1):N2) - xs2(1:(N2-lag));
dwstat1 = [dwstat1 sum(dxs1.^2) / sum(xs1.^2)];
dwstat2 = [dwstat2 sum(dxs2.^2) / sum(xs2.^2)];
end;
结果是,如果对于给定的值,接近于零或接近于 4,那么那里就有一个周期性(自相关)。
如果我为我们的两个示例序列绘制结果:
然后很明显,第二个序列在滞后 4、8 等处表现出相关性,在滞后 2、6 等处表现出反相关。
我仍然不确定是怎么说是“接近” 0 或 4。我会进一步挖掘,看看我想出了什么。