我想知道如何确定一系列数据是否为周期性数据。

我想使用傅立叶变换/系列。我的数据看起来不是周期性的


[111100001111000110010101001010000101]


还是周期性的


[11001100110011001100]


,我需要确定它是自动的。我可以执行哪种类型的分析或计算以确定信号是否为周期性信号?

#1 楼

我将进行归一化自相关以确定周期性。如果周期为$ P $,那么您应该在结果中的每个$ P $采样处看到峰值。归一化的结果“ 1”表示完美的周期性,“ 0”表示在那个时段根本没有周期性,并且介于两者之间的值表示不完美的周期性。在进行自相关之前,请先从数据序列中减去数据序列的均值,因为这将使结果产生偏差。

峰会趋于减小,因为它们的重叠样本较少,所以离峰越远。您可以通过将结果乘以重叠样本百分比的倒数来减轻这种影响。

$$
U(n)= A(n)* \ frac {N} {\ lvert Nn \ rvert}
$$
其中$ U(n)$是无偏自相关,$ A(n)$是归一化自相关,$ n $是偏移量,$ N $是要检查周期性的数据序列中的样本数。

EDIT:这是一个如何判断序列是否为周期性的示例。以下是Matlab代码。xcorr函数的“ unbiased”参数告诉xcorr函数执行上面等式中描述的缩放。但是,自相关未进行归一化,这就是为什么中心峰位于0.25左右而不是1的原因。不过,只要我们牢记中心峰是完美相关,这没关系。我们看到,除了最外面的边缘,没有其他相应的峰。没关系,因为只有一个样本重叠,所以没有意义。



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


这里我们看到序列是周期性的,因为存在多个与中心峰幅度相同的无偏自相关峰。



评论


$ \ begingroup $
+1:您可能还想在形成$ A(n)$之前对数据进行均值校正,否则任何DC偏移都可能妨碍查找周期性峰值。
$ \ endgroup $
– Peter K.♦
13-4-24在13:51

$ \ begingroup $
@PeterK好点。
$ \ endgroup $
–吉姆·克莱(Jim Clay)
2013年4月24日14:13在

$ \ begingroup $
嗨,吉姆,谢谢..我对如何开始对此进行编程感到有些困惑,因为无论在哪里寻找自相关,我都会发现复杂的公式,但我并没有真正从哪里开始以及如何检测周期的峰值的想法。代码中的P。和我在一起,我有一个值列表V [] = {110011001100 ..}现在如何将它们放在自相关公式中,以及确定其是否为周期性...可以请给我一个简单的开始...非常感谢
$ \ endgroup $
–safzam
13年4月26日在10:00

$ \ begingroup $
@safzam如果您使用的是Matlab或Python(numpy),它们已经具有自相关功能。如果您需要使用C / C ++ / Java /其他工具,请尝试在此处dsprelated.com/showmessage/59527/1.php
$ \ endgroup $
–吉姆·克莱(Jim Clay)
2013年4月26日18:16



$ \ begingroup $
例如,我使用了以下两个信号s1和s2:s1 = [1、1、0、1、1、0、1、1、0、1、1] s2 = [1、0、1、1 ,1,0,1,0,0,0,1] r1 = numpy.correlate(s1,s1,mode ='full')r2 = numpy.correlate(s2,s2,mode ='full') python代码中的四行。我得到了r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1]和r2 = [1 0 1 1 2 2 3 3 2 3 2 6 2 3 2 3 0 2 1 1 [0 1] r1和r2都给出了一条类似形状的彩虹曲线。.我如何在代码中确定一个信号是垂直的还是接近周期性的,或者根本不是周期性的,谢谢
$ \ endgroup $
–safzam
13年4月29日在15:48



#2 楼

Jim的回答使我开始思考如何进行统计学检验。这导致我进行了Durbin-Watson自相关检验。

它的推广形式是:

$$
DW(\ tau)= \ frac { \ displaystyle \ sum_ {n = \ tau} ^ {N-1} \ left [U(n-U(n- \ tau)\ right] ^ 2} {\ displaystyle \ sum_ {n = 0} ^ {N -1} U(n)^ 2}
$$

,而我在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;


结果是,如果给定值$ \ tau $,$ DW(\ tau)$接近零或接近4,则那里存在周期性(自相关)。

如果我绘制了两个示例序列的结果:



然后很明显,第二个序列在4、8等的滞后表现出相关性,在4、8等的滞后表现出反相关性2、6等的延迟。

我仍然不知道该怎么说$ DW(\ tau)$“接近” 0或4。进一步,看看我想出了什么。

评论


$ \ begingroup $
感谢您提供此信息。实际上,我正在用python编写程序,在那里我得到了很多0和1的列表。我想分离周期性,随机,突发类型的系列。我正在python中尝试上述逻辑,但“ xcorr”函数不在python中,然后我使用了numpy.correlate(lst,lst,mode ='full')函数。该列表还包含约70,000个0和1的列表。我只想确定此列表是否为周期性的...如果有一点非周期性,我可以避免。任何进一步的提示请。提前致谢。
$ \ endgroup $
–safzam
13年5月15日在13:02