Re: Making a phase plot
- To: mathgroup at smc.vnet.net
- Subject: [mg62559] Re: Making a phase plot
- From: Peter Pein <petsie at dordos.net>
- Date: Mon, 28 Nov 2005 00:57:40 -0500 (EST)
- References: <dm95mr$70i$1@smc.vnet.net> <dmbr0d$qhs$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
John Doty schrieb: > Milind Gupta wrote: > >> Hello, >> I wanted to plot the phase of a transfer function. I was doing it like >> this: >> >> LogLinearPlot[Phase[w], {w, 0, wmax}] >> >> Where Phase is calculated using the ArcTan function. The problem is tha= >> t >> the ArcTan function rounds up the result to positive values when the phase >> goes below -pi. But I want the phase to keep going negative values upto >> infinity. Is there a way to do this using some standard functions? > > Well, of course ArcTan can't tell which branch you want. If you can make > a list of your phases, sampled often enough that the phase difference is > always less than Pi, the following will unwind them, figuring out which > branch to use: > > unwind[ p_ ] := Module [ > { > off = 0, > pi = Pi//N, > r = p, > t, > i > }, > > For[ i = 2, i <= Length[ p ], i += 1, > r[[i]] += off; > If[ Abs[ r[[i]]-r[[i-1]]] > pi, > t = 2 pi Sign[ r[[i]]-r[[i-1]]]; > off -= t; > r[[i]] -= t > ] > ]; > r > ] > > Wrote this about 10 years ago for a demodulator design project. I think > it's about the longest and most procedural Mathematica function I ever > wrote. Not my usual style at all, but it worked... > > -jpd > Hi John, it is quite easy to do this in a more functional way (calling your function "oldunwind"): In[1]:= oldUnwind[p_] := (* see above *) In[2]:= unwind[p_] := p + 2*Pi*(Flatten[MapIndexed[Table[#2, {Length[#1]}] & , Split[p, Abs[#1 - #2] < Pi & ]]] - 1); In[3]:= tb = N[Table[Mod[i*Pi, 2*Pi, -Pi], {i, -3, 3, 2/3}]] Out[3]= {-3.141592653589793, -1.0471975511965976, 1.0471975511965976, -3.141592653589793, -1.0471975511965976, 1.0471975511965976, -3.141592653589793, -1.0471975511965976, 1.0471975511965976, -3.141592653589793} In[4]:= unwind[tb] Out[4]= {-3.141592653589793, -1.0471975511965976, 1.0471975511965976, 3.141592653589793, 5.235987755982989, 7.330382858376184, 9.42477796076938, 11.519173063162574, 13.61356816555577, 15.707963267948966} In[5]:= % === oldUnwind[tb] Out[5]= True Regards, Peter