[Speex-dev] Precomputing the remaining floating point operations.
Jean-Marc Valin
Jean-Marc.Valin at USherbrooke.ca
Mon Sep 26 22:43:40 PDT 2005
Hi Nic,
While I must say it's a clever idea to cache data, I think merging this
would be a really bad idea. The possibilities for screwing things up
with this are just too great - there's already people sending all kind
of crap to the encoder (and expecting it to work) that I don't want to
introduce something that's really more complicated to understand. I
think the initialization code should just be fixed-point-ized at some
pint. BTW, since initialization is only run once for a channel (and
running for more channels will break your hack), even float emulation
will usually work fine in the mean time.
As for accuracy in converting to fixed-point, I don't think it's a big
issue. The two things that are still in float are the window, for which
I already have a fixed-point version of cos, and the auto-correlation
lag-window, which can probably be approximated very well by Taylor
expansion.
Jean-Marc
Le lundi 26 septembre 2005 à 17:34 +0200, Nic Roets a écrit :
> I see there are still some floating point operations left in the codec
> init(ialization) code. Changing that code to fixed point is not only
> difficult (due to the trigonometric functions etc) but may also degrade the
> precision.
>
> Here is an idea whereby we can easily precompute (record) all those values
> on a powerful processor and then use (replay) them on an embedded processor
> / DSP. The only requirement is that 'xxx_init_xxx' should be called in
> exactly the same environment in both cases (e.g. FIXED_POINT and with the
> same mode or sequence of modes).
>
> All that's needed is to include the code segment below in one of the .h
> files and wrap all those float calculations in RECOPLAY, e.g. int sqrt2 =
> RECOPLAY(sqrt(2)*16384)
> I've also made RECOPLAY_MARK(name) to synchronize the process.
>
> #ifdef RECORD
> #include <stdio.h>
>
> extern FILE *recordFile;
>
> #define _RECOPLAY_FOPEN \
> if (!recordFile && (recordFile = fopen ("precompute.c", "w")) != NULL)
> { \
> fprintf (recordFile, "#include \"config.h\"\n\
> #ifndef EMBEDDED\n\
> #include <stdio.h>\n\
> FILE *recordFile = NULL;\n\
> #else\n\
> int recordDefault[]={\n");\
> atexit (CloseRecordFile); \
> } \
>
> #define RECOPLAY_MARK(name) { _RECOPLAY_FOPEN; \
> if (recordFile) fprintf (recordFile, "}, record"#name"[] = {\n"); \
> }
>
> #define RECOPLAY(x) ({ \
> int v = (x); \
> _RECOPLAY_FOPEN; \
> fprintf (recordFile, " %d,\n", v); \
> v; \
> })
>
> static void CloseRecordFile (void)
> {
> if (recordFile) {
> fprintf (recordFile, "}, *recordPtr = recordDefault;\n #endif\n");
> fclose (recordFile);
> }
> }
>
> #else /* Not recording */
> #ifndef EMBEDDED
> #define RECOPLAY_MARK(x)
> #define RECOPLAY(x) (x)
> #else
> extern int *recordPtr;
> #define RECOPLAY_MARK(x) {extern int record ## x[]; recordPtr = record ##
> x; }
> #define RECOPLAY(x) *recordPtr++
> /* Embedded version of RECOPLAY does not evaluate 'x' */
> #endif
> #endif
>
> _______________________________________________
> Speex-dev mailing list
> Speex-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/speex-dev
>
More information about the Speex-dev
mailing list