相位展开(phase unwrapping)

我在做科研项目时,遇到过使用相位信息,但是相位被折叠(wrapped)的情况,相位计算公式如下:
Θ = a r c t a n ( b a ) \Theta = arctan(\frac{b}{a}) Θ=arctan(ab)
其中ba分别代表虚部和实部,由于反正切函数的区间是 ( − π 2 , π 2 ) (-\frac{\pi}{2},\frac{\pi}{2}) (2π,2π),故实际计算相位时会将结果折叠在这个区间内。如下图,这张图使用的是matlabatan函数计算并绘制的,可见,相位范围被折叠在 ( − π 2 , π 2 ) (-\frac{\pi}{2},\frac{\pi}{2}) (2π,2π)区间内,且在某些点出现了跳跃。
一个被折叠的相位图
仔细观察跳跃点,不难发现,其跳跃要么是 + π +\pi +π,要么是 − π -\pi π,通过前后点的差值可以判断是否发生跳跃。现在为了说明怎么相位展开,先作以下符号说明: x w ( n ) x_{w}(n) xw(n)表示被折叠的相位信号, x u ( n ) x_{u}(n) xu(n)表示展开的相位信号,则相位展开步骤如下:

  1. x u ( n ) x_{u}(n) xu(n) = x w ( n ) x_{w}(n) xw(n)
  2. x w ( n ) x_{w}(n) xw(n)的第二个点开始,计算当前点与前一个点差
  3. 若差大于 π 2 \frac{\pi}{2} 2π,则 x u ( n ) x_{u}(n) xu(n)当前点及后续所有点减去 π \pi π
  4. 若差小于 − π 2 -\frac{\pi}{2} 2π,则 x u ( n ) x_{u}(n) xu(n)当前点及后续所有点加上 π \pi π
  5. 重复上述步骤,直至遍历 x u ( n ) x_{u}(n) xu(n)
    对应的matlab代码如下:
xu = xw;
for i = 2:length(xw)
        diff = xw(i) - xw(i-1);
        if diff > pi/2
            xu(i:end) = xu(i:end) - pi;
        elseif diff < -pi/2
            xu(i:end) = xu(i:end) + pi;
        end
end

展开后相位如下图所示,可见展开后的相位是连续的。
在这里插入图片描述

另:若使用atan2计算相位,上述代码需做一些改变:所有的 π \pi π–> 2 π 2\pi 2π,所有的 π 2 \frac{\pi}{2} 2π–> π \pi π,具体如下代码所示。

xu = xw;
for i = 2:length(xw)
        diff = xw(i) - xw(i-1);
        if diff > pi
            xu(i:end) = xu(i:end) - 2*pi;
        elseif diff < -pi
            xu(i:end) = xu(i:end) + 2*pi;
        end
end
  • 29
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值