我有一个嘈杂的信号,它是恒速电机的声音,所以声音“应该”是周期性的,我知道有一种方法可以使用自相关函数来获取周期,我做到了,但我无法确定期间。知道如何在信号和自相关结果中做到这一点:信号
自相关结果:
我有一个嘈杂的信号,它是恒速电机的声音,所以声音“应该”是周期性的,我知道有一种方法可以使用自相关函数来获取周期,我做到了,但我无法确定期间。知道如何在信号和自相关结果中做到这一点:信号
自相关结果:
这是尝试做你需要的事情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 秒。