// create least mean-squares (LMS) equalizer object // _h : initial coefficients [size: _p x 1], default if NULL // _p : equalizer length (number of taps) EQLMS() EQLMS(_create)(T * _h, unsigned int _p) { EQLMS() eq = (EQLMS()) malloc(sizeof(struct EQLMS(_s))); // set filter order, other params eq->p = _p; eq->mu = 0.5f; eq->h0 = (T*) malloc((eq->p)*sizeof(T)); eq->w0 = (T*) malloc((eq->p)*sizeof(T)); eq->w1 = (T*) malloc((eq->p)*sizeof(T)); eq->buffer = WINDOW(_create)(eq->p); eq->x2 = wdelayf_create(eq->p); // copy coefficients (if not NULL) if (_h == NULL) { // initial coefficients with delta at first index unsigned int i; for (i=0; i<eq->p; i++) eq->h0[i] = (i==0) ? 1.0 : 0.0; } else { // copy user-defined initial coefficients memmove(eq->h0, _h, (eq->p)*sizeof(T)); } // reset equalizer object EQLMS(_reset)(eq); return eq; }
// create least mean-squares (LMS) equalizer object // _h : initial coefficients [size: _h_len x 1], default if NULL // _p : equalizer length (number of taps) EQLMS() EQLMS(_create)(T * _h, unsigned int _h_len) { EQLMS() q = (EQLMS()) malloc(sizeof(struct EQLMS(_s))); // set filter order, other params q->h_len = _h_len; q->mu = 0.5f; q->h0 = (T*) malloc((q->h_len)*sizeof(T)); q->w0 = (T*) malloc((q->h_len)*sizeof(T)); q->w1 = (T*) malloc((q->h_len)*sizeof(T)); q->buffer = WINDOW(_create)(q->h_len); q->x2 = wdelayf_create(q->h_len); // copy coefficients (if not NULL) if (_h == NULL) { // initial coefficients with delta at first index unsigned int i; for (i=0; i<q->h_len; i++) q->h0[i] = (i==0) ? 1.0 : 0.0; } else { // copy user-defined initial coefficients memmove(q->h0, _h, (q->h_len)*sizeof(T)); } // reset equalizer object EQLMS(_reset)(q); // return main object return q; }
// // AUTOTEST: wdelayf // void autotest_wdelayf() { float v; // reader unsigned int i; // create wdelay // wdelay: 0 0 0 0 wdelayf w = wdelayf_create(4); wdelayf_read(w, &v); CONTEND_EQUALITY(v, 0); float x0[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; float y0_test[10] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6}; float y0[10]; for (i=0; i<10; i++) { wdelayf_read(w, &y0[i]); wdelayf_push(w, x0[i]); //printf("%3u : %6.2f (%6.2f)\n", i, y0[i], y0_test[i]); } // 7 8 9 10 CONTEND_SAME_DATA(y0, y0_test, 10*sizeof(float)); // re-create wdelay object // wdelay: 0 0 7 8 9 10 w = wdelayf_recreate(w,6); float x1[10] = {3, 4, 5, 6, 7, 8, 9, 2, 2, 2}; float y1_test[10]= {0, 0, 7, 8, 9, 10,3, 4, 5, 6}; float y1[10]; for (i=0; i<10; i++) { wdelayf_read(w, &y1[i]); wdelayf_push(w, x1[i]); //printf("%3u : %6.2f (%6.2f)\n", i, y1[i], y1_test[i]); } // wdelay: 7 8 9 2 2 2 CONTEND_SAME_DATA(y1, y1_test, 10*sizeof(float)); // re-create wdelay object // wdelay: 8 9 2 2 2 w = wdelayf_recreate(w,5); float x2[10] = {1, 1, 1, 1, 1, 1, 1, 2, 3, 4}; float y2_test[10]= {8, 9, 2, 2, 2, 1, 1, 1, 1, 1}; float y2[10]; for (i=0; i<10; i++) { wdelayf_read(w, &y2[i]); wdelayf_push(w, x2[i]); //printf("%3u : %6.2f (%6.2f)\n", i, y1[i], y1_test[i]); } // wdelay: 1 1 2 3 4 CONTEND_SAME_DATA(y2, y2_test, 10*sizeof(float)); // destroy object wdelayf_destroy(w); }