diff options
author | Andree Buschmann <AndreeBuschmann@t-online.de> | 2008-06-22 09:11:06 +0000 |
---|---|---|
committer | Andree Buschmann <AndreeBuschmann@t-online.de> | 2008-06-22 09:11:06 +0000 |
commit | f0087f06aad7c35d5c95421e661f0852814cf90a (patch) | |
tree | c4716ed123f9aa0d622294976a8e20adbada3cd3 /apps/codecs/libmusepack/synth_filter.c | |
parent | 5acfae2a3c42bc9c585b80d60a4842037c0a8048 (diff) | |
download | rockbox-f0087f06aad7c35d5c95421e661f0852814cf90a.tar.gz rockbox-f0087f06aad7c35d5c95421e661f0852814cf90a.zip |
Small correction to avoid overflow within calculate_V()-function. Re-enable full precision for ARM as speed-optimized version is not that much faster anymore.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17750 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libmusepack/synth_filter.c')
-rw-r--r-- | apps/codecs/libmusepack/synth_filter.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/apps/codecs/libmusepack/synth_filter.c b/apps/codecs/libmusepack/synth_filter.c index 7d83c752e7..fb956fbff4 100644 --- a/apps/codecs/libmusepack/synth_filter.c +++ b/apps/codecs/libmusepack/synth_filter.c | |||
@@ -115,8 +115,8 @@ static const MPC_SAMPLE_FORMAT Di_opt [512] ICONST_ATTR = { | |||
115 | 115 | ||
116 | #undef D | 116 | #undef D |
117 | 117 | ||
118 | // needed to prevent from internal overflow in calculate_V | 118 | // needed to prevent from internal overflow in calculate_V (see below) |
119 | #define OVERFLOW_FIX 1 | 119 | #define OVERFLOW_FIX 2 |
120 | 120 | ||
121 | // V-coefficients were expanded (<<) by V_COEFFICIENT_EXPAND | 121 | // V-coefficients were expanded (<<) by V_COEFFICIENT_EXPAND |
122 | #define V_COEFFICIENT_EXPAND 27 | 122 | #define V_COEFFICIENT_EXPAND 27 |
@@ -128,6 +128,7 @@ static const MPC_SAMPLE_FORMAT Di_opt [512] ICONST_ATTR = { | |||
128 | #define MPC_MULTIPLY_V(sample, vcoef) ( MPC_SHR_RND(sample, 12) * vcoef ) | 128 | #define MPC_MULTIPLY_V(sample, vcoef) ( MPC_SHR_RND(sample, 12) * vcoef ) |
129 | 129 | ||
130 | // pre- and postscale are used to avoid internal overflow in synthesis calculation | 130 | // pre- and postscale are used to avoid internal overflow in synthesis calculation |
131 | // samples are s15.0, v-coefs are 4.12 -> internal format is s19.12 | ||
131 | #define MPC_MULTIPLY_V_PRESCALE(sample, vcoef) ( MPC_SHR_RND(sample, (12+OVERFLOW_FIX)) * vcoef ) | 132 | #define MPC_MULTIPLY_V_PRESCALE(sample, vcoef) ( MPC_SHR_RND(sample, (12+OVERFLOW_FIX)) * vcoef ) |
132 | #define MPC_MULTIPLY_V_POSTSCALE(sample, vcoef) ( MPC_SHR_RND(sample, (12-OVERFLOW_FIX)) * vcoef ) | 133 | #define MPC_MULTIPLY_V_POSTSCALE(sample, vcoef) ( MPC_SHR_RND(sample, (12-OVERFLOW_FIX)) * vcoef ) |
133 | #define MPC_V_POSTSCALE(sample) (sample<<OVERFLOW_FIX) | 134 | #define MPC_V_POSTSCALE(sample) (sample<<OVERFLOW_FIX) |
@@ -141,6 +142,7 @@ static const MPC_SAMPLE_FORMAT Di_opt [512] ICONST_ATTR = { | |||
141 | #define MPC_MULTIPLY_V(sample, vcoef) ( (MPC_MULTIPLY_FRACT(sample, vcoef)) << (32-V_COEFFICIENT_EXPAND) ) | 142 | #define MPC_MULTIPLY_V(sample, vcoef) ( (MPC_MULTIPLY_FRACT(sample, vcoef)) << (32-V_COEFFICIENT_EXPAND) ) |
142 | 143 | ||
143 | // pre- and postscale are used to avoid internal overflow in synthesis calculation | 144 | // pre- and postscale are used to avoid internal overflow in synthesis calculation |
145 | // samples are s15.14, v-coefs are 4.27 -> internal format is s19.12 | ||
144 | #define MPC_MULTIPLY_V_PRESCALE(sample, vcoef) ( (MPC_MULTIPLY_FRACT(sample, vcoef)) << (32-V_COEFFICIENT_EXPAND-OVERFLOW_FIX) ) | 146 | #define MPC_MULTIPLY_V_PRESCALE(sample, vcoef) ( (MPC_MULTIPLY_FRACT(sample, vcoef)) << (32-V_COEFFICIENT_EXPAND-OVERFLOW_FIX) ) |
145 | #define MPC_MULTIPLY_V_POSTSCALE(sample, vcoef) ( (MPC_MULTIPLY_FRACT(sample, vcoef)) << (32-V_COEFFICIENT_EXPAND+OVERFLOW_FIX) ) | 147 | #define MPC_MULTIPLY_V_POSTSCALE(sample, vcoef) ( (MPC_MULTIPLY_FRACT(sample, vcoef)) << (32-V_COEFFICIENT_EXPAND+OVERFLOW_FIX) ) |
146 | #define MPC_V_POSTSCALE(sample) (sample<<OVERFLOW_FIX) | 148 | #define MPC_V_POSTSCALE(sample) (sample<<OVERFLOW_FIX) |