On 12/19, Dario Sanfilippo wrote:
>
> > And this probably means that Dario was right, and the problem was caused
> > by quantisation.
> >
> > Because IIUC in theory (and unless you modulate HPFfreq) these 3 filters
> >
> > fi.highpass(2, f)
> > fi.svf.hp(f, 1/sqrt(2))
> > svf2blti(f, 1/sqrt(2), 1) : ba.selectn(10,1)
> >
> > should have the same transfer function / impulse response.
> >
>
> The IR of the filters with -double is the following, with a 20 Hz CF:
>
> Darios-MBP:edgeofchaos dariosanfilippo1$ ./test_hp -sr 96000 -s 9600 -n 1
>
> channel 1, channel 2, channel 3
> -1.4107325142354377e-11, -1.4107325144178732e-11, -1.4107325144183914e-11
>
> I thought that our SVF filters might have had exactly the same
> calculations,
Why?? No, the math obviously differs.
> but there's still some difference in the response.
Of course they differ! although I guess the numbers should be close...
Let me repeat, IIUC they should be equivalent _IN THEORY_. OK, let me
inspect your implementation of bp filter. maxima code:
(%i1) E: [
bp = s1/z + v1,
v1 = hp * g,
v2 = bp * g,
hp = (in - 2 * (1/(2*q)) * s1/z - g * s1/z - s2/z)/(1 + 2 *
(1/(2*q)) * g + g * g),
lp = s2/z + v2,
s1 = v1 + bp,
s2 = v2 + lp]$
(%i2) solve(E, [bp,v1,v2,hp,lp,s1,s2])$
(%i3) facsum(ratsimp(%[1][1])/in,z);
2
bp g q z - g q
(%o3) ── = ────────────────────────────────────────────────────────
in 2 2 2
(g q + q + g) z + 2 (g - 1) (g + 1) q z + g q + q - g
Now, lets do the same with svf.bp:
(%i1) S1: ic1eq = 2*v1 - ic1eq/z $
(%i2) S2: ic2eq = 2*v2 - ic2eq/z $
(%i3) V1: v1 = (ic1eq/z + g *(v0-ic2eq/z)) / gk $
(%i4) V2: v2 = ic2eq/z + g * v1 $
(%i5) solve([V1,V2,S1,S2], [v1,v2, ic1eq,ic2eq])$
(%i6) %[1][1]/v0, gk = (1 + g*(g+1/q))$
(%i7) facsum(ratsimp(%),z);
2
v1 g q z - g q
(%o7) ── = ────────────────────────────────────────────────────────
v0 2 2 2
(g q + q + g) z + 2 (g - 1) (g + 1) q z + g q + q - g
See? Both have the _same_ transfer function. But of course, this does
NOT mean that the numerical output should be the same.
> I used
> Pirkle,
where can I read it?
> which text did you use?
See the comments above svf() in filters.lib:
https://cytomic.com/files/dsp/SvfLinearTrapOptimised2.pdf
> If I run faustbench -double on your filter and mine, I get the following
> results:
>
> yours: Best value is : 1176.06 with -double -vec -fun -lv 0 -vs 128
> mine: Best value is : 1324.58 with -double -vec -fun -lv 0 -vs 64
>
> If I'm not wrong, a higher value indicates a faster DSP, but that's for
> some specific settings.
Cough ;) I never used faustbench and I don't know what does it do.
So I used "faust -a bench.cpp" to compare
F = 50;
process = svf.hp(F, 1/sqrt(2));
with
F = 50;
process = (svf2blti(F, 1/sqrt(2), 1) : ba.selectn(10,1));
svf-bench, 3 runs:
66.2247 264.899 MB/s inputs 264.899 MB/s outputs 65.3919 38.1911
66.1178 264.471 MB/s inputs 264.471 MB/s outputs 65.5512 52.7835
66.2247 264.899 MB/s inputs 264.899 MB/s outputs 65.5196 52.4456
blti-bench, 3 runs:
56.3024 225.21 MB/s inputs 225.21 MB/s outputs 55.845 31.9875
56.3799 225.52 MB/s inputs 225.52 MB/s outputs 55.89 51.3927
56.3799 225.52 MB/s inputs 225.52 MB/s outputs 55.8713 30.0734
svf looks a bit faster, but I do not know if we can trust the numbers above.
In any case, I bet they should be close performance-wise.
Oleg.
_______________________________________________
Faudiostream-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users