summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDelyan Kratunov <delyan.kratunov@gmail.com>2010-05-02 20:30:44 +0000
committerDelyan Kratunov <delyan.kratunov@gmail.com>2010-05-02 20:30:44 +0000
commitaf466f3cbfc718c0539f2cf7743d614ecf6cd159 (patch)
treea7ac350f1e5a21cc1a53849766d0200ae3eecb7a
parent7f9d30ba3eb97cf8b304b0d546f1b3311cc1ffae (diff)
downloadrockbox-af466f3cbfc718c0539f2cf7743d614ecf6cd159.tar.gz
rockbox-af466f3cbfc718c0539f2cf7743d614ecf6cd159.zip
FFT plugin: eliminate 64-bit math. This should result in faster and probably more accurate calculations.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25790 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/fft/SOURCES1
-rw-r--r--apps/plugins/fft/fft.c35
-rw-r--r--apps/plugins/fft/math.h8
3 files changed, 21 insertions, 23 deletions
diff --git a/apps/plugins/fft/SOURCES b/apps/plugins/fft/SOURCES
index 07fb013eaa..ebe5f3067b 100644
--- a/apps/plugins/fft/SOURCES
+++ b/apps/plugins/fft/SOURCES
@@ -1,4 +1,3 @@
1kiss_fft.c 1kiss_fft.c
2kiss_fftr.c 2kiss_fftr.c
3fft.c 3fft.c
4math.c
diff --git a/apps/plugins/fft/fft.c b/apps/plugins/fft/fft.c
index ae07179557..acc19fabe5 100644
--- a/apps/plugins/fft/fft.c
+++ b/apps/plugins/fft/fft.c
@@ -307,8 +307,8 @@ struct {
307/************************* End of globals *************************/ 307/************************* End of globals *************************/
308 308
309/************************* Math functions *************************/ 309/************************* Math functions *************************/
310#define QLOG_MAX 286286 310#define QLOG_MAX 0x00040000
311#define QLIN_MAX 1534588906 311#define QLIN_MAX 0x5B000000
312#define QLN_10 float_q16(2.302585093) 312#define QLN_10 float_q16(2.302585093)
313#define LIN_MAX (QLIN_MAX >> 16) 313#define LIN_MAX (QLIN_MAX >> 16)
314 314
@@ -350,24 +350,31 @@ void apply_window_func(char mode)
350/* Calculates the magnitudes from complex numbers and returns the maximum */ 350/* Calculates the magnitudes from complex numbers and returns the maximum */
351int32_t calc_magnitudes(bool logarithmic) 351int32_t calc_magnitudes(bool logarithmic)
352{ 352{
353 int64_t tmp; 353 /* A major assumption made when calculating the Q*MAX constants
354 * is that the maximum magnitude is 29 bits long. */
355
356 uint32_t tmp;
354 size_t i; 357 size_t i;
355 358
356 int32_t max = -2147483647; 359 int32_t max = 0;
357 360
358 /* Calculate the magnitude, discarding the phase. 361 /* Calculate the magnitude, discarding the phase. */
359 * The sum of the squares can easily overflow the 15-bit (s15.16)
360 * requirement for fsqrt, so we scale the data down */
361 for (i = 0; i < ARRAYSIZE_PLOT; ++i) 362 for (i = 0; i < ARRAYSIZE_PLOT; ++i)
362 { 363 {
363 tmp = output[i].r * output[i].r + output[i].i * output[i].i; 364 tmp = output[i].r * output[i].r + output[i].i * output[i].i;
364 tmp <<= 16;
365
366 tmp = fsqrt64(tmp, 16);
367
368 if (logarithmic)
369 tmp = get_log_value(tmp & 0x7FFFFFFF);
370 365
366 if (tmp > 0x7FFFFFFF) tmp >>= 1; /* if our assumptions are correct,
367 this should never happen. It's just
368 a safeguard. */
369 if (tmp > 0)
370 {
371 tmp = fp_sqrt(tmp, 0); /* linear scaling, nothing
372 bad should happen */
373 tmp <<= 16;
374 if (logarithmic)
375 tmp = get_log_value(tmp);/* the log function
376 expects s15.16 values */
377 }
371 plot[i] = tmp; 378 plot[i] = tmp;
372 379
373 if (plot[i] > max) 380 if (plot[i] > max)
diff --git a/apps/plugins/fft/math.h b/apps/plugins/fft/math.h
index 450b9aafcb..ffacf1eedb 100644
--- a/apps/plugins/fft/math.h
+++ b/apps/plugins/fft/math.h
@@ -17,12 +17,4 @@
17#define float_q15(a) float_q(a, 15) 17#define float_q15(a) float_q(a, 15)
18#define float_q16(a) float_q(a, 16) 18#define float_q16(a) float_q(a, 16)
19 19
20/**
21 * Fixed point square root via Newton-Raphson.
22 * @param a square root argument.
23 * @param fracbits specifies number of fractional bits in argument.
24 * @return Square root of argument in same fixed point format as input.
25 */
26int64_t fsqrt64(int64_t a, unsigned int fracbits);
27
28#endif 20#endif