在MATLAB中根据信号数据确定频率

时间:2013-03-07 00:50:05

标签: matlab signal-processing frequency noise

我有来自传感器的数据,我需要找到它的频率。看起来fft()似乎是要走的路,但MATLAB文档只展示如何获得频率图,我不知道该怎么做。

以下是我的数据:

enter image description here

2 个答案:

答案 0 :(得分:18)

一种方法确实是使用fft。由于fft为您提供信号的频率表示,因此您需要查找最大值,并且由于fft是一个复杂信号,因此您需要先获取绝对值。该指数将对应于具有最大能量的归一化频率。最后,如果你的信号有一个偏移量,就像你显示的那个那样,你想在取fft之前去掉那个偏移量,这样你就不会在代表DC分量的原点得到最大值。

我描述的所有内容都放在一行:

[maxValue,indexMax] = max(abs(fft(signal-mean(signal))));

其中indexMax是可以找到最大fft值的索引。

注意:要从indexMax到感兴趣的实际频率,您需要知道fft的长度L(与信号的长度相同)和采样频率Fs。然后信号频率为:

frequency = indexMax * Fs / L;

或者,根据您的信号,速度更快,工作也相当好,请将信号自相关:

autocorrelation = xcorr(signal);

并找到自相关中心点之后的第一个最大值。 (自相关将与中间的最大值对称。)通过找到最大值,您可以找到移位信号看起来或多或少与自身相似的第一个位置。即你找到信号的周期。由于信号偏移其周期的倍数将始终如此,您需要确保找到的最大值确实对应于信号的周期而不是其倍数。

由于信号中的噪声,绝对最大值很可能发生在您的周期的倍数而不是周期本身。因此,考虑到噪声,您将采用自相关的绝对最大值(自相关(长度(自相关)/ 2 + 1),然后找到自相关大于的位置,比如第一个的最大值的95%信号后半部分的时间.95%,99%或其他数字取决于噪音会破坏你的信号。

更新:我意识到我认为你的信号的“频率”意味着音调或基本谐波或具有最大能量的频率,但是你想要看它。如果按频率表示信号的频率表示,那么对于第一个近似,您只需要绘制FFT的绝对值以了解能量的位置:

plot(abs(fft));

如果你想通过不表示fft的相位来理解为什么存在abs,或者你正在丢失什么相关信息,你可能想要阅读更多关于DFT变换的信息,以准确理解你得到的东西。 / p>

答案 1 :(得分:0)

我认为应该是

 (indexMax-1) * Fs / L 

abs(fft(x))的第一个元素是直流(DC),或偏置,或信号的平均值,或X0。我们从第二个元素(X1)算起。 如果我错了,请告诉我。谢谢。 enter image description here

clear all
clc
close all
Fs = 1;
T = 11 % Note this T is deliberately chosen , so that we have about 1.7 cycle of cosine singal
t = 0:Fs:T; % T seconds
L = length(t); % L is the length of sample sequence
bias = 4
signal = sin(t) + bias;

[maxValue,indexMax] = max(abs(fft(signal-mean(signal))));

frequency_method1 = (indexMax-1) * Fs / (L-1);
frequency_method2 = (indexMax-1) * Fs / L;


number_of_cycles_method1 = frequency_method1*T

number_of_cycles_method2 = frequency_method2*T


subplot(2,1,1)
plot(t,signal,'-or') ; grid on;
legend('about 1.7 cycles of cosine signal')
subplot(2,1,2)
plot(abs(fft(signal-mean(signal))),'-xb'); grid on
legend('abs of fft')

number_of_cycles_method1 =

     2


number_of_cycles_method2 =

    1.8333