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

10 vues (au cours des 30 derniers jours)
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)|')

Réponse acceptée

Paulo Silva
Paulo Silva le 18 Juin 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 commentaires
Emerson De Souza
Emerson De Souza le 18 Juin 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 le 18 Juin 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

Connectez-vous pour commenter.

Plus de réponses (0)

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by