[Scipy-svn] r6479 - trunk/scipy/signal

scipy-svn at scipy.org scipy-svn at scipy.org
Wed Jun 2 22:36:51 EDT 2010


Author: warren.weckesser
Date: 2010-06-02 21:36:51 -0500 (Wed, 02 Jun 2010)
New Revision: 6479

Modified:
   trunk/scipy/signal/waveforms.py
Log:
Fix signal.chirp to maintain old behavior, and add deprecation warnings.

Modified: trunk/scipy/signal/waveforms.py
===================================================================
--- trunk/scipy/signal/waveforms.py	2010-06-02 23:58:30 UTC (rev 6478)
+++ trunk/scipy/signal/waveforms.py	2010-06-03 02:36:51 UTC (rev 6479)
@@ -5,8 +5,9 @@
 #   Rewrote much of chirp()
 #   Added sweep_poly()
 
+import warnings
 from numpy import asarray, zeros, place, nan, mod, pi, extract, log, sqrt, \
-     exp, cos, sin, polyval, polyint
+     exp, cos, sin, polyval, polyint, size, log10
 
 def sawtooth(t,width=1):
     """
@@ -186,9 +187,83 @@
         return yI, yQ, yenv
 
 
-def chirp(t, f0, t1, f1, method='linear', phi=0, vertex_zero=True):
+# This is chirp from scipy 0.7:
+
+def old_chirp(t, f0=0, t1=1, f1=100, method='linear', phi=0, qshape=None):
     """Frequency-swept cosine generator.
 
+    Parameters
+    ----------
+    t : ndarray
+        Times at which to evaluate the waveform.
+    f0 : float or ndarray, optional
+        Frequency (in Hz) of the waveform at time 0.  If `f0` is an
+        ndarray, it specifies the frequency change as a polynomial in
+        `t` (see Notes below).
+    t1 : float, optional
+        Time at which `f1` is specified.
+    f1 : float, optional
+        Frequency (in Hz) of the waveform at time `t1`.
+    method : {'linear', 'quadratic', 'logarithmic'}, optional
+        Kind of frequency sweep.
+    phi : float
+        Phase offset, in degrees.
+    qshape : {'convex', 'concave'}
+        If method is 'quadratic', `qshape` specifies its shape.
+
+    Notes
+    -----
+    If `f0` is an array, it forms the coefficients of a polynomial in
+    `t` (see `numpy.polval`). The polynomial determines the waveform
+    frequency change in time.  In this case, the values of `f1`, `t1`,
+    `method`, and `qshape` are ignored.
+
+    This function is deprecated.  It will be removed in SciPy version 0.9.0.
+    It exists so that during in version 0.8.0, the new chirp function can
+    call this function to preserve the old behavior of the quadratic chirp.
+    """
+    warnings.warn("The function old_chirp is deprecated, and will be removed in "
+                    "SciPy 0.9", DeprecationWarning)
+    # Convert to radians.
+    phi *= pi / 180
+    if size(f0) > 1:
+        # We were given a polynomial.
+        return cos(2*pi*polyval(polyint(f0),t)+phi)
+    if method in ['linear','lin','li']:
+        beta = (f1-f0)/t1
+        phase_angle = 2*pi * (f0*t + 0.5*beta*t*t)
+    elif method in ['quadratic','quad','q']:
+        if qshape == 'concave':
+            mxf = max(f0,f1)
+            mnf = min(f0,f1)
+            f1,f0 = mxf, mnf
+        elif qshape == 'convex':
+            mxf = max(f0,f1)
+            mnf = min(f0,f1)
+            f1,f0 = mnf, mxf
+        else:
+            raise ValueError("qshape must be either 'concave' or 'convex' but "
+                "a value of %r was given." % qshape)
+        beta = (f1-f0)/t1/t1
+        phase_angle = 2*pi * (f0*t + beta*t*t*t/3)
+    elif method in ['logarithmic','log','lo']:
+        if f1 <= f0:
+            raise ValueError(
+                "For a logarithmic sweep, f1=%f must be larger than f0=%f."
+                % (f1, f0))
+        beta = log10(f1-f0)/t1
+        phase_angle = 2*pi * (f0*t + (pow(10,beta*t)-1)/(beta*log(10)))
+    else:
+        raise ValueError("method must be 'linear', 'quadratic', or "
+            "'logarithmic' but a value of %r was given." % method)
+
+    return cos(phase_angle + phi)
+
+
+def chirp(t, f0, t1, f1, method='linear', phi=0, vertex_zero=True,
+                                                            qshape=None):
+    """Frequency-swept cosine generator.
+
     In the following, 'Hz' should be interpreted as 'cycles per time unit';
     there is no assumption here that the time unit is one second.  The
     important distinction is that the units of rotation are cycles, not
@@ -213,6 +288,10 @@
         This parameter is only used when `method` is 'quadratic'.
         It determines whether the vertex of the parabola that is the graph
         of the frequency is at t=0 or t=t1.
+    qshape : str (deprecated)
+        If `method` is `quadratic` and `qshape` is not None, chirp() will
+        use scipy.signal.waveforms.old_chirp to compute the wave form.
+        This parameter is deprecated, and will be removed in SciPy 0.9.
 
     Returns
     -------
@@ -272,6 +351,24 @@
         f1 must be positive, and f0 must be greater than f1.
 
     """
+    if size(f0) > 1:
+        # Preserve old behavior for one release cycle; this can be
+        # removed in scipy 0.9.
+        warnings.warn("Passing a list of polynomial coefficients in f0 to the "
+                "function chirp is deprecated.  Use scipy.signal.sweep_poly.",
+                DeprecationWarning)
+        return old_chirp(t, f0, t1, f1, method, phi, qshape)
+
+    if method in ['quadratic', 'quad', 'q'] and qshape is not None:
+        # We must use the old version of the quadratic chirp.  Fortunately,
+        # the old API *required* that qshape be either 'convex' or 'concave'
+        # if the quadratic method was selected--`None` would raise an error.
+        # So if the code reaches this point, we should use the old version.
+        warnings.warn("The qshape keyword argument is deprecated.  "
+                "Use vertex_zero.", DeprecationWarning)
+        waveform = old_chirp(t, f0, t1, f1, method, phi, qshape)
+        return waveform
+
     # 'phase' is computed in _chirp_phase, to make testing easier.
     phase = _chirp_phase(t, f0, t1, f1, method, vertex_zero)
     # Convert  phi to radians.




More information about the Scipy-svn mailing list