PID controller stabilization
diff --git a/src/core/lib/transport/bdp_estimator.c b/src/core/lib/transport/bdp_estimator.c
index 4c2c1d3..90e4332 100644
--- a/src/core/lib/transport/bdp_estimator.c
+++ b/src/core/lib/transport/bdp_estimator.c
@@ -39,33 +39,16 @@
 #include <grpc/support/useful.h>
 
 void grpc_bdp_estimator_init(grpc_bdp_estimator *estimator) {
-  estimator->num_samples = 0;
-  estimator->first_sample_idx = 0;
+  estimator->estimate = 65536;
   estimator->ping_state = GRPC_BDP_PING_UNSCHEDULED;
 }
 
 bool grpc_bdp_estimator_get_estimate(grpc_bdp_estimator *estimator,
                                      int64_t *estimate) {
-  if (estimator->num_samples < GRPC_BDP_MIN_SAMPLES_FOR_ESTIMATE) {
-    return false;
-  }
-
-  *estimate = -1;
-  for (uint8_t i = 0; i < estimator->num_samples; i++) {
-    *estimate = GPR_MAX(
-        *estimate,
-        estimator
-            ->samples[(estimator->first_sample_idx + i) % GRPC_BDP_SAMPLES]);
-  }
+  *estimate = estimator->estimate;
   return true;
 }
 
-static int64_t *sampling(grpc_bdp_estimator *estimator) {
-  return &estimator
-              ->samples[(estimator->first_sample_idx + estimator->num_samples) %
-                        GRPC_BDP_SAMPLES];
-}
-
 bool grpc_bdp_estimator_add_incoming_bytes(grpc_bdp_estimator *estimator,
                                            int64_t num_bytes) {
   switch (estimator->ping_state) {
@@ -74,7 +57,7 @@
     case GRPC_BDP_PING_SCHEDULED:
       return false;
     case GRPC_BDP_PING_STARTED:
-      *sampling(estimator) += num_bytes;
+      estimator->accumulator += num_bytes;
       return false;
   }
   GPR_UNREACHABLE_CODE(return false);
@@ -88,15 +71,14 @@
 void grpc_bdp_estimator_start_ping(grpc_bdp_estimator *estimator) {
   GPR_ASSERT(estimator->ping_state == GRPC_BDP_PING_SCHEDULED);
   estimator->ping_state = GRPC_BDP_PING_STARTED;
-  if (estimator->num_samples == GRPC_BDP_SAMPLES) {
-    estimator->first_sample_idx++;
-    estimator->num_samples--;
-  }
-  *sampling(estimator) = 0;
+  estimator->accumulator = 0;
 }
 
 void grpc_bdp_estimator_complete_ping(grpc_bdp_estimator *estimator) {
   GPR_ASSERT(estimator->ping_state == GRPC_BDP_PING_STARTED);
-  estimator->num_samples++;
+  if (estimator->accumulator > 2 * estimator->estimate / 3) {
+    estimator->estimate *= 2;
+    gpr_log(GPR_DEBUG, "est --> %" PRId64, estimator->estimate);
+  }
   estimator->ping_state = GRPC_BDP_PING_UNSCHEDULED;
 }