diff --git a/pico/lib/picosig2.c b/pico/lib/picosig2.c
index 5fb6f1d..52943e6 100644
--- a/pico/lib/picosig2.c
+++ b/pico/lib/picosig2.c
@@ -412,14 +412,29 @@
  * @callgraph
  * @callergraph
  */
-void sigDspInitialize(sig_innerobj_t *sig_inObj, picoos_int32 resetMode)
+void sigDspInitialize(sig_innerobj_t *sig_inObj, picoos_int32 r_mode)
 {
     picoos_int32 i, j;
     picoos_int32 *pnt;
 
-    if (resetMode == PICO_RESET_SOFT) {
+    if (r_mode == PICO_RESET_SOFT) {
         /*minimal initialization when receiving a soft reset */
         return;
+        /*
+        sig_inObj->voxbnd_p = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p
+                / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2)
+                * (picoos_single) sig_inObj->VCutoff_p);
+        sig_inObj->voxbnd2_p
+                = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p
+                        / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2)
+                        * (picoos_single) sig_inObj->UVCutoff_p);
+        sig_inObj->nextPeak_p = (((int) (PICODSP_FFTSIZE))
+                / ((int) PICODSP_DISPLACE) - 1) * sig_inObj->hop_p;
+        for (i = 0; i < 2 * PICODSP_FFTSIZE; i++) {
+             sig_inObj->int_vec26[i] = 0;
+        }
+        return;
+        */
     }
     /*-----------------------------------------------------------------
      * Initialization
@@ -779,8 +794,6 @@
     picoos_int32 *norm_window; /* - fixed point */
     picoos_int32 *fr, *Fr, *Fi, *t1, ff; /* - fixed point */
 
-    picoos_int32 mx,mn, rat;
-
     /*Link local variables with sig object*/
     m2 = sig_inObj->m2_p;
     m4 = m2 >> 1;
@@ -805,56 +818,16 @@
     /*window, normalize and differentiate*/
     *E = norm_result(m2, fr, norm_window);
 
-    if (*E > 0) {
+    if (*E > 0)
         f = *E * PICODSP_FIXRESP_NORM;
-    } else {
+    else
         f = 20; /*PICODSP_FIXRESP_NORM*/
-    }
     ff = (picoos_int32) f;
     if (ff < 1)
         ff = 1;
     /*normalize impulse response*/
     t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,*(t1++) /= ff;); /* - fixed point */
 
-
-    mx = mn = 0;
-    t1 = fr;
-    FAST_DEVICE(PICODSP_FFTSIZE,if (*t1>mx) mx=*t1; if (*t1<mn) mn=*t1; t1++;);
-    mn = -mn;
-    if (mx>mn) {
-        rat = mx / (mn>>5);     /* ratio * 32*/
-        if (rat > 40) rat = 40; /* 1.25 * 32 */
-        /* now rat is between 32 and 40 */
-        switch (rat) {
-            case 32:  /* do nothing */
-                break;
-            case 33:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(-*t1)>>5; t1++;);
-                break;
-            case 34:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(-*t1)>>4; t1++;);
-                break;
-            case 35:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(((-*t1)>>5)+((-*t1)>>4)); t1++;);
-                break;
-            case 36:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(-*t1)>>3; t1++;);
-                break;
-            case 37:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(((-*t1)>>5)+((-*t1)>>3)); t1++;);
-                break;
-            case 38:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(((-*t1)>>4)+((-*t1)>>3)); t1++;);
-                break;
-            case 39:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(((-*t1)>>5)+((-*t1)>>4) + ((-*t1)>>3)); t1++;);
-                break;
-            case 40:
-                t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,if (*t1<0) *t1-=(-*t1)>>2; t1++;);
-                break;
-        }
-    }
-
 } /* impulse_response */
 
 /**
@@ -4064,10 +4037,6 @@
     F0 = sig_inObj->F0_p;
     voiced = sig_inObj->voiced_p;
 
-    if (E>5) E = 4;
-    if (E>1) E *= 2;
-
-
     /* shift previous excitation window by hop samples*/
     for (nI = 0; nI < sig_inObj->nV; nI++) {
         sig_inObj->LocV[nI] = sig_inObj->LocV[nI] - hop;
