标签:
相位校正unwrapmatlab波前 |
分类: Matlab |
最近看计算傅里叶光学,得到一个相位二维矩阵代表了接受屏上的相位分布情况,作者使用了unwrap函数对一个剖面做了相位校正,得到如下结果
如果不使用相位校正,结果如下
可以看到,如果不进行相位校正,得到的结果简直看不出任何有用的信息,而作者分析说相位信息其实代表波前信息,如上面校正后的剖面图就表示了一个向下传播的波前形状,所以相位校正是很有必要的。Matlab帮助对unwrap相位校正函数的解释如下
Q = unwrap(P) corrects the radian phase angles in a vector P by adding multiples of ±2π when absolute jumps between consecutive elements of P are greater than or equal to the default jump tolerance of π radians.
下面给出了一张未校正的相位图(非剖面),可以看到图中明显包含有重要的信息,但不做校正,完全看不出是什么信息。
而Matlab没有给出校正二维相位矩阵的函数(unwrap只能对矩阵按行或列分别校正),所以尝试自己编了一个函数实现二维相位校正,如上面的图校正如下
信息是不是出来了,波前啊,WaveFront啊,有木有!
代码分享如下:
function Q = unwrap2(P, tol)
%================================================================
% 功能:实现二维数组的相位校正,可参考matlab的unwrap函数的说明
% 参数:P:matrix of the radian phase angles ;
%
% 返回值:校正后的相位矩阵
% 主要思路:先使用一维校正函数unwrap校正中间的一行(默认认为中间的一行是比较标准的),
%
% 调用方法:同unwrap函数调用方法(但不提供dim参数)
% 日期:2011/7/21
% author: GJ
%===============================================================
if nargin == 1
end
[M, N] = size(P);
mid = M/2+1;
unwrapmid = unwrap(P(mid, :), tol); % 校正中间一行
unwrapP = unwrap(P, tol); % 按列校正全矩阵
unwrapPmid = unwrapP(mid, :);
miderr = unwrapPmid - unwrapmid;
miderrM = repmat(miderr, M, 1);
Q = unwrapP - miderrM;
end