How to extract the frequency and amplitude from a FFT and save the values in separated tables?

47 views (last 30 days)
Hi,
I would like to extract the values of frequency and amplitude
from a fft and save them in separated tables.
For example, for the wave y = A1*sin(2*pi*w1*t) + A2*sin(2*pi*w2*t);
I would have the tables:
1) F, with the values w1 and w2 and another table
2) A, with the values A1 and A2.
I run the script below to ONLY DISPLAY the frequencies and amplitudes
but I don't know how to extract and save.
I wonder if someone have experience on how to write some lines to perform
this action.
Thank you in advance
Emerson
SCRIPT TO DISPLAY F AND A:
clear all;
close all;
%Wave properties
w1=5; % Frequency1 (Hz)
A1=1; % Amplitude1 (dimensionless)
w2=1; % Frequency2 (Hz)
A2=5; % Amplitude2 (dimensionless)
% Time properties
Datapoints = 1000; % Number of recorded data;
Length=10; % Length (seconds);
Step= Length/Datapoints; % Fraction of seconds
t = (0:Datapoints-1)*Step; % Time vector
% Sum of a w1-Hz sinusoid and a w2-Hz sinusoid
y = A1*sin(2*pi*w1*t) + A2*sin(2*pi*w2*t);
% Fourier Transformation
NFFT = Datapoints; % Next power of 2 from length of y
Y = fft(y,NFFT)/Datapoints;
fs=Datapoints/Length;
f = fs/2*linspace(0,1,NFFT/2+1);
% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1)))
axis([0 6 0 6])
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('Amplitude - |Y(f)|')

Accepted Answer

Paulo Silva
Paulo Silva on 18 Jun 2011
You can use the function findpeaks of the Signal Processing Toolbox™ to find the two peaks and their frequency, if you have that toolbox read the documentation about findpeaks.
Other way of finding the frequencies after you find the f value
[B,IX] = sort(2*abs(Y(1:NFFT/2+1))); %order the amplitudes
A1=B(end); %amplitude of the first peak
A2=B(end-1); %amplitude of second peak
f1=f(IX(end)); %frequency of first peak
f2=f(IX(end-1)); %frequency of second peak
Now to save them in tables please show us one example of saved data.
Maybe this way:
AmpTab=[A1 A2];
FreTab=[f1 f2];
  2 Comments
Emerson De Souza
Emerson De Souza on 18 Jun 2011
Thank you Paulo Silva,
I added your suggested 5 lines at the end of the code
and made a table by collecting the individual values together as
follow:
Frequencies=[f1 f2];
Amplitudes=[AA1 AA2];
The next question is:
How do we generalize your lines to collect multiple frequencies
and amplitudes without limiting to this particular case of two f and A?
Thank you in advance for your help
Emerson
Paulo Silva
Paulo Silva on 18 Jun 2011
[B,IX] = sort(2*abs(Y(1:NFFT/2+1)));
BFloor=0.1; %BFloor is the minimum amplitude value (ignore small values)
Amplitudes=B(B>=BFloor) %find all amplitudes above the BFloor
Frequencies=f(IX(1+end-numel(Amplitudes):end)) %frequency of the peaks

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

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

Start Hunting!