15

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

这是我的数据的样子:

在此处输入图像描述

4

2 回答 2

19

一种方法确实是使用 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 的相位而丢失了哪些相关信息,您可能需要阅读有关 DFT 变换的更多信息,以准确了解您得到的信息。

于 2013-03-07T02:12:20.133 回答
0

我认为应该是

 (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
于 2016-11-16T04:40:05.013 回答