1
$\begingroup$

The cos fourier transform has no imaginary parts, but in this code it has imaginary parts that little big.

enter image description here

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure(7);

fs=128;

t=-4*pi:1/fs:4*pi-1/fs;

x=1*cos(0.5*t);

X=fft(x);

N=length(x);

n=0:N-1;

f=n*fs/N;

phs=angle(fftshift(X));

subplot(2,1,1); plot(f,abs(fftshift(X))/N,'LineWidth',1.5);

title('FFT'); ylabel('Magnitude'); xlabel('Frequency(Hz)');

subplot(2,1,2); plot(f,phs*180/pi,'-o'); xlabel('Frequency(Hz)');

ylabel('Phase(Degree)');

figure(8);

Re=real(X); Im=imag(X);

subplot(2,1,1); stem(f,Re); ylabel('Re(G(f))'); xlabel('Frequency(Hz)');

subplot(2,1,2); stem(f,Im); ylabel('Im(G(f))'); xlabel('Frequency(Hz)'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

If I make time range a multiple of 0.5, the results of imaginary parts has very little value that is e-14~15.

Let me know why this problem happened...

$\endgroup$
1
$\begingroup$

Those $10^{-15}$ terms after the FFT are due to numerical roundoff errors... Apart from that, you should properly frame the cosine into a fully periodic length, as it seems you did, then you can expect the imaginary part to be as close to zero as the numerical format allows...

The following line of OCTAVE / MATLAB code shows the effect of frame length (aka aperture size) on the FFT computation:

L = 16   ; period of cosine
N = 128  ; frame length of sample block (integer multiple of L)
figure,stem(imag(fft(cos(2*pi*[0:N-1]./L),N))); title('imaginary part of the FFT');

enter image description here

Now let us change the period of the cosine so that the frame does not include an exact number of periods:

L = 15  ; period of cosine
N = 128  ; frame length of sample block (non-integer multiple of L)
figure,stem(imag(fft(cos(2*pi*[0:N-1]./L),N))); title('imaginary part of the FFT');

enter image description here

Now if your result display more deviations than those found on the first plot, then your frame length is probably the problem. If you, on the other hand, observe very close to zero (probably randomly distributed) values as in the first plot, then that's probably due to the numerical roundoff errors involved in the FFT computation.

$\endgroup$
  • $\begingroup$ I appreciate your answer. If you don't mind, can you tell me why I have to properly frame the cosine into a fully periodic length please? I wanna know that. $\endgroup$ – Park Jul 12 '18 at 12:10
  • 1
    $\begingroup$ it's an inherent assumption of DFT (the transform that you compute via FFT) that finite length input and output signals are periodically extending to infinity, as it would be the case in DFS (discrete Fourier series). So if your cosine sample block do not contain proper number of samples, there will be a jump at the block boundaries eliminating the perfect continuity assumption. Hence the computed result will not belong to the ideal continuous cosine but a jumpy one. $\endgroup$ – Fat32 Jul 12 '18 at 12:33
  • $\begingroup$ Is the proper number of samples means integer to total sample number? And what is the 'jump' means? Can you explain more detail please? $\endgroup$ – Park Jul 12 '18 at 12:59
  • 1
    $\begingroup$ Proper means integer number of periods. Jump means, first and last samples of the signal block do not constitude a natural flow of the analytic signal given by a formula. For example if your signal is $\cos(2\pi n/16)$ and your 64 sample frame is given by $n = [0:63]$ then the first sample is $x[0]=\cos(0)=1$ and the last sample is $x[63]=\cos(2 \pi 63/16)$ now, the next block begins at index $n=64$ where the signal samples is $x[64] = \cos(2 \pi 64/16) = \cos(8\pi) = 1 = x[0]$. As you can see, the first sample of the next block is actually the first sample of the current block = No jump. $\endgroup$ – Fat32 Jul 12 '18 at 14:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.