diff options
author | Ghislain 'Aus' Lacroix <aus@songbirdnest.com> | 2009-05-28 12:39:46 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-05-28 12:39:46 +0200 |
commit | 9507cdc84c968dc142356157c861e8d216b85716 (patch) | |
tree | a420d32f36535f139d24e8ecc7ca1e37b713d1d3 /gst/equalizer | |
parent | 0c61b20ac6748f1fcd809fcab26f9968052ad1ec (diff) |
equalizer: Use floating point arithmetic internally for the int16 mode
By using int32 arithmetic we will introduce distortions as the
IIR filter is very sensitive to rounding errors. Fixes bug #580214.
Diffstat (limited to 'gst/equalizer')
-rw-r--r-- | gst/equalizer/gstiirequalizer.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/gst/equalizer/gstiirequalizer.c b/gst/equalizer/gstiirequalizer.c index 4d21a874..060441a3 100644 --- a/gst/equalizer/gstiirequalizer.c +++ b/gst/equalizer/gstiirequalizer.c @@ -392,9 +392,9 @@ setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) gain = arg_to_scale (band->gain); - if (band->freq / GST_AUDIO_FILTER (equ)->format.rate > 0.5) + if (band->freq / GST_AUDIO_FILTER (equ)->format.rate >= 0.5) omega = M_PI; - else if (band->freq < 0.0) + else if (band->freq <= 0.0) omega = 0.0; else omega = 2.0 * M_PI * (band->freq / GST_AUDIO_FILTER (equ)->format.rate); @@ -557,9 +557,9 @@ one_step_ ## TYPE (GstIirEqualizerBand *filter, \ SecondOrderHistory ## TYPE *history, BIG_TYPE input) \ { \ /* calculate output */ \ - BIG_TYPE output = floor (filter->a0 * input + \ + BIG_TYPE output = filter->a0 * input + \ filter->a1 * history->x1 + filter->a2 * history->x2 + \ - filter->b1 * history->y1 + filter->b2 * history->y2 + 0.5); \ + filter->b1 * history->y1 + filter->b2 * history->y2; \ /* update history */ \ history->y2 = history->y1; \ history->y1 = output; \ @@ -591,7 +591,7 @@ guint size, guint channels) \ history++; \ } \ cur = CLAMP (cur, MIN_VAL, MAX_VAL); \ - *((TYPE *) data) = (TYPE) cur; \ + *((TYPE *) data) = (TYPE) floor (cur); \ data += sizeof (TYPE); \ } \ } \ @@ -647,7 +647,7 @@ guint size, guint channels) \ } \ } -CREATE_OPTIMIZED_FUNCTIONS_INT (gint16, gint32, -32768, 32767); +CREATE_OPTIMIZED_FUNCTIONS_INT (gint16, gfloat, -32768.0, 32767.0); CREATE_OPTIMIZED_FUNCTIONS (gfloat); CREATE_OPTIMIZED_FUNCTIONS (gdouble); |