Complex number and fft
66 views (last 30 days)
Show older comments
Nmak
on 24 Jul 2020
Commented: David Goodmanson
on 25 Jul 2020
So I noticed during processing some images in matlab, that the angle phase images after fft+ifft are not the same as the original anymore. When looking at the matrix, I saw that Matlab stores values sometimes as "0", sometimes as "0.000000000000000 + 0.000000000000000i". I was wondering, what is the difference? Isn´t the whole matrix supposed to contain complex numbers?
I also tried a simpler example myself
V = [0, 2];
W = [0, 2+3i, 5, 0, 3+1i];
fft_V = fft(V);
fft_W = fft(W);
vv = ifft(fft_V);
fs_V = fftshift(fft(V));
vvv = ifft(ifftshift(fs_V));
ww = ifft(fft_W);
fs_W = fftshift(fft_W);
www = ifft(ifftshift(fs_W));
w2 = ifft(fft(ww));
While for V everything is normal, 2 things about W make me wonder:
"www" is the same as W, but why are the signs in front of the "0"s inverted? (from + to -)
If one checks "w2 == ww", Matlab returns: "[0 1 1 1 1]", which seems weird. All 5 values are the same, but somehow, the first entry of the vector returns false?
0 Comments
Accepted Answer
David Goodmanson
on 25 Jul 2020
Edited: David Goodmanson
on 25 Jul 2020
Hi Nmak,
you are just getting into standard numerical precision issues. The fft and ifft involove complex variable calculations. Getting things to agree in double precision after a bunch of such calculations doesn't always work exactly. For example
ww(2:end)-w2(2:end)
ans =
0 0 0 0
These elements are truly equal.
w(1)-w2(1)
ans =
0 + 8.8818e-17i
not quite equal. Hence the results of the ww==w2 test.
Sometimes what you see is the result of formatting,
>> W(1)
ans =
0
>> format long
>> W
W =
Columns 1 through 2
0.000000000000000 + 0.000000000000000i 2.000000000000000 + 3.000000000000000i
Columns 3 through 4
5.000000000000000 + 0.000000000000000i 0.000000000000000 + 0.000000000000000i
Column 5
3.000000000000000 + 1.000000000000000i
W(1) is still 0 of course, but since the some of the other elements of W are complex, W(1) is listed in a 0 + 0i format.
2 Comments
David Goodmanson
on 25 Jul 2020
When you have a complex array, then two memory location are allocated for each element, whether that element has a a nonzero imaginary part or not. So:
A = 0:4
W = [0, 2+3i, 5, 0, 3+1i];
whos A W
Name Size Bytes Class Attributes
A 1x5 40 double
W 1x5 80 double complex
At eight bytes per real number for double precision, you can see two real numbers allocated for each element of W. Looking just at a single real element of W,
W(1)
ans = 0
there is no need to report out a zero imaginary part.
More Answers (0)
See Also
Categories
Find more on Performance and Memory 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!