[0413] FFTSHIFT的四種寫法


FFTSHIFT的四種寫法


前言

matlab說,“你讀過書,……我便考你一考。fftshift的函數,怎樣寫的?”我想,討飯一樣的人,也配考我么?便回過臉去,不再理會。matlab等了許久,很懇切的說道,“不能寫罷?……我教給你,記着!這些代碼將來做程序員的時候,前端要用。”我暗想我和程序員的等級還很遠呢,而且前端從來用不到圖像處理;又好笑,又不耐煩,懶懶的答他道,“誰要你教,不就是直接調用fftshift么?”matlab顯出極高興的樣子,將兩個指頭的長指甲敲着櫃台,點頭說,“對呀對呀!……fftshift的代碼有四樣寫法,你知道么?”我愈不耐煩了,努着嘴走遠。matlab剛用指甲蘸了酒,想在櫃上寫代碼,見我毫不熱心,便又嘆一口氣,顯出極惋惜的樣子。


四種寫法

  • 使用type fftshift.m直接看fftshift函數:
  • 什么!!原來是個空架子,直接調用了circshift,不過我還是找來了早年fftshift的源碼:
[x, y] = size (V);
xx = ceil (x/2);
yy = ceil (y/2);
retval = V([xx+1:x, 1:xx], [yy+1:y, 1:yy]);
+ 讓我們來運行對比一下:


+ ??結果竟然不一樣,肯定是Matlab暗改了!

  • 讓我們來自己寫一哈fftshift的代碼:
 nd = ndims (x);
 sz = size (x);
sz2 = ceil (sz ./ 2);
idx = repmat ({':'},1,2);
for i = 1:nd
    idx{i} = [sz2(i)+1:sz(i), 1:sz2(i)];
end
retval = x(idx{:});
+ 相信自己,一定能成功!


+ 惡膜某蛤秒沒命,一定是我太弱了,代碼寫錯了!

  • 讓我們來使用調用的circshift試試看!
    • 找的代碼:
nd=2;
sz=size(I);
n=floor(size(I)/2);
idx = repmat ({':'},1,nd);
for i = 1:nd;
b=n(i);
d=sz(i);
if(b>0)
b=rem(b,d);
idx{i}=[d-b+1:d,1:d-b];
elseif(b<0)
b=rem(abs(b),d);
idx{i}=[b+1:d,1:b];
end
end
+ 運行結果:


+ 是在哈輸了!

  • 不聽不聽,我們再寫一個代碼:
    • Code:
sz = ceil(size(A)/2);
A = A([sz(1)+1:end, 1:sz(1)], [sz(2)+1:end, 1:sz(2)]);
+ 打擾了:

  • 驗證4個函數的正確性
    • 我們定義一個3X3填充1-9的矩陣,他fftshift的正確結果是:
    • 函數1結果:
    • 函數2結果:
    • 函數3結果:
    • 函數4結果:
  • 竟然都是對的!究竟是道德的淪喪還是人性的扭曲,歡迎收看《十大未解之謎》之matlab的fftshift函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM