Hello,
I want to try using an fixed point based FFT routine instead of the current
floating point based routine. I have a user of my software that has a 800
Mhz VIA chipset motherboard, and the FPU on that thing is so bad, it can't
crunch an audio signal in real time (i.e. - while they are talking). On
non-VIA systems the computer is able to keep up in real time (it's a speech
recognition app.)
I found the KISS FFT project on SourceForge which is able to do fixed point
FFT as well as floating point
http://sourceforge.net/projects/kissfft/
However, when I use it compiled with fixed point data values, I get erratic
tiny values for the output complex data values. When compiled with floating
point values it matches closely the original FFT routine's outputs.
So it appears I don't know how to convert floating point values to fixed
point values. I found a post by the author of KISS FFT that said this:
"If you're not familiar with fixed point math, here's a crash course:
A common format for fixed point calculations is to use 15bits of a 16 bit
signed integer to represent the fractional part of a number from -1 to 1.
In other words, the range of a 16 bit integer (-32768:32767) is mapped to
(-1:.99997)
Note that 32768 cannot be represented as a 16 bit signed integer, thus
xfloat cannot equal 1.
So define xfix := round( xfloat * 32768) , where -1 <= xfloat < 1"
I want to be clear about what I don't understand about converting floating
point values to fixed point values.
Given the above and a floating point sample value such as 1000.4897 (as an
example), am I remapping 1000.4897 to a number between -1 and .99997?
Or am I just remapping the fractional portion (0.4897) to -1 and .99997?
If it's the latter case, am I supposed to create two fixed point values for
each floating point value, one for the integer portion of the floating point
number (1000) and one for the fractional portion (0.9997)?
Thanks,
Robert