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 Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users