有没有一种简单的方法可以从信号中提取主频率/周期(不使用 FFT)?
根据我的要求,这可能会导致主频率的值(例如 3Hz)或表示目标频率强度的值。例如,在下面的一维信号中,频率约为 4Hz,假设采样率为 50ms。
如何以编程方式从数据中提取?
10 2 1 2 8 10 8 2 1 1 8 10 7 1 1 2 7 10 5 1
有没有一种简单的方法可以从信号中提取主频率/周期(不使用 FFT)?
根据我的要求,这可能会导致主频率的值(例如 3Hz)或表示目标频率强度的值。例如,在下面的一维信号中,频率约为 4Hz,假设采样率为 50ms。
如何以编程方式从数据中提取?
10 2 1 2 8 10 8 2 1 1 8 10 7 1 1 2 7 10 5 1
使用自动相关!
%using Matlab
%convert sample rate to hertz
fs = 1/(50/1000) % result = 20hz
vector = [10 2 1 2 8 10 8 2 1 1 8 10 7 1 1 2 7 10 5 1];
R = xcorr(vector);
[pks,locs]=findpeaks(R);
%result in hertz
fs./(diff(locs))
ans =
3.3333 4.0000 3.3333 3.3333 4.0000 3.3333
max(fs./diff(locs))
ans =
4
对信号应用自相关,你可以在网上找到很多不同语言的源代码来做自相关,一个伪代码:
TotalSamples = length(signal)
for z=1:TotalSamples
sum = 0;
for i=1:TotalSamples
sum = sum + (signal(i)*signal(i + pos));
end
Xcorre(z) = Xcorre(z) + sum;
end
从自相关结果中查找所有局部峰值
计算局部峰值之间的差异locs[k+1] - locs[k]
将帧速率除以局部峰值之间的差异
频率是最大值