使用fft matlab查找时间序列数据的主导频率

时间:2015-03-17 15:05:40

标签: matlab time-series fft forecasting

我试图在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在这种情况下很重要的话!

2 个答案:

答案 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。这保证了扇形松动很小(信号的幅度是正确的)

3)使用[link] http://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCIQFjAA&url=http%3A%2F%2Fwww.fhnw.ch%2Ftechnik%2Fime%2Fpublikationen%2F2012%2Fhow-to-use-the-fft-and-matlab2019s-pwelch-function-for-signal-and-noise-simulations-and-measurements&ei=V3EIVZrhHMPeOLeugbAH&usg=AFQjCNF6Fw1yrHI8EN20vzaBpJFXGjARxA&sig2=8VueptB1v3SA2Xp4A9cyYg&bvm=bv.88528373,d.ZWU&cad=rja[/link]中的缩放等式(11)来获得正确的幅度。

4)检查幅度:将PSD转换为线性光谱 - >这不是必需的。但是,我经常想知道振幅的值。但是,请注意,pwelch计算rms幅度而不是峰值幅度。获得峰值幅度乘以sqrt(2)。

最好,乔纳斯

答案 1 :(得分:0)

如果输入数据向量的平均值相对于数据元素较大,则表示显着的DC偏移,并且可以在FFT结果中显示为0的主频率。您可以从每个元素中减去数据向量的平均值,以消除此DC偏移。