levinsonDurbin function
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]);
}