一种方法是使用fft.由于fft给出了信号的频率表示,所以您要寻找最大值,并且由于fft是一个复杂的信号,您将需要先获取绝对值.该指数将对应于具有最大能量的归一化频率.最后,如果您的信号有一个偏移量,就像您显示的那样,您需要在取出fft之前摆脱该偏移量,以便在代表DC分量的原点处没有得到最大值.
我描述的一切都放在一行:
[maxValue,indexMax] = max(abs(fft(signal-mean(signal))));
其中indexMax是可以找到max fft值的索引.
注意:要从indexMax到实际感兴趣的频率,您将需要知道fft的长度L(与信号的长度相同)和采样频率Fs.信号频率为:
frequency = indexMax * Fs / L;
或者,根据您所拥有的信号,速度更快,工作相当好,请采取自动相关信号:
autocorrelation = xcorr(signal);
并发现在自相关的中心点之后出现的第一个最大值. (自相关将是对称的,其最大值在中间.)通过找到最大值,您会发现移位信号看起来与自身相似的第一个位置.即你找到你的信号的时间段.由于信号偏移了其周期的倍数将始终看起来像自己,您需要确保您发现的最大值确实对应于信号的周期,而不是其倍数之一.
由于您的信号中的噪音,绝对最大值可能很好地发生在您的周期的倍数,而不是周期本身.所以为了解释这个噪音,你将取自动相关的绝对最大值(自相关(长度(自相关)/ 2 1)),然后找到自相关大于第一次的最大值的95%在信号的下半部分,95%,99%或其他一些数字将取决于多少噪声会破坏您的信号.
更新:我意识到,我认为你的意思是“频率”你的信号的音调或基本的谐波或频率最多的能量,但是你想看看它.如果按频率表示您的信号的频率表示,然后再进行第一次近似,您只需要绘制FFT的绝对值,以了解能量的位置:
plot(abs(fft));
如果你想了解为什么有一个abs,或者什么相关的信息,你失去了不代表fft的阶段,你可能想要更多地阅读DFT转换,以了解你得到什么.