Finding the dominant frequency of a time series data using fft matlab

95 views (last 30 days)
I'm trying to determine the dominant frequency of a time series data using the fft function in matlab. my data is represented as a vector while my time scale is also a vector. Below is my sample code:
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))
The problem is that my dominant frequency here is 0 which am not quite sure if it is correct. Could some provide feedback on this please especially if the Fs matters alot in this case!

Accepted Answer

Star Strider
Star Strider on 17 Mar 2015
The ‘frequency’ at 0 is the mean of your signal (or D-C offset). To eliminate it, subtract the mean before doing the fft.
This gives you the result you want:
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
x = x - mean(x); % <= ADDED LINE
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\n', fest, fest)
fprintf('Frequency step (resolution) = %f Hznn\n', f_scale(2))
  4 Comments
Vanisa Syahra
Vanisa Syahra on 22 Jun 2020
hello, I have the same problem with David, but here, eventhough I subtract the signal with the mean, I still get the zero frequency which has the highest power. Why this still happen? i am pretty sure that the dminant freq is not 0.
Walter Roberson
Walter Roberson on 22 Jun 2020
Is it possible that you have a 2D signal and that you are subtracting the mean along the wrong dimension?

Sign in to comment.

More Answers (1)

Eric Marshal
Eric Marshal on 4 May 2017
hello mr. David Gureya, may i ask you how you get 512 as NFFT ? are the n(number) from time series is diffrent with NFFT ?

Categories

Find more on Fourier Analysis and Filtering in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!