@@ -193,7 +193,7 @@ void common_hal_audiofilters_distortion_stop(audiofilters_distortion_obj_t *self
193193}
194194
195195static mp_float_t db_to_linear (mp_float_t value ) {
196- return expf (value * MICROPY_FLOAT_CONST (0.11512925464970228420089957273422 ));
196+ return MICROPY_FLOAT_C_FUN ( exp ) (value * MICROPY_FLOAT_CONST (0.11512925464970228420089957273422 ));
197197}
198198
199199audioio_get_buffer_result_t audiofilters_distortion_get_buffer (audiofilters_distortion_obj_t * self , bool single_channel_output , uint8_t channel ,
@@ -286,22 +286,23 @@ audioio_get_buffer_result_t audiofilters_distortion_get_buffer(audiofilters_dist
286286 int32_t word = sample_word * pre_gain ;
287287 switch (self -> mode ) {
288288 case DISTORTION_MODE_CLIP : {
289- mp_float_t word_sign = word < 0 ? -1.0f : 1.0f ;
290- word = powf ( fabs (word / 32768.0 ), 1.0001 - drive ) * word_sign * 32767.0 ;
289+ mp_float_t word_sign = word < 0 ? MICROPY_FLOAT_CONST ( -1.0 ) : MICROPY_FLOAT_CONST ( 1.0 ) ;
290+ word = MICROPY_FLOAT_C_FUN ( pow )( MICROPY_FLOAT_C_FUN ( fabs ) (word / MICROPY_FLOAT_CONST ( 32768.0 )), MICROPY_FLOAT_CONST ( 1.0001 ) - drive ) * word_sign * MICROPY_FLOAT_CONST ( 32767.0 ) ;
291291 word = MIN (MAX (word , -32767 ), 32768 ); // Hard clip
292292 } break ;
293293 case DISTORTION_MODE_LOFI : {
294294 word = word & word_mask ;
295295 } break ;
296296 case DISTORTION_MODE_OVERDRIVE : {
297- mp_float_t x = word / 32768.0 * 0.686306 ;
298- mp_float_t z = 1 + expf (sqrtf (fabs (x )) * -0.75 );
299- word = (expf (x ) - expf (- x * z )) / (expf (x ) + expf (- x )) * 32767.0 ;
297+ mp_float_t x = word / MICROPY_FLOAT_CONST (32768.0 ) * MICROPY_FLOAT_CONST (0.686306 );
298+ mp_float_t z = MICROPY_FLOAT_CONST (1.0 ) + MICROPY_FLOAT_C_FUN (exp )(MICROPY_FLOAT_C_FUN (sqrt )(MICROPY_FLOAT_C_FUN (fabs )(x )) * MICROPY_FLOAT_CONST (-0.75 ));
299+ mp_float_t exp_x = MICROPY_FLOAT_C_FUN (exp )(x );
300+ word = (exp_x - MICROPY_FLOAT_C_FUN (exp )(- x * z )) / (exp_x + MICROPY_FLOAT_C_FUN (exp )(- x )) * MICROPY_FLOAT_CONST (32767.0 );
300301 } break ;
301302 case DISTORTION_MODE_WAVESHAPE : {
302- mp_float_t x = word / 32768.0 ;
303- mp_float_t k = 2 * drive / (1.00001 - drive );
304- word = (1.0 + k ) * x / (1.0 + k * fabsf ( x )) * 32767.0 ;
303+ mp_float_t x = word / MICROPY_FLOAT_CONST ( 32768.0 ) ;
304+ mp_float_t k = MICROPY_FLOAT_CONST ( 2.0 ) * drive / (MICROPY_FLOAT_CONST ( 1.00001 ) - drive );
305+ word = (MICROPY_FLOAT_CONST ( 1.0 ) + k ) * x / (MICROPY_FLOAT_CONST ( 1.0 ) + k * MICROPY_FLOAT_C_FUN ( fabs )( x )) * MICROPY_FLOAT_CONST ( 32767.0 ) ;
305306 } break ;
306307 }
307308 word = word * post_gain ;
0 commit comments