如何确定离散信号是否为周期性信号?


12

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

我想使用傅立叶变换/级数。我的数据看起来不定期

[111100001111000110010101010000101]

或定期

[11001100110011001100]

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

Answers:


14

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

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

U(n)=A(n)N|Nn|
U(n)A(n)nN

编辑:这是一个如何判断序列是否为周期性的示例。以下是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函数的“ unbiased”参数告诉它执行上面的公式中所述的缩放。但是,自相关未进行归一化,这就是为什么中心峰位于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'))

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

定期的


3
A(n)

1
@PeterK好点。
Jim Clay

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

@safzam如果您正在使用Matlab或Python(numpy),它们已经具有自相关功能。如果您需要C / C ++ / Java /其他版本中的任何内容,请尝试here- dsprelated.com/showmessage/59527/1.php
Jim Clay

例如,我使用了以下两个信号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 6 2 3 2 3 0 2 1 1 [0 1] r1和r2都给出相同的彩虹曲线,如形状。.我如何在代码中确定一个信号是周期性的还是几乎周期性的或根本不是周期性的,谢谢
safzam 2013年

4

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

它的一般化形式为:

DW(τ)=n=τN1[U(n)U(nτ)]2n=0N1U(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;

DW(τ)τ

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

在此处输入图片说明

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

DW(τ)


多谢告诉我这个消息。实际上,我正在用python编写程序,在那里我得到了很多0和1的列表。我想分离周期性,随机,突发类型的系列。我正在python中尝试上述逻辑,但“ xcorr”函数不在python中,然后我使用了numpy.correlate(lst,lst,mode ='full')函数。列表还包含约70,000个0和1的列表。我只想确定此列表是否为周期性的...如果有一点非周期性,我可以避免。任何进一步的提示请。提前致谢。
safzam 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.