# Comparison of results with Direct form1 and Direct form2 implementation of IIR filters

The results obtained from Direct form1 and Direct form2 implementations (in C language) of IIR (BiQuad) filters are a little different. In the implementation, i have made the b0 coefficient as 1. So, I am just using 4 coefficients (a2,a1,b2,b1) in the implementation. The maximum error between the obtained outputs from these two implementations is in the range of 0.01 for the ITU-T standard audio test signal. So, I just want to know whether this error is because of the implementation, or any other reasons? Will the Outputs of both implementations be the same, always (i.e. error is almost 0)?

In the implementation, I am using around 8 stages of filtering. (i.e. Cascaded Biquad filters)

The referred structure forms as attached below. enter image description here

• It is likely due to precision error / round-off error. What precision are you using? Jun 8 '20 at 12:16
• Hi, I'm working on float values. Is there a way to improve the precision of the results?
– rkc
Jun 8 '20 at 13:31
• There should be no difference and you already did the right thing to implement it as a cascade of biquads. If you implement fixed point in an FPGA you could consider transposed Direct Form 2 to minimize parasitic delays in the adder tree, but that won't explain your errors. Can you post your coefficients you use for one of the stages and the error you get for that? Jun 8 '20 at 13:35
• The coefficients used at one of the stages are -0.95353f, 1.95293f, 1.00000f and -1.99991f and the results obtained are 0.0001643819 (Direct form 2) and 0.0001643784 (Direct form 1)
– rkc
Jun 8 '20 at 13:51

Will the Outputs of both implementations be the same, always (i.e. error is almost 0)?

That depends A LOT on the numerical precision of your data representation and mathematical operations and on the filter itself, specifically the location of the poles.

If you use double precision in a communication application, there should be little to no difference. If you are trying to do audio processing with 16-bit fixed point format, the errors induced by Direct Form II are so large that it's basically unusable.

• Thanks for the response. The filter implementation in my case is based on float values. On comparison, I observed that most of the output sample values (obtained in both the cases) are getting differed only after the 5th or 6th decimal point (since I am working on float values). And also, I want to know which implementation will be better i.e. Direct form 1 or Direct form 2, in case, if I switch to fixed-point notation.
– rkc
Jun 8 '20 at 13:10
• I also want to know which implementation will be better i.e. Direct form1 or Direct form2, in case, if I switch to 32-bit fixed-point notation instead of 16 bit fixed point.
– rkc
Jun 8 '20 at 13:26
• Don't use Direct Form II. Use either Direct Form I (safest) or Transposed Form II (almost as safe but less storage requirements) Jun 8 '20 at 20:46