edc*_*591 14 matlab signal-processing frequency noise
我有来自传感器的数据,我需要找到它的频率.它看起来fft()似乎是要走的路,但MATLAB文档只显示如何获得频率图,我不知道该怎么做.
这是我的数据:

Lol*_*olo 18
一种方法是使用fft.由于fft为您提供信号的频率表示,因此您需要查找最大值,并且由于fft是一个复杂信号,因此您需要先获取绝对值.该指数将对应于具有最大能量的归一化频率.最后,如果您的信号有一个偏移量,就像您显示的那个一样,您希望在获取fft之前消除该偏移量,这样您就不会在代表DC分量的原点处获得最大值.
我描述的所有内容都放在一行中:
[maxValue,indexMax] = max(abs(fft(signal-mean(signal))));
Run Code Online (Sandbox Code Playgroud)
其中indexMax是可以找到最大fft值的索引.
注意:要从indexMax获得感兴趣的实际频率,您需要知道fft的长度L(与信号的长度相同)和采样频率Fs.信号频率将是:
frequency = indexMax * Fs / L;
Run Code Online (Sandbox Code Playgroud)
或者,根据您的信号,速度更快,工作也相当好,请采用信号的自相关:
autocorrelation = xcorr(signal);
Run Code Online (Sandbox Code Playgroud)
并找到在自相关中心点之后出现的第一个最大值.(自相关将与中间的最大值对称.)通过找到最大值,您可以找到移位信号看起来或多或少与自身相似的第一个位置.也就是说,你找到了信号的周期.由于信号偏移其周期的倍数将始终如此,您需要确保找到的最大值确实对应于信号的周期而不是其倍数.
由于信号中的噪声,绝对最大值很可能发生在您的周期的倍数而不是周期本身.因此,考虑到噪音,你会采取自相关的绝对最大值(自相关(长(自相关)/ 2 + 1),然后寻找到自相关大于,比如说,该最大值的95%,为第一信号后半部分的时间.95%,99%或其他数字取决于噪声会破坏信号的程度.
更新:我意识到我认为你的信号的"频率"是指具有最大能量的音调或基本谐波或频率,但是你想要看它.如果按频率表示信号的频率表示,那么对于第一个近似,您只需要绘制FFT的绝对值以了解能量的位置:
plot(abs(fft));
Run Code Online (Sandbox Code Playgroud)
如果你想通过不表示fft的相位来理解为什么存在abs,或者你正在丢失什么相关信息,你可能想要阅读更多关于DFT变换的信息以准确理解你得到的信息.