csignal-processingfixed-pointdigital-filter

How can we code in fixed-point representation for signed floating point input?


The microcontroller I have to implement my digital filter does not support floating point operations.

Given an analog input signal (which can take on values from -1.65 V to 1.65 V) sampled at a given rate of 100 Hz, I can only perform fixed-point operations. So I'm guessing I have to convert my input to fixed point first. It is also stated that the output of the ADC is quantized into unsigned 10-bit values.

My problem is.

I know that there is a Qm.n format for fixed-points which includes a sign bit. And none of the references online include conversion from signed input floating point to unsigned fixed-point

AND I FOUND THIS CODE:

int fixedValue = (int)Math.Round(floatValue*Scale);

double floatValue = (double)fixedValue/Scale;

Questions: 1. How can I choose my scaling factor? 2. Is it dependent on the range of my input values and the number of bits used for the fixed-point representation? 3. The Qm.n format uses a signed bit. Can fixed point representations be unsigned?

It all boils down to choosing the scaling factor and mapping from signed input to unsigned 10 bit fixed point (which will be used for further calculations in solving a difference equation then converting it back to double at the output)

Thanks in advance.


Solution

  • Use a simple 2-point interpolation.

    #define Value_MAX  1.65
    #define Value_MIN  (-1.65)
    #define value10bit_MAX  1023
    #define value10bit_MIN  0
    #define slope ((value10bit_MAX - value10bit_MIN)/(Value_MAX - Value_MIN))
    
    int value10bit = (int)Math.Round((floatValue - Value_MIN)*slope + value10bit_MIN);
    

    OP reports "microcontroller that only support fixed-point operations." yet appears to be using (or wants to use) int fixedValue = (int)Math.Round(floatValue*Scale);. So maybe this works for OP