FFT magnitude as a function of frequency resolution

12 views (last 30 days)
My learning research on FFTs has identified that (for example) with a FFT frequency resolution of 8 Hz, the scalar magnitude of the FFT spectral lines (computed as the abs() value of the complex numbers returned by the FFT function) should be higher than if a FFT frequency resolution of 4 Hz is used (twice the number of samples per FFT) on the same (IQ) sample data. I see evidence of this when using a Spectrum Analyser receiving broadcast FM signals and also in SDR software when doing the same (both when changing the RBW). But, when using the MatLab FFT function (on broadcast FM IQ data) the opposite is what I see - i.e the higher the FFT frequency resolution (lower number of samples per FFT), the lower the scalar magnitude of the FFT complex values. What I am I doing wrong / not understanding?
I discovered this when adding to my MatLab scripts to compute PSD - which, according to on-line sources, should be the FFT abs() value squared and DIVIDED by the FFT frequency resolution. However, I've found empirically that MULTIPLYING by the FFT frequency resolution is required to make the magnitudes similar for different FFT frequency resolutions. In generating this question,

Answers (1)

Paul
Paul on 27 Mar 2022
Edited: Paul on 27 Mar 2022
Hi @Rob H,
For a question like this, it would be immensely helpful to provide some example data/code that illustrates the issue. Absent that, I'll provide an example and go from there.
Define a continuous-time function
syms t real
s = matlabFunction(triangularPulse(0,1,2,t));
Sample that signal over its non-zero interval with a sampling period of T1 = 0.2 and take the DFT
t1 = linspace(0,2,11); N1 = 11; n1 = 0:10; T1 = 0.2; F1 = 1/T1;
x1 = s(t1);
X1 = fft(x1);
Now do the same with a sampling period of T2 = 0.1.
t2 = linspace(0,2,21); N2 = 21; n2 = 0:20; T2 = 0.1; F2 = 1/T2;
x2 = s(t2);
X2 = fft(x2);
Plot the results
figure
hold on
stem(n2/numel(n2)*F2,abs(X2),'o');
stem(n1/numel(n1)*F1,abs(X1),'x');
xlabel('Hz')
legend('X2','X1')
At 0 rad/sample, X2 = 2*X1 as expected. Other than that, I'm not sure how we an say there is any direct relatiionship between X1 and X2 wrt their sampling periods or sampling frequencies, the DFT samples don't even line up at the same frequencies.
However, such scaling by the sampling period (or equivalently by the inverse of the sampling frequency) would come into play if we want to use the DFT samples to estimate the CTFT of the original signal
syms w f real
S(w) = fourier(triangularPulse(0,1,2,t),t,w);
S(f) = S(2*sym(pi)*f);
figure
hold on
fplot(abs(S(f)),'k')
stem(ceil(-N2/2:(N2/2-1))/N2*F2,T2*abs(fftshift(X2)),'bo')
stem(ceil(-N1/2:(N1/2-1))/N1*F1,T1*abs(fftshift(X1)),'rx');
xlabel('Hz')
legend('S(f)','T2*X2','T1*X1')
  2 Comments
Rob H
Rob H on 29 Mar 2022
Edited: Rob H on 29 Mar 2022
If I understand correctly, your example is comparing the FFTs of two time series with different sampling rates. Whereas I'm comparing FFTs of the same complex time series. The only difference between my FFTs is the number of samples used in the FFT calculation. I am seeking to compute PSD from the MatLab FFT result as I believe that gives a spectrum with spectral line magnitudes which are insensitive to the number of samples, N, (and hence insensitive to the FFT frequency resolution aka RBW - as this is a function of time series sample frequency and the number of samples, N).
My code is very simple. After having read in the complex (IQ) data into MatLab 'y', I simply pass N samples of y at a time to the MatLab FFT function, FFTSHIFT the output vector, calculate the ABS() value of that and then convert it to dB and plot it against frequency. Note that I am using the simplest form of MatLab FFT i.e. FFT(y) - not FFT(y,N) for instance.
The question is: What is the correct scaling factor to multiply by the ABS() of the MatLab FFT to estimate PSD.
Paul
Paul on 29 Mar 2022
Yes, I see now that my answer was not relevant to the question, which I completely misread. Sorry about that.
Can you post some code for a simple example that illustrates the effect in question, i.e., the higher the FFT frequency resolution (lower number of samples per FFT), the lower the scalar magnitude of the FFT complex values.

Sign in to comment.

Products


Release

R2007b

Community Treasure Hunt

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

Start Hunting!