How to plot frequency spectrum of a signal in matlab?

978 visualizaciones (últimos 30 días)
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)
figure;
plot(f, abs(fftSignal));
title('magnitude FFT of sine');
xlabel('Frequency (Hz)');
ylabel('magnitude');
%noise
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)');
ylabel('magnitude');
%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)');
ylabel('magnitude');

Respuesta aceptada

Frantz Bouchereau
Frantz Bouchereau el 29 de Jul. de 2021
Editada: Frantz Bouchereau el 29 de Jul. de 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.

Más respuestas (3)

Salaheddin Hosseinzadeh
Salaheddin Hosseinzadeh el 26 de Oct. de 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!
  3 comentarios
Lazaros Moysis
Lazaros Moysis el 10 de Feb. de 2021
Dear Salaheddin, may I ask, in order to compute the spectrum of a signal, why is it required to divide the fft with the length of the signal?
Jonas
Jonas el 1 de Mayo de 2021
@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

Iniciar sesión para comentar.


Image Analyst
Image Analyst el 26 de Oct. de 2015
Editada: Image Analyst el 26 de Oct. de 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()???
  2 comentarios
Nur Fauzira Saidin
Nur Fauzira Saidin el 27 de Oct. de 2015
I'm not sure. He just said, 'this is not frequency spectrum' crying. Thank you for your reply!
Salaheddin Hosseinzadeh
Salaheddin Hosseinzadeh el 27 de Oct. de 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!

Iniciar sesión para comentar.


Viktor Bolgov
Viktor Bolgov el 1 de Dic. de 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 comentario
Sandro Yemi Okutuga
Sandro Yemi Okutuga el 14 de Ag. de 2020
Editada: Sandro Yemi Okutuga el 14 de Ag. de 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.

Iniciar sesión para comentar.

Categorías

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

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by