Complex number and fft
조회 수: 66 (최근 30일)
이전 댓글 표시
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
채택된 답변
David Goodmanson
2020년 7월 25일
편집: David Goodmanson
2020년 7월 25일
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
David Goodmanson
2020년 7월 25일
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.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Performance and Memory에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!