[SciPy-User] How to calculate Yulewalk with scipy.optimize.leastsq

josef.pktd at gmail.com josef.pktd at gmail.com
Tue Jan 17 19:33:07 EST 2012


On Tue, Jan 17, 2012 at 1:32 PM, Neal Becker <ndbecker2 at gmail.com> wrote:
> klo uo wrote:
>
>> http://www.mathworks.com/help/toolbox/signal/ref/yulewalk.html
>>
>> http://help.scilab.org/docs/5.3.3/en_US/yulewalk.html

Thanks for the references, the paper on the matlab help has some
interesting parts.

I haven't seen anything like this in python, maybe it's work for the
new scikits.signal developers.

The idea of the modified yule walker equations to get the ar
coefficients for an ARMA looked interesting so I coded that part. I
didn't manage to get equation 54 to get the MA coefficients to work.

(Instead I just use a deconvolution to go from autocovariance function
& AR coefficients to MA coefficients. It looks like it's possible to
go from the autocovariance function to recover the ARMA coefficients
with one yule walker, one modified yule walker and one deconvolution.
I just wrote some toy code for this to see if round tripping works. I
still have no idea about filter design. )

------------
import numpy as np
from scipy import linalg

def modified_yule_walker(acov, n_ar, n_ma):
    '''estimate AR part of ARMA from modified Yule-Walker equations

    The autocovariance of an ARMA process for lags greater than n_ma is
    independent of the MA part and can be used to estimate the AR part.
    (If I remember correctly.)

    Parameters
    ----------
    acov : array_like
        autocovariance, needs to have at least n_ar+n_ma terms and start with
        the zero lag, i.e. variance.
    n_ar : int
        length of autoregressive lagpolynomial, including counting the leading
        one.
    n_ma : int
        length of moving-average lagpolynomial, including counting the leading
        one. lagpolynomials with leading (zero lag) value different from one
        have not been tested.

    Returns
    -------
    ar_coefs : ndarray
        the estimated AR coefficients. the autoregressive lag-polynomial is
        [1, -arcoeffs]

    References
    ----------
    Friedlander, B., and B. Porat, 1984, equation (2)

    '''

    p, q = n_ar - 1, n_ma #Friedlander/Porat convention

    r_idx = np.arange(q,q+p+1)  #easier with index than slices
    r2_idx = np.abs(r_idx[0] - 1 - np.arange(p))

    R = linalg.toeplitz(acov[r_idx-1], acov[r2_idx])
    return linalg.lstsq(R, acov[r_idx])[0]
---------

Josef

>>
>>
>> On Mon, Jan 16, 2012 at 11:56 PM, <josef.pktd at gmail.com> wrote:
>>
>>> I have no idea about whether or how it can be used for filter design?
>>>
>>> For estimation of the filter from data, the Yule Walker equations can only
>>> estimate a autoregressive process, not an IIR filter (ARMA process).
>>>
>>>
>
> Many years ago I played around with using YuleWalker as a digital filter design
> technique.  There, I added white noise to the model (adding to the diagonal
> terms of the correlation matrix), and by varying the amount of noise, you could
> vary the filter characteristics.
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user



More information about the SciPy-User mailing list