找不到我的信号周期

信息处理 matlab 离散信号
2021-12-27 00:46:32

我有一个嘈杂的信号,它是恒速电机的声音,所以声音“应该”是周期性的,我知道有一种方法可以使用自相关函数来获取周期,我做到了,但我无法确定期间。知道如何在信号和自相关结果中做到这一点:信号 信号

自相关结果: 自相关

3个回答

这是尝试做你需要的事情scilab.

在此处输入图像描述

上图显示了我合成的一些数据。第二个图显示了原始数据的自相关(在自相关的中心峰值附近放大)。红色圆圈显示使用此find_peaks函数找到的峰。

最后的图显示了所有峰值位置之间的差异。这将是对周期的估计。因为您不能真正保证基础周期将是整数个样本,所以您可能应该找到这些值的平均值。

在这种情况下,“真实”期间是1/f0 = 11.191996,然后是 ,diffs = diff(peaks);然后mean(diffs(10:173))11.195122


代码如下。

N = 1000;
f0 = 0.0893495634;
phi = rand(1,1,'uniform')*2*%pi;
sigma = 0.5;

x = sin(2*%pi*[0:N-1]*f0 + phi) + sigma*rand(1,N,'normal');
XC = xcorr(x);

clf
subplot(311)
plot(x);

subplot(312)
plot(XC);

peaks=peak_detect(XC,0);

plot(peaks,XC(peaks),'ro')

a = get('current_axes');
a.data_bounds=[950 1050 -500 800];

subplot(313)
plot(diff(peaks));

似乎您在信号中应用了一些窗口函数(自相关图似乎是窗口化的)!

要完成它的工作,请将信号拆分为重叠或不重叠的恒定帧数据,应用自相关函数:

$$y(k)=\sum_{n=0}^{N-1}x(k) * x(n+k)$$

最后找到高峰位置,恭喜你找到了时期!

如何在matlab中在这里

找出信号“周期”的首选方法是查看频谱。看起来你的信号有很强的正弦波,上面有一些噪音。如果您采用 FFT 并绘制幅度,您将能够看到最强的频率(它们可能对应于电机运行的 RPM)。信号的“周期”将是 1 除以信号频率。如果你有一个 10Hz 的正弦波,它的周期是 0.1 秒。