我试图在matlab中使用fft函数确定时间序列数据的主导频率。我的数据表示为矢量,而我的时间刻度也是矢量。以下是我的示例代码:
Fs = 10; % sampling frequency 1 kHz
t = [0,10,20,30,40,50,60,70,80,90]; % time scale
x = [10,120,130,120,120,100,123,456,78,89]; % time series
plot(t,x), axis('tight'), grid('on'), title('Time series'), figure
nfft = 512; % next larger power of 2
y = fft(x,nfft); % Fast Fourier Transform
y = abs(y.^2); % raw power spectrum density
y = y(1:1+nfft/2); % half-spectrum
[v,k] = max(y); % find maximum
f_scale = (0:nfft/2)* Fs/nfft; % frequency scale
plot(f_scale, y),axis('tight'),grid('on'),title('Dominant Frequency')
fest = f_scale(k); % dominant frequency estimate
fprintf('Dominant freq.: true %f Hz, estimated %f Hznn', f, fest)
fprintf('Frequency step (resolution) = %f Hznn', f_scale(2))
问题是我的主要频率是0,这不太确定它是否正确。有些人可以提供反馈,特别是如果Fs在这种情况下很重要的话!
答案 0 :(得分:0)
尝试以下
1)生成包含许多频率的信号
x = 0:0.1:100;
y = 0;
对于i = 1:10,
y = y + sin(2 * pi * rand(1)* 10 * x);
端
2)使用pwelch获得电源扫描。作为窗口fct使用flattopwin。这保证了扇形松动很小(信号的幅度是正确的)
4)检查幅度:将PSD转换为线性光谱 - >这不是必需的。但是,我经常想知道振幅的值。但是,请注意,pwelch计算rms幅度而不是峰值幅度。获得峰值幅度乘以sqrt(2)。
最好,乔纳斯
答案 1 :(得分:0)
如果输入数据向量的平均值相对于数据元素较大,则表示显着的DC偏移,并且可以在FFT结果中显示为0的主频率。您可以从每个元素中减去数据向量的平均值,以消除此DC偏移。