FFT step by step help

2 visualizaciones (últimos 30 días)
William Osborne
William Osborne el 17 de Oct. de 2019
Editada: William Osborne el 17 de Oct. de 2019
Hello all,
I have been trying to figure out what each step is in the FFT process as shown below. It is to perform an FFT on a WAV file.
Essentially I want to know why this is how to do it, rather than just taking it for what it is. Step by step.
[x,fs] = audioread(filename);
%% FFT
lpad = length(x);
xdft = fft(x,lpad);
xdft = xdft(1:lpad/2+1);
xdft = xdft/length(x);
xdft(2:end-1) = 2*xdft(2:end-1);
freq = 0:fs/lpad:fs/2;
amplitude= abs(xdft);

Respuesta aceptada

Adam
Adam el 17 de Oct. de 2019
Editada: Adam el 17 de Oct. de 2019
The lpad part is a little suspicious. If you have an odd length of signal it will not work as is.
Apart from that though:
xdft = fft(x,lpad);
The fft line simply runs the fft. Passing in the length of signal as the number of points is superfluous, but if you were using a different number of points (e.g. next power of 2, which is common) then that would be input there.
xdft = xdft(1:lpad/2+1);
fft results in a 2-sided spectrum, with negative frequencies (or equiv nyquist to sample frequency) as well as positive frequencies (if you want to know more about this look for a resource online). Generally we aren't interested in the negative spectrum so we clip that off to give a one-sided spectrum.
fft returns its results as [0, positiveFrequencies, nyquist, negativeFrequencies]. We want to keep the nyquist frequency, hence n/2 + 1 rather than n/2.
xdft = xdft/length(x);
scales the result to maintain the amplitudes of the time domain. I always forget exactly what this step should be, but I am assuming you have it right here. Certainly this is scaling the result, whether correctly or not.
xdft(2:end-1) = 2*xdft(2:end-1);
Because we threw away half the spectrum we multiply the remaining half by 2 to maintain the same total power.
freq = 0:fs/lpad:fs/2;
In order to view the spectrum meaningfully you need to create your vector of frequencies. Obviously it needs to be the same length as the result and runs from 0 to Nyquist (which, if you remember is the range we kept from the spectrum).
amplitude= abs(xdft);
The result of the fft is a complex one. To view the power spectrum you want the absolute value. Often this is also squared, but just taking the abs is also fine, depending what you wish to interpret from it.
  1 comentario
William Osborne
William Osborne el 17 de Oct. de 2019
Editada: William Osborne el 17 de Oct. de 2019
Excellent, thank you very much. I have been trying to piece together all the parts and this really helps.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Spectral Measurements en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by