一种基于双计数器的相位展开算法

文档序号:30077393发布日期:2022-05-18 03:37阅读:66来源:国知局
一种基于双计数器的相位展开算法

1.本发明涉及信号处理技术领域,具体地说是一种基于双计数器的相位展开算法。


背景技术:

2.相位展开是一个经典的信号处理问题,它指的是从值区间(-π,π]或(0,2π]中恢复原始相位值。在运用反正切函数计算相位时,实际提取的相位都是包裹在一个周期相位区间的包裹相位值,并非真实得到的相位,将包裹的相位恢复为真实连续的相位即为相位展开。
3.传统的算法假设包裹的相位信号为xw(n),被展开的相位为xu(n):使xu(n)=xw(n);计算数据的差值即包裹的相位信号一阶差分δphase=xw(n)-xw(n-1);若数据差值δphase》π,则xw(n)当前点以及后续所有点均减去2π;若数据差值δphase《π,则xu(n)当前点以及后续所有点均加上2π。
4.kazuyoshi itoh最早于1982年在论文analysis ofthe phase unwrapping problem里面提出了相位展开算法,相位展开算法原理详述如下:
5.假设包裹的相位信号为xw(n),被展开的相位为xu(n),则可根据以下步骤展开相位:
6.步骤1:使xu(n)=xw(n);
7.步骤2:计算差值δphase=xw(n)-xw(n-1);
8.步骤3:若差值δphase》π,则xu(n)当前点以及后续所有点均减去2π;若差值δphase《-π,则xu(n)当前点以及后续所有点均加上2π;
9.步骤4:重复以上步骤,直到遍历xu(n)。
10.相应的matlab算法描述如下:
[0011][0012]
根据以上步骤就可以对包裹的相位进行展开。
[0013]
上述算法在计算机上运行起来速度极慢,在fpga上由于其空间复杂度高,根本无法实现。
[0014]
现有技术中还有一种算法如下:
[0015]
matlab中相位展开函数使用的相位展开算法核心部分描述如下:
[0016]
与上面相同,假设包裹的相位信号为xw(n),被展开的相位为xu(n),则可根据以下步骤展开相位:
[0017]
步骤1:使xu(n)=xw(n);
[0018]
步骤2:计算差值即包裹的相位信号一阶差分除以2π的结果dp_corr=[xw(n)-xw(n-1)]/2π;
[0019]
步骤3:对有符号数dp_corr取整得到dp_corr_round;
[0020]
步骤4:将当前相位加上dp_corr_round累计和的2π倍,即xw(n)=xw(n)+2π*dp_corr_round
[0021]
步骤5:重复以上步骤,直到遍历xu(n)。
[0022]
根据以上步骤就可以对包裹的相位进行展开。
[0023]
上述算法在实际实现中包含取余、取整及除法运算,无法在硬件上实现。
[0024]
因此需要设计一种基于双计数器的相位展开算法,通过对matlab的代码设计和程序流程的设计,将软件平台上的一维相位展开算法进行改造以适用于fpga平台,且计算速度提升,空间复杂度降低,同时可适用于硬件平台,提高了实用性。


技术实现要素:

[0025]
本发明的目的是克服现有技术的不足,提供了一种基于双计数器的相位展开算
法,通过对matlab的代码设计和程序流程的设计,将软件平台上的一维相位展开算法进行改造以适用于fpga平台,且计算速度提升,空间复杂度降低,同时可适用于硬件平台,提高了实用性。
[0026]
为了达到上述目的,本发明提供一种基于双计数器的相位展开算法:包括算法第一大步和第二大步,其特征在于所述第一大步包括以下步骤:
[0027]
s1:计算前一个相位与后一个相位数值间差值diff1=xu(k)-xu(k-1)及后一个相位与前一个相位数值间差值diff2=xu(k-1)-xu(k);
[0028]
s2:判断diff1与diff2是否大于相位发生截断的界限值bound,如果diff1大于bound,则对i上跳变计数器加1;如果diff2大于bound,则对j下跳变计数器加1;如果都不满足,则判断i,j计数器数值的相对大小,让数值大的计数器减去数值小的计数器,将计算结果赋值给数值大的计数器,再将数值小的计数器数值置0;
[0029]
s3:计算上下跳变计数器的差值delta,令delta=i-j;
[0030]
s4:对相位进行补偿,令xu(k-1)=xu(k-1)-2*(delta)*bound,得到第一大步的相位展开结果;
[0031]
所述第二大步包括以下步骤:
[0032]
s10:计算当前相位值my_phase_out(t)与后一个相位值my_phase_out(t-1)间差值diff3及当前相位值my_phase_out(t)与前一个相位值my_phase_out(t+1)间差值diff4;
[0033]
s20:判断diff3,diff4与bound的大小,若diff3,diff4均大于bound,则对当前相位值my_phase_out(t)减去2倍的bound数值;若diff3,diff4均小于-bound,则对当前相位值my_phase_out(t)加上2倍的bound数值;否则保持不变。
[0034]
根据权利要求所述的一种基于双计数器的相位展开算法,其特征在于:所述s2的算法也可以为:
[0035]
如果diff1大于bound,则对i计数器加1;如果diff1小于-bound,则对j计数器加1;如果都不满足,则判断i,j计数器数值的相对大小,让数值大的计数器减去数值小的计数器,将计算结果赋值给数值大的计数器,再将数值小的计数器数值置0。
[0036]
上述算法在matlab上实现的封装函数源代码为:
[0037]
[0038]
[0039][0040]
ang为发生截断的相位;所述bound为判断相位发生截断的界限值,当差分结果大于bound或者小于-bound,则判断发生了相位截断;所述i为上跳变计数器,大于等于0的正整数;所述j为下跳变计数器,大于等于0的正整数;所述xu为发生截断的相位;所述diff1为xu(k)-xu(k-1),即第一大步相位展开中前一个相位与后一个相位数值间差值;所述diff2为xu(k-1)-xu(k),即第一大步相位展开中后一个相位与前一个相位数值间差值;所述delta为上跳变计数器减去下跳变计数器的值,整数;所述my_phase_out为第一次相位展开后的结果;所述diff3为my_phase_out(t)-my_phase_out(t-1),即第二大步相位展开中前一个相位与后一个相位数值间差值;所述diff4为my_phase_out(t-1)-my_phase_out(t),即第二大步相位展开中后一个相位与前一个相位数值间差值;所述phase_out为相位展开最终输出结果。
[0041]
本发明同现有技术相比,通过2步相位展开的算法和程序流程的设计且只使用了乘法、加减及计数操作,可得到连续的相位展开结果,解决了传统相位展开算法存在的计算速度慢、空间复杂度高问题,能将相位展开算法同时适用于fpga,提高了算法的实时性,仅需一个乘法器和两个计数器即可完成相位展开,解决了fpga上无相位展开算法相关ip核的问题。
附图说明
[0042]
图1为本发明的算法的程序框图。
[0043]
图2为本发明的发生相位截断的波形示意图。
[0044]
图3为本发明经过第一大步相位展开后的结果示意图。
[0045]
图4为本发明经过第一大步相位展开后结果局部放大示意图。
[0046]
图5为本发明经过第二大步后最终的相位展开结果示意图。
[0047]
图6为本发明实施例的原始三维图。
[0048]
图7为本发明实施例包含噪声的原始三维图。
[0049]
图8为本发明对应的包含噪声的二维灰度俯视图。
[0050]
图9为本发明三维图像反正切后得到的三维相位折叠图。
[0051]
图10为本发明得到的相位折叠的二维灰度图。
[0052]
图11为本发明通过相位展开算法对二维图像行列相位展开后得到的除边缘的三维示意图。
具体实施方式
[0053]
现结合附图对本发明做进一步描述。
[0054]
参见图1-图11,本发明提供一种基于双计数器的相位展开算法:
[0055]
如图2所示为截断的相位波形。
[0056]
包括算法第一大步和第二大步,其特征在于第一大步包括以下步骤(如图3-图4):
[0057]
s1:计算前一个相位与后一个相位数值间差值diff1=xu(k)-xu(k-1)及后一个相位与前一个相位数值间差值diff2=xu(k-1)-xu(k);
[0058]
s2:判断diff1与diff2是否大于相位发生截断的界限值bound,如果diff1大于bound,则对i计数器加1;如果diff2大于bound,则对j计数器加1;如果都不满足,则判断i,j计数器数值的相对大小,让数值大的计数器减去数值小的计数器,将计算结果赋值给数值大的计数器,再将数值小的计数器数值置0;
[0059]
s3:计算计数器的差值delta,令delta=i-j;
[0060]
s4:对相位进行补偿,令xu(k-1)=xu(k-1)-2*(delta)*bound,得到第一大步的相位展开结果;
[0061]
第二大步包括以下步骤(如图5所示):
[0062]
s10:计算当前相位值my_phase_out(t)与后一个相位数值my_phase_out(t-1)间差值diff3及当前相位值my_phase_out(t)与前一个相位数值my_phase_out(t+1)间差值diff4;
[0063]
s20:判断diff3,diff4与bound的大小,若diff3,diff4均大于bound,则对当前相位值my_phase_out(t)减去2倍的bound数值;若diff3,diff4均小于-bound,则对当前相位值my_phase_out(t)加上2倍的bound数值;否则保持不变。
[0064]
s2的算法也可以为:
[0065]
如果diff1大于bound,则对i计数器加1;如果diff1小于-bound,则对j计数器加1;如果都不满足,则判断i,j计数器数值的相对大小,让数值大的计数器减去数值小的计数器,将计算结果赋值给数值大的计数器,再将数值小的计数器数值置0。
[0066]
如图1所示,算法在matlab上实现的封装函数源代码为:
[0067]
[0068][0069]
ang为发生截断的相位;bound为判断相位发生截断的界限值,当差分结果大于bound或者小于-bound,则判断发生了相位截断;i为上跳变计数器,大于等于0的正整数;j为下跳变计数器,大于等于0的正整数;xu为发生截断的相位;diff1为xu(k)-xu(k-1),即相位展开第一大步中前一个相位与后一个相位数值间差值;diff2为xu(k-1)-xu(k),即相位展开第一大步中后一个相位与前一个相位数值间差值;delta为上跳变计数器减去下跳变计数器的值,整数;my_phase_out为相位展开第一大步后的结果;diff3为my_phase_out
(t)-my_phase_out(t-1),即相位展开第二大步中前一个相位与后一个相位数值间差值;diff4为my_phase_out(t-1)-my_phase_out(t),即相位展开第二大步中后一个相位与前一个相位数值间差值;phase_out为相位展开最终输出结果。
[0070]
实施例1:
[0071]
本算法对二维展开问题同样适用,如图6所示,在matlab中构造的原始三维图,对原始三维图添加噪声如图7所示,得到对应的包含噪声的二维灰度图如图8所示,以上三维图像反正切得到的三维相位折叠图如图9所示,得到的相位折叠的二维图如图10所示,应用上述相位展开算法对二维图像的行、列进行相位展开,得到的三维图像如图11所示,再对三维图边缘的数据进行单独的处理即可恢复原始的图像。
[0072]
实施例2:
[0073]
本算法将软件平台上的一维相位展开算法进行改造以适用于fpga平台,部分verilog代码附在下方以说明:
[0074]
[0075]
[0076]
[0077][0078]
上述为verilog代码片段,具体讲述了在fpga上实现的核心代码,上述的pi为圆周率π对应的定点数常数;m、n、o、p、q、l为对应变量的位数。可以根据需求修改m、n、o、p、q、l大小。
[0079]
上述clk为系统时钟,unwrap_fig为重置信号为0时有效,dout_last_reg1为数据有效信号为1时有效,pi_2为常数对应2π的定点数,pi_2n为对应2π*delta的定点数,phase_reg1为截断的相位打一拍结果,phase_reg为截断的相位,phase_reg2为截断的相位打两拍的结果,data_out_reg为相位补偿结果,data_out为相位展开结果,上述delta为i-j,即上跳变计数器减去下跳变计数器的结果。
[0080]
以上,对本发明的实施方式进行了说明,但本发明的范围并不仅仅限于此,使用者可以在不脱离本发明的主旨的范围内进行各种变更,加以实施,但是都包括在本专利的保护范围内。
[0081]
本发明从整体上解决了现有基础相位展开算法在计算机上运行起来速度极慢,及其他改进相位展开算法由于包含取余、取整及除法运算,无法在fpga上实现的问题,具有操作简单、消耗资源少、计算速度快、空间和时间复杂度低等优点,不仅仅适用于软件编程实现,由于只使用了乘法、加减及计数操作,因此还能够十分容易地移植到fpga平台,完全可以通过设置计数器和乘法器的位宽及设置判断相位发生截断的界限值bound值的大小以解决在fpga平台上无一维相位展开算法ip核的问题。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1