[Scilab-users] Unexpected result using horner
Samuel Gougeon
sgougeon at free.fr
Mon Jul 25 12:21:13 CEST 2022
Le 25/07/2022 à 02:44, Federico Miyara a écrit :
>
> Samuel,
>
>> Sorry, but nothing is clear to me about your statements:
>>
>> 1) what shows you that iir() is correct while the analpf + horner way
>> is not?
>
> There are several reasons:
>
> a) The result of using iir() is consistent with the expected frequency
> response, since it is equal to the analog filter response except at
> high frequency, an expected artifact for IIR filters. The other
> solution is completely different.
>
> b) The degree of the denominator should be 6 but when using horner it
> reduces to 3.
>
> My own informal and not very deep analysis suggests that as all the
> poles are very close to unity, may be horner() performs some
> simplification and simplifies things incorrectly, which might
> dramatically change the frequency response.
>
>> 2) With the analpf + horner method, assuming that it is not correct,
>> what shows you that horner is not correct, while analpf is correct,
>> instead of the opposite or both incorrect?
>
> analpf() is a very simple algorithm, at least for Butterworth, since
> explicit formulas for the poles exist and in all the cases I have
> tested the result is the expected one, particularly in this case.
>
>> 3) do you have a reference about the equivalence?
>
> The substitution of the bilinear transformation is the usual method to
> get an IIR digital filter from an analog prototype. They aren't
> completely equivalent, but very similar up to about half Nyquist
> frequency. Any book on digital signal processing includes that
> transformation. Also https://en.wikipedia.org/wiki/Bilinear_transform
>
>> 4) have you tried after simp_mode(%f)?
>
> No, but this might be the answer considering my reply to 2). I'll try
> it later.
To get equivalent transfer functions, you need
a) indeed to turn simp_mode(%f),
b) to run
hBPz1= iir(3, "bp", "butt", fo/Fs*[2^(-1/6), 2^(1/6)], [0 0])
instead of
hBPz1= iir(3, "bp", "butt", fo/Fs*[2^(1/6),2^(-1/6)], [0 0])
Then the curves of both transfer functions are superimposed.
clf, plot(linspace(0.5,1.5,100), [hBPsz, hBPz1]) When working with polynomials or rationals, one must keep in
mind that every time that their roots or/and poles have close values,
then results become very sensitive to numerical round-off errors or
uncertainties. The roots of a polynomial of degree N can't be computed
from its coefficients with a numerical relative accuracy better than
%eps^(1/N). If this uncertainty becomes bigger than the distance between
roots values, then things become really bad.
Samuel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20220725/90881584/attachment.htm>
More information about the users
mailing list