MATLAB Answers

How to plot frequency spectrum of a signal in matlab?

3,167 views (last 30 days)
Nur Fauzira Saidin
Nur Fauzira Saidin on 26 Oct 2015
Commented: Jonas on 1 May 2021 at 14:26
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?
close all;
%Define number of samples to take
fs = 8000;
f = 400; %Hz
%Define signal
t = 0:1/fs:1-1/fs;
signal = sin(2*pi*f*t);
%Plot to illustrate that it is a sine wave
plot(t, signal);
title('Time-Domain signal');
%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)
plot(f, abs(fftSignal));
title('magnitude FFT of sine');
xlabel('Frequency (Hz)');
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');
xlabel('Frequency (Hz)');
%noisy signal
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');
xlabel('Frequency (Hz)');

Accepted Answer

Salaheddin Hosseinzadeh
Salaheddin Hosseinzadeh on 26 Oct 2015
Hi there!
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.
Good luck!
Jonas on 1 May 2021 at 14:26
@Lazaros: because a longer signal with the same spectral content would apprar with higher amplitude in the spectrum. if you dont divide, a 2 second sine would have double spectrum amplitude compared to the same sine with only one second. normally in a one sided spectrum you want to see the amplitude of a specific frequency directly, regardless of signal length

Sign in to comment.

More Answers (3)

Image Analyst
Image Analyst on 26 Oct 2015
Edited: Image Analyst on 26 Oct 2015
It's not? I always thought that the FFT gave the frequency spectrum. Why does he say no? Perhaps he would like to see you use pwelch(), periodgram(), or spectrogram() in preference to fft()???
Salaheddin Hosseinzadeh
Salaheddin Hosseinzadeh on 27 Oct 2015
As Image Analyst said there are several different methods. Some of which have different names. Power spectrum, Power spectrum density and ... each of which have slightly different method of calculation. Yet, the simple fft is the heart of them, which is performed correctly in your code.
You already accepted my answer, tnx, but if your problem was not and you're looking for something specific search and if no success let me know :)
Good Luck!

Sign in to comment.

AMADI OKO on 22 Mar 2019
Hi , please who can help me with a simulik model and matlab code of a spectral bandwidth in hertz used in channel performance measure.
  1 Comment
Image Analyst
Image Analyst on 22 Mar 2019
Possibly someone here in the Answers forum can, IF you start a new question and tag it as fft, spectral bandwidth, channel performance measure, etc. and list the Product as Simulink and give the release number.

Sign in to comment.

Viktor Bolgov
Viktor Bolgov on 1 Dec 2019
I do not get it. You have sin wave with frequency 400 Hz and magnitude of 1. Your spectrum indeed shows frequncy 400 Hz, but the magnitude is over 4000! How could it be?
  1 Comment
Sandro Yemi Okutuga
Sandro Yemi Okutuga on 14 Aug 2020
The analytical Fourier transform of that sinewave is 0 everywhere except for infinite at 400 Hz. The fact that it results only 4000 and not infinite is because the signal is finite in time and the calculation numerical. It wouldn't be 1 anyway.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!