+ Post New Thread
Results 1 to 4 of 4
  1. #1
    Member level 2
    Points: 644, Level: 5

    Join Date
    Jul 2009
    Posts
    44
    Helped
    0 / 0
    Points
    644
    Level
    5

    Scaling of IIR filter coefficients for Fixed-Point FPGA implementation of filter

    I've designed a biquad IIR filter, and I would like to quantize the filter coefficients so that the difference equation can be used in a fixed-point FPGA code written in Verilog. The filter input ranges between 0 and ((2^12) -1) fixed-point values. The difference equation is Direct Form I (http://en.wikipedia.org/wiki/Digital_biquad_filter), and consists of additions, subtractions, and weighting values (coefficients).

    The filter coefficients have been designed in Matlab as floating point values. How do I convert these floating point values to fixed-point that can be used in the Verilog code? Here is an example of the SOS matrix (http://www.mathworks.com/help/toolbo...ef/sos2tf.html) with the filter coefficients.

    Code:
       
    1.0000    2.0302    1.0305    1.0000   -1.7596    0.7749
    1.0000    2.0002    1.0005    1.0000   -1.8143    0.8301
    1.0000    1.9696    0.9700    1.0000   -1.9175    0.9343
    Here are the filter coefficients in [a,b] format:

    Code:
    a =
    
        1.0000   -5.4914   12.5848  -15.4051   10.6225   -3.9118    0.6010
    
    b =
    
        1.0000    6.0000   15.0000   20.0000   15.0000    6.0000    1.0000
    The [a,b] coefficients serve as the weights (http://en.wikipedia.org/wiki/Digital_biquad_filter), and the y(n) is the output value.

    •   Alt4th March 2012, 19:23

      advertising

        
       

  2. #2
    Member level 5
    Points: 690, Level: 5

    Join Date
    Aug 2011
    Posts
    94
    Helped
    23 / 23
    Points
    690
    Level
    5

    Re: Scaling of IIR filter coefficients for Fixed-Point FPGA implementation of filter

    Converting float to fixed is fairly well known process. Some time on google will help.

    But FDATool will do this for you :) Probably will save you some time (though you won't learn how to do it).



    •   Alt4th March 2012, 20:06

      advertising

        
       

  3. #3
    Advanced Member level 3
    Points: 5,700, Level: 17

    Join Date
    Jul 2010
    Posts
    923
    Helped
    287 / 287
    Points
    5,700
    Level
    17

    Re: Scaling of IIR filter coefficients for Fixed-Point FPGA implementation of filter

    first, look at the spread of the values. Its around 6b for the integer portion (20 to -15). If you want 10b of fractional precision, then you have round((2**10) * k) for each of the values. This will give you a 16b value, where 1.0 = 1024 Keep in mind that "round" must be done carefully, as the implementation may result in the quantized coefficients giving an undesirable or even unstable impulse response. It is possible that you will need to round a 1.3 up to 2.0, or a 2.9 down to 2.0. Likewise, you might find that you'll want more fractional bits in order to allow the poles to be placed closer to the desired locations. In the hardware, you might have 12x16 multiplications. After the multiplication, you will need to (eventually) round the value by removing the lower bits. eg, a multiply by 1 would be x * 1024. the result would be 28b, and the lower 10b would be removed. This doesn't need to occur immediately though. you might have a 12x16 multiply (28b) followed by a 16b multiply (34b -- 20 fractional bits at this point). Eventually, you'll need to remove some fractional bits, as this is a recursive system.


    1 members found this post helpful.

    •   Alt4th March 2012, 20:19

      advertising

        
       

  4. #4
    Member level 2
    Points: 644, Level: 5

    Join Date
    Jul 2009
    Posts
    44
    Helped
    0 / 0
    Points
    644
    Level
    5

    Re: Scaling of IIR filter coefficients for Fixed-Point FPGA implementation of filter

    Thanks, permute; this is exactly what I was looking for.



+ Post New Thread
Please login