从在MATLAB信号数据确定频率(Determine frequency from signal d

2019-07-21 03:29发布

我从传感器的数据,我需要找到它的频率。 它看起来像fft()似乎是要走的路,但MATLAB文档只显示如何获得频率的图形,我不知道从那里做。

下面是我的数据是这样的:

Answer 1:

走一条路确实是使用FFT。 由于FFT为您提供了信号的频率表现,你要寻找的最大值,由于FFT是一个复杂的信号,你会想先取绝对值。 该指数将对应于具有最大能量的归一化频率。 最后,如果你的信号有偏差,因为是你展示一个情况下,你想摆脱的,服用FFT,这样你就不会得到在表示直流分量原点的最大偏移之前。

我描述了把在一行一切都将是:

[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));

如果你想知道为什么有一个ABS,或者是什么的相关信息你是不是代表FFT的阶段失去,你可能要读多一点关于DFT变换明白你到底是什么。



Answer 2:

我认为它应该是

 (indexMax-1) * Fs / L 

ABS(FFT(X))的第一个元素是直流(DC),或偏置,或信号,或X0的意思。 我们从第二个元素(X1)计数。 请让我知道,如果我错了。 谢谢。

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


文章来源: Determine frequency from signal data in MATLAB