Frequency Estimate using FFT

February 2, 20111 comment Coded in Matlab
%For a real-valued, single tone sine or cosine wave, estimate the frequency 
%using an fft. Resolution will be limited by the sampling rate of the tone
%and the number of points in the fft.

%Procedure:
%1. Generate the test tone with a given Fs and N
%2. Take the fft and keep the first half
%3. Detect the maximum peak and its index
%4. Equate this index to a frequency

%Error Estimate:
% (Fs/N)= Hz/bin

%Things to keep in mind:
%Adding noise to the input will skew the results
%windowing will help with the fft

%% Clear and close everything
clc;
close all;
clear all; %remove this line if you are trying to use breakpoints

%% Just copy into m file, save and run
Fs = 1e6; %1MHz
fi = 1.333e3; %1kHz
t = 0:1/Fs:.5;
y = sin(2*pi*fi*t);

%Plot the time and frequency domain. Be sure to zoom in to see the waveform
%and spectrum
figure;
subplot(2,1,1);
temp = (2/fi)*Fs;
plot(y);
xlabel('time (s)');
subplot(2,1,2);
sX=fft(y);
N=length(sX);
sXM = abs(sX(1:floor(end/2))).^2; %take the magnitude and only keep 0:Fs/2
plot(0:Fs/N:(Fs/2)-1,sXM);
xlabel('Frequency')
ylabel('Magnitude')

[vv, ii]=max(sXM); %find the index of the largest value in the spectrum

freqEst = (ii-1)*Fs/N; %units are Hz
resMin = Fs/N; %units are Hz

display(freqEst);%display to the command window the results
display(resMin);