Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
利用MATLAB中的信号数据确定频率_Matlab_Signal Processing_Frequency_Noise - Fatal编程技术网

利用MATLAB中的信号数据确定频率

利用MATLAB中的信号数据确定频率,matlab,signal-processing,frequency,noise,Matlab,Signal Processing,Frequency,Noise,我有传感器的数据,我需要找到它的频率。看起来像是fft()似乎是要走的路,但是MATLAB文档只展示了如何获得频率图,我不知道从那里该怎么做 以下是我的数据: 一种方法就是使用fft。由于fft提供了信号的频率表示,因此需要查找最大值,并且由于fft是复杂信号,因此需要首先获取绝对值。该指数将对应于具有最大能量的标准化频率。最后,如果你的信号有一个偏移量,就像你展示的一样,你想在进行fft之前去掉这个偏移量,这样你就不会在原点得到一个代表直流分量的最大值 我在一行中描述的所有内容都是: [max

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

以下是我的数据:


一种方法就是使用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的abs,以了解能量的位置:

plot(abs(fft));
如果您想了解为什么会有abs,或者由于不表示fft的相位而丢失了什么相关信息,您可能需要阅读更多关于DFT变换的内容,以准确了解得到的信息。

我认为应该是这样的

 (indexMax-1) * Fs / L 
abs的第一个元素(fft(x))是直流电(DC),或偏置,或信号的平均值,或X0。我们从第二个元素(X1)开始计数。 如果我错了,请告诉我。谢谢。


我得到的信号来自于用应变计测量的一些振动。我想找到这些振动的频率。使用你发布的
fft
方法,我得到的频率为0.0357,但是通过查看图,每秒大约有10个周期,所以我不应该得到10个周期的频率吗?如果你有10个oscillations/s,这是一个0.1s的周期或10 Hz的频率。indexMax、L和Fs的值是多少?也可以运行绘图(abs(fft))为了确认你有一个大的尖峰,并且indexMax是尖峰发生位置的正确索引。我注意到,在图表中,你显示信号中有一个负偏移,这意味着代表直流分量的fft也会有一个接近零的尖峰。这可能是你正在测量的。如果是这种情况,则采用用(信号平均值(信号))的fft来去除直流分量。我得到的峰值为零(indexMax=1)。我按照你说的减去平均值(信号)现在我得到了大约9.8 Hz的频率,这似乎是对的!非常感谢您的帮助!!很高兴它起到了作用。我将更新我的帖子以反映这种调整。自相关和FFT是直接相关的,FFT可以用来计算前者,实际上可能会获得更快的结果,因为硬件有助于FFT:
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