levinsonDurbin function

List<double> levinsonDurbin(
  1. List<double> r,
  2. int p
)

Levinson–Durbin (Yule–Walker) AR(p)

Implementation

List<double> levinsonDurbin(List<double> r, int p) {
  final a = List<double>.filled(p+1, 0.0);
  final e = List<double>.filled(p+1, 0.0);
  a[0] = 1.0;
  if (r[0].abs() < 1e-12) return List<double>.filled(p, 0.0);
  e[0] = r[0];
  for (int k=1; k<=p; k++) {
    double acc = r[k];
    for (int j=1; j<k; j++) acc -= a[j] * r[k-j];
    double gamma = acc / e[k-1];
    gamma = gamma.clamp(-0.999, 0.999);
    final anew = List<double>.from(a);
    anew[k] = gamma;
    for (int j=1; j<k; j++) anew[j] = a[j] - gamma * a[k-j];
    for (int j=0; j<=k; j++) a[j] = anew[j];
    e[k] = e[k-1] * (1 - gamma*gamma);
  }
  return List<double>.generate(p, (i) => a[i+1]);
}