【发布时间】:2013-06-20 14:17:40
【问题描述】:
我有一个信号在某些地方是周期性的,而在其他地方没有,我希望能够找到它周期性的范围(及时)。我无法在这里展示我的原始信号,但我将使用一个示例信号来说明我的问题:
示例信号:
vect=[randn([1,500]) sin(x) 1:500];
x=linspace(0, 20*Pi, 1000)
我想要一些可以告诉我信号在 500 到 1500 之间的 x 是周期性的,基本上。
我尝试使用xcorr 函数(我使用了xcorr(y,'unbiased'),然后找到了零滞后峰值并找到了在零滞后一定百分比范围内的其他峰值来定义周期性区域,但我不知道了解如何将滞后与 x 范围联系起来。
编辑:我目前使用的代码
[c, lags] = xcorr(y,'unbiased');
lag_zero=find(lags==0)
[peaks,locs]=findpeaks(c,'MINPEAKHEIGHT',.5*c(lag_zero)); %finding peaks
cindex=find(((c(lag_zero)-(0.5*c(lag_zero)))<c) & (c<(c(lag_zero)+(0.5*c(lag_zero)))));
maxlags=lags(max(cindex));
[c2,lags2]=xcov(y,y,maxlags,'unbiased'); %this is just to narrow the periodic part down
plot(lags2,c2);
period=abs(x(locs(floor((length(locs))/2)))-x(locs(floor(((length(locs))/2)-1))))
【问题讨论】:
-
你能分享你到目前为止的代码吗?
-
我加了,虽然不多。
-
频率是否已知?
-
在这种情况下,频率应该是 2*pi 但一般我会尝试找出周期来计算频率。
-
以这种方式使用 xcorr 的问题在于,您将整个信号与自身进行比较,因此它没有说明信号的哪个部分包含周期性。您可以通过更改示例“vect”以将 sin(x) 部分放在前面或末尾来看到这一点,并查看从 xcorr 中得到的结果 - 它将接近相同。