[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
+ 運行結果:

+ 是在哈輸了!spa

  • 不聽不聽,咱們再寫一個代碼:
    • 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函數。
相關文章
相關標籤/搜索