I'm trying to implement a 10th-order Butterworth Low Pass digital filter on my MCU.
To find the coefficients I used Matlab's Filter Design & Analisys Tool. So I create two little scripts: in the first of them I used the Filter Object created by the tool and it seems to works perfectly, but in the second one I tryed to implement the general code based to the Biquad Direct-Form-II using only the coefficients generated by the tool and, in this case, the filter works good except for a signal amplification of about 5E+7!
My code in matlab is the following:
input = AmplitudeF8.'; delayline_lp = [0,0,0,0,0,0,0,0,0,0]; coeff_lp = [-1.7582972612745587, 0.89109671836321969, 2, 1, -1.5932765493727838, 0.71361243648860972, 2, 1, -1.4754804435926461, 0.58691950806119031, 2, 1, -1.4002643388507841, 0.50602253348347193, 2, 1, -1.3637162169443289, 0.46671403035270148, 2, 1]; for k=1:length(output1) y = output1(k); for j=1:5 %the biquad sections (order 10 = num_sections = 5) w = y; for i=1:2 w = w - (coeff_lp(((j - 1) * 4) + i) * delayline_lp(((j - 1) * 2) + i)); end y = w; for i=1:2 y = y + (coeff_lp(((j - 1) * 4) + i + 2) * delayline_lp(((j - 1) * 2) + i)); end delayline_lp(j * 2) = delayline_lp((j * 2) - 1); delayline_lp((j * 2) - 1) = w; end output2(k) = y; end
Consider that in the coeff_lp array there are a1,a2,b1,b2,.... since a0=b0=1 for every biquad section.
Why in this case the filtered signal is amplified by a 5E+7 factor? Where I'm wrong?