[sdiy] Looking for help with Bessel functions and FM

ASSI Stromeko at compuserve.de
Sun Aug 22 20:34:06 CEST 2004


On Sonntag, 22. August 2004 18:55, Glen wrote:
> I think Bessel functions are something I need to learn about for this
> project, but I'm having trouble finding enough information,

Bessel functions as such (or cylinder functions of the first kind) are 
simply solutions to the Bessel differential equation, in the same way 
that sine and cosine functions are solutions to the differential 
equation for an harmonic oscillator. One example for a "Bessel 
oscillator" is a circular membrane fixed around it's edge (better known 
as the felt of a drum).

If you can get hold of it, read:
FM Theory & Applications, By Musicians for Musicians (Dr. John Chowning 
and David Bristow), published by Yamaha.

Then, do yourself a favor and get some halfway decent math software like 
Octave (a Matlab clone) or Scilab. You'll then be able to say something 
like:

gsplot(besselj([(0:30)],[(0:0.1:20)]'))

and have a look at the bessel functions from all sides instead of trying 
to figure them out from numbers in tables.

fc          - carrier frequency
fm          - modulator frequency
c:m = fc/fm - frequency ratio of carrier vs. modulator
df          - modulation depth (i.e. maximum-minimum frequency)
I = df/fm   - modulation index

For computing the FM spectrum, you will only need to know c:m and I. 
Frequency components may exist at

fi = fc +- k.fm | k=0..n

with the amplitudes for these dying down rapidly for k getting larger. 
Chowning/Bristow recommend that n = I+2 is a suitable choice if you 
want to compute the resulting spectrum (the rest of the example is also 
from their book to facilitate comparison). The Bessel functions of 
order k at the modulation index I then tell you the amplitude scaling 
for each of these components. There's the twist that for the lower side 
components you'll have to flip the sign for the odd-order components. 
In Octave, you'll get to see the result rather simply with

fc=440
fm=220
cm=fc/fm
I=4
n=I+2
freqs=[(1-n*cm):cm:(1+n*cm)]
scale=[besselj([(0:n)],I)(n+1:-1:2).*(-1).^(1:n),besselj([(0:n)],I)]
plot( fc*freqs, scale, "^" )

Folding the negative frequencies back to positive is left as an exercise 
to the reader, in preparation of the final exercise to compute the 
resulting sound. :-)

This was a single operator and simple FM, if you use that again as a 
modulator you'll need to do this kind of computation for each frequency 
component. With feedback, you'll get a stab at doing that for much more 
frequencies. Without a program you'll be lost in no time and/or get a 
big headache.


Achim.
-- 
+<[Q+ Matrix-12 WAVE#46 microQkb/Omega Andromeda XTk/30 sonic heaven]>+

SD adaptation for Waldorf rackAttack V1.04R1:
http://homepages.compuserve.de/Stromeko#WaldorfSDada




More information about the Synth-diy mailing list