How to make the frequency vector to analyze a complex signal?
Show older comments
I have this example and I'm puzzled with the frequency vector (hz) if I change any parameter in it, the result won't be the frequency components. How to calculate the frequency vector, generally?
srate = 1000;
time = -2: 1/srate : 2;
pnts = length(time);
hz = linspace(0,srate/2,(pnts-1)/2);
freq = [2 10 25 40];
amp = [3 5 7 9];
phas = [-pi/4 pi/2 pi 2*pi];
signal = zeros(size(time));
for i = 1:length(freq)
signal = signal + amp(i)*sin( 2*pi*freq(i)*time + phas(i));
end
subplot(211)
plot(time,signal,'k-','linew',0.5)
title("Time Domain")
y = fft(signal)/length(signal);
pwr = abs( y ).^2;
pwr(1) = [];
subplot(212)
plot(hz,pwr(1:length(hz)),'r-')
title("Frequency Domain")
4 Comments
Michael Soskind
on 24 Dec 2020
I'm a bit puzzled by "if I change any parameter in it, the result won't be the frequency components". If you mean that changing the sample rate gives an incorrect frequency axis, or that the points do not always work. What you do is what should be done, but the only change I advise is replacing "(pnts-1)/2" with "floor(points/2)", in order to account for even numbers of points in the time/signal vectors. Other than that, the single sided FFT that you show in this example is reasonable, although the powers that you are getting should be pwr = 2*abs(y), rather than pwr = abs(y).^2, based on the MATLAB description of fft here.
Muhamed Sewidan
on 24 Dec 2020
Michael Soskind
on 24 Dec 2020
I see what you mean, you are referring to the small errors in frequency value compared to the ideal frequency values. If you increase the sample rate, you will find that the approximaton of the DFT should improve. If I increase srate to srate = 10000, I get the pairs:
freq: 2, amp: 3
freq: 10, amp: 5
freq: 25, amp: 6.99
freq: 40, amp: 9
With respect to the second question, pwr = 2*abs(y) should be used since this is really the folding of the FFT on itself in a single sided Fourier Transform. In order to get the correct signal amplitude as you had built in your composite signal, you should just double the magnitude, which will get you the correct signal amplitudes.
Muhamed Sewidan
on 24 Dec 2020
Accepted Answer
More Answers (0)
Categories
Find more on Fourier Analysis and Filtering in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!