Hi everybody, I am trying to learn FFT in MATLAB by understanding the example available in help file(<http://www.mathworks.co.uk/help/techdoc/ref/fft.html>). I don't know why in the line : Y = fft(y,NFFT)/L; the fft result is divided by L.
your help is apreciated
You don't need to divide it by L, it is purely a matter of scaling the result by a constant, which does not affect the shape of the spectrum, but really only affects the units of measure. The choice of scaling is largely a matter of convention rather than anything of significance.
Some people will disagree with this assessment and argue that the scaling does matter. The reality is that it depends to a large degree on your objectives and what you need to get from taking the FFT.
when you write the command Y=fft(y,NFFT) you calculate the fft of y on NFFT and when you divide it by L you just divide the FFT matrix.
lets say a=fft(y,NFFT) what you are doing basicly
This is basically done to preserve the power at each frequency sample point. The original series has L samples in it. At each frequency sample point, L copies of signal at corresponding frequency are coherently added together via FFT. So to preserve the power, you need to divide by L.
This is best seen when there is no noise involved
Fs = 1000; % Sampling frequency T = 1/Fs; % Sample time L = 1000; % Length of signal t = (0:L-1)*T; % Time vector x = 0.7*sin(2*pi*Fs/8*t) + sin(2*pi*Fs/4*t); NFFT = 2^nextpow2(L); % Next power of 2 from length of y Y = fft(x,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1);
% Plot single-sided amplitude spectrum. plot(f,2*abs(Y(1:NFFT/2+1))) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('|Y(f)|')
Both Honglei and Rick have given you good responses. If you want the magnitudes recovered from the DFT to equal the time domain amplitudes: yes, you have to scale by the length of the input vector and multiply by 2 if you have a real-valued signal, because the real-valued signal results in complex exponentials scaled by 1/2.
Fs = 1000; t = 0:1/Fs:1-1/Fs; x = 0.7*cos(2*pi*50*t)+ cos(2*pi*100*t); xdft = fft(x); % the DFT bin for 50 Hz is 51 % the DFT bin for 100 Hz is 101 amp50 = 2/length(x)*xdft(51); amp100 = 2/length(x)*xdft(101); abs(amp50) abs(amp100)