Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado
wsryu@fas.harvard.edu (William Ryu) writes: > I am interesting in phase unwrapping algorithms which can handle noisy > data. I understand this to be a common procedure when doing FFT analysis > of interference patterns, and was wondering if anyone has implemented such > routines in IDL. First of all, it is definitely a non-trivial problem in the presence of noise. When I was doing phase shift interferometry I came across a very clever paper on the subject in which the authors makes use of the (again clever) observation that the phase unwrapping problem can be formulated in a way that is formally similiar to the digitized poisson equation. It can therfore be solved with the same methods used for numerically solving the poisson equation. A colleague of mine implemented the algorithm in C and found it to work well with noisy data. The reference is (in Bibtex format): @Article{Ghiglia94, author = {D. C. Ghiglia and L. A. Romero}, title = {Robust two-dimensional weighted and unweighted phase unwrapping that uses fast transforms and iterative methods}, journal = {J. Opt. Soc. Am. A}, year = 1994, volume = 11, pages = {107-117} } I am not aware of an IDL implementation but it should be worthwile implementing as it uses FFTs and similiar stuff that is easily done within IDL. There are many more articles on the subject which is important in the automated analysis of phase shift interferograms, etc. Journals of special interest are JOSA and Applied Optics. Another reference is: @Article{Huntley89, author = {J. M. Huntley}, title = {Noise-immune phase unwrapping algorithm}, journal = aop, year = 1989, volume = 28, number = 15, pages = {3268-3270} } Hope this get's you started, Christian ------------------------------------------------------------ -------- Christian Soeller mailto: csoelle@sghms.ac.uk St. Georges Hospital Medical School Dept. of Pharmacology Cranmer Terrace London SW17 0RE
William Ryu wrote: > Let's say we have a 2D matrix of complex data a+bi and would like to > extract the phase value. A simple way would be to take arctan (b/a) but a > problem exists because arctan is modulo 2PI. The data often gets > "wrapped." Time domain phase unwrapping: K.W.Wan, J. Austin, E. Vilar, "A Novel Approach to the Simultaneous Measurement of Phase and Amplitude Noise of Oscillators', 44th Ann. Symp. on Freq. Control, Baltimore, USA, May 1990, 5p." For fractional phase calculations (Sorry, the programs are not exactly very well written) ;----------------------------------------------------------- ---- ;fract_phas.pro ;----------------------------------------------------------- ---- ;+ ; NAME: fract_phas ; PURPOSE: Calculates fractional phase (phase difference between i and i+1 ; samples) for the input IQ array ; CATEGORY: Signal Processing ; CALLING SEQUENCE: y=fract_phas(x) ; INPUTS: x- two dimensional array, x(0,*) - I signal , x(1,*) - Q signal ; MODIFICATION HISTORY: ; ss@.ee.port.ac.uk on Wed Mar 6 09:58:10 GMT 1996 , UoP, MT&SPRG ;- ;----------------------------------------------------------- ---- ; fract_phas.pro start line ;----------------------------------------------------------- ---- function fract_phas, x y=imaginary(alog((complex(x(0,*), x(1,*)))* $ (shift(complex(x(0,*), -x(1,*)), 0, 1)))) nn=n_elements(y) y=reform(y,nn) y=double(y) ;y(0)=0.0d return, y end ;----------------------------------------------------------- ---- ; fract_phas.pro stop line ;----------------------------------------------------------- ---- For phase curve: ;----------------------------------------------------------- ----------- ;phas_sum.pro ;----------------------------------------------------------- ----------- ;+ ; NAME: phas_sum ; CATEGORY: Signal Processing ; CALLING SEQUENCE:c6 = phas_sum(c5) ; INPUTS: c5 - output from fract_phas ; OUTPUTS: c6 - phase curve with trend ; MODIFICATION HISTORY: ; ss@.ee.port.ac.uk on Mon Apr 15 12:34:26 BST 1996 ;- ;----------------------------------------------------------- ----------- ;phas_sum.pro start line ;----------------------------------------------------------- ----------- function phas_sum, c5, c6 c6=fltarr(n_elements(c5)) c6(0) = c5(0) for i = 1L, n_elements(c5)-1L do begin c6(i) = c6(i-1) + c5(i) endfor return, c6 end ;----------------------------------------------------------- ----------- ;phas_sum.pro stop line ;----------------------------------------------------------- ----------- Cheers Sergei http://www.ee.port.ac.uk:80/~ss-www/WAVE/index.html