【问题标题】:Matlab find range of periodicity of signalMatlab找到信号的周期性范围
【发布时间】: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 中得到的结果 - 它将接近相同。

标签: matlab signal-processing


【解决方案1】:

我认为最简单的起点是对数据进行窗口化,然后使用this 之类的技术来查找功率高于某个本底噪声的频率。这种分析很像季节性,但周期不同,但这不是问题。查看来自 Cross Validated 的 this link

【讨论】:

  • 我认为我的问题更多是我想要周期性范围和频率,而不仅仅是频率。但谢谢你的指示
【解决方案2】:

运行[~,F,T,P] = spectrogram(vect, 128, 120, 128, 1),你会得到

通过目视检查,您会发现元素 500 和 1500 之间存在单色信号。您可以检查 P 的值非常低的矩形区域,最好使用 10*log10(P),并使用 FT 提取间隔和频率。

【讨论】:

  • 在频谱图中,单色区域是否总是对应​​于信号周期性的范围?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多