[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函数。
原文地址:https://www.cnblogs.com/shy-/p/8825136.html