How to plot frequency spectrum of a signal in matlab?
2 271 views (last 30 days)
Nur Fauzira Saidin on 26 Oct 2015
Hi. I want to plot frequency spectrum of a signal. I got this coding based on the sources that I found from the internet but my lecturer said this is not frequency spectrum. Can somebody help me on this?
%Define number of samples to take
fs = 8000;
f = 400; %Hz
t = 0:1/fs:1-1/fs;
signal = sin(2*pi*f*t);
%Plot to illustrate that it is a sine wave
%Take fourier transform
fftSignal = fft(signal);
%apply fftshift to put it in the form we are used to (see documentation)
fftSignal = fftshift(fftSignal);
%Next, calculate the frequency axis, which is defined by the sampling rate
f = fs/2*linspace(-1,1,fs);
%Since the signal is complex, we need to plot the magnitude to get it to
%look right, so we use abs (absolute value)
title('magnitude FFT of sine');
noise = 2*randn(size(signal));
figure, plot(t,noise), title('Time-Domain Noise');
fftNoise = fft(noise);
fftNoise = fftshift(fftNoise);
figure, plot(f,abs(fftNoise)), title('Magnitude FFT of noise');
noisySignal = signal + noise;
figure, plot(t,noisySignal), title('Time-Domain Noisy Signal');
fftNoisySignal = fft(noisySignal);
fftNoisySignal = fftshift(fftNoisySignal);
figure, plot(f,abs(fftNoisySignal)), title('Magnitude FFT of noisy signal');
Frantz Bouchereau on 29 Jul 2021
Edited: Frantz Bouchereau on 29 Jul 2021
Your code computes FFT and needs some extra normalization steps to calculate true power spectrum.
There are various ways in which you can compute and plot true power spectrum or power spectral density in MATLAB (when I say 'true power spectrum' I mean that the output values correspond to actual power values).
1) If you want to compute the power spectrum without having to specify many parameters and want the function to choose the best parameters for you, you can use pspectrum. Calling the function without outputs will give you a plot with the computed power spectrum.
2) If you want to compute power spectrum or power spectral density and want full control over the window size, window overlap, window type, and number of FFT points, you can use the Welch periodogram pwelch function. Calling the function without outputs will give you a plot with the computed power spectrum.
3) If you want to just visualize the power spectrum, you can use the Signal Analyzer app. The app let's you visualize your signals simultaneously in the time, frequency, and time-frequency domains. You can zoom into signal regions of interest and analyze the spectra at those zoomed regions.
4) If you have split your signals into multiple signal frames you can use the Spectrum Analyzer scope.
Computing true power spectra requires normalization of the FFT and the window used in the computations. Here is a popular MATLAB doc page that explains the relationship between FFT and true power spectra: Power Spectral Density Estimates Using FFT.
More Answers (3)
Salaheddin Hosseinzadeh on 26 Oct 2015
I don't know why your instructor didn't like it! Maybe it's missing a division and he is picky on that!
fftNoisySignal = fft(NoisySignal)./numel(NoisySignal);
Maybe that is the case, basically the magnitude of the fft has an issue, I guess! You need to apply this division on every fft command you use.
Hope this helps.