Re: Want a smooth function from Arg[ ]
- To: mathgroup@smc.vnet.net
- Subject: [mg12241] Re: [mg12213] Want a smooth function from Arg[ ]
- From: Daniel Lichtblau <danl@wolfram.com>
- Date: Tue, 5 May 1998 03:29:36 -0400
- References: <199805010709.DAA00138@smc.vnet.net.>
Ryan Scott wrote: > > I need to be able to fit an nth degree polynomial to the phase function > for a list of data. However, the Arg[x] function wraps the phase at > +/- Pi creating discontinuities in what would be a smooth function. > To clearify, let me give the following example: > > Create a list of data with a gaussian profile and quadratic phase: > > nn=128; > a=0.005; b=0.003; > data=Table[N[Exp[-a*(t-nn/2)^2+I*b*(t-nn/2)^2]], {t,nn}]; > > Plot the magnitude and phase: > > ListPlot[Abs[data],PlotRange->{0,1},PlotJoined->True, > PlotLabel->FontForm[ > "Absolute value of waveform",{"Helvetica-Bold",10}]] > ListPlot[Arg[data], PlotJoined->True, PlotRange->All, > PlotLabel->FontForm[ "Phase of time waveform", > {"Helvetica-Bold",10}]] > > I would like to now fit a curve to this phase (which should be 0.003*x^2 > ). > However, the wrapping of the phase would seem to make this difficult to > do directly. Any ideas on how to manipulate the results of Arg to > give a continuous function of data? > > Thanks, > > Ryan > > -- > ________________________________________________ > > Ryan P. Scott > Laser and Electro-Optics Research Group > UC Davis - Department of Applied Science > Tel: (530)754-4358 Fax: (530)752-1652 > Email: scott@leorg.ucdavis.edu > ________________________________________________ One approach might be to renormalize the arguments. You can do this by comparing Arg[point] to Arg[previous point]. Any time you see a jump larger than, say, Pi, then shift successive arg values by Pi. args = Arg[data]; renormalize[args_] := Module[ {pairs, diffs, j, len=Length[args], corr=0}, pairs = Partition[args,2,1]; diffs = Map[#[[1]]-#[[2]]&,pairs]; PrependTo[diffs, 0]; diffs = 2*Pi*Sign[Chop[diffs,Pi]]; Table[ corr += diffs[[j]]; corr+args[[j]], {j,1,len}] ] newargs = renormalize[args]; ListPlot[newargs, PlotJoined->True, PlotRange->All, PlotLabel->FontForm["Phase of time waveform"]] This gives a smooth parabola as desired. Daniel Lichtblau Wolfram Research
- Follow-Ups:
- Re: Re: Want a smooth function from Arg[ ]
- From: Sean Ross <seanross@worldnet.att.net>
- Re: Re: Want a smooth function from Arg[ ]
- References:
- Want a smooth function from Arg[ ]
- From: scott@vader.engr.ucdavis.edu (Ryan Scott)
- Want a smooth function from Arg[ ]