dsp question on "analyzing the moog vcf"

DSP, Plugin and Host development discussion.
Post Reply New Topic
RELATED
PRODUCTS

Post

i'm just reading the the stilson and smith paper "analyzing the moog vcf with considerations for digital implementation" (http://ccrma-www.stanford.edu/~stilti/p ... oogvcf.pdf) and i've got a problem in understanding the bilinear transformation in it. i hope someone here read it too and can help me with that.

for the transformation the transfer function s/(s+a) is used, but before the transfer function was given with wc/(wc+s). (wc is cutoff frequency). so i don't get it.

isn't s/(s+a) a highpass?
what is the variable a?

i hope someone can help me. :help:
i'm desperate. :cry:

Post

It seems to me that s/(s+a) is simply a typo - what's meant is actually a/(s+a). If you substitute 2*(z-1)/(z+1) for s in that, you arrive at 1/2*(p+1)*(z+1)/(z+p) with p=(a-2)/(a+2), the form given. Presumably that part was copied and pasted for the backward difference transform later in the paper, repeating the typo. The backward difference transform is a bit weird also - it isn't quite clear to me why (1+1/z)/T=(z-1)/(zT). It ought to be (z+1)/(zT), if I'm not insane. Either way, I couldn't figure out what exactly was done to get (p+1)*z/(z+p) with p=a+1 out of a/(s+a) or s/(s+a), though with p=a+1 and s=(z+1)/z I get a/(s+a)=(p-1)*z/(1+p*z), which appears to have the same magnitude for z on the unit circle at least (couldn't be bothered to look at this properly tonight), times a constant depending on p.

Post

<kevin-kline-in-a-fish-called-wanda>

What was that middle part again?

</kevin-kline-in-a-fish-called-wanda>
Image
Don't do it my way.

Post

ok, if it's a typo, things gettin clearer.
if i substitute with s=2/T*(z-1)/(z+1) i get:
G(z)=(a*T*(z+1))/(a*T*(z+1)+2(z-1))
and not: 1/2*(p+1)*(z+1)/(z+p) with p=(a-2)/(a+2). at least i don't see it.
for easier calculating i set a*T=b:
G(z)=(b*(z+1))/(b*(z+1)+2(z-1))
if you set G(z)=Y(z)/X(z) you'll come to:
(2+b)*z*Y(z) + (b-2)*Y(z) = b*z*X(z) +b*X(z)
transformed in discrete time domain:
(2+b)*y(k+1) + (b-2)*y(k) = b*x(k+1) + b*x(k)
this could be written as:
y(k) = b/(2+b)*x(k) + b/(2+b)*x(k-1) + (2-b)/(2+b)*y(k-1)
i implemented this and it worked. if anybody finds a mistake please correct me, this is part of my project work (studienarbeit) for my studies :)

@fuzzpilz
sorry, had no time checking the backward difference transform, i have to finalize my project work till wednesday. but thanks for your answer, it helped me.

Post Reply

Return to “DSP and Plugin Development”