• Apr 17th 2010, 01:20 AM
bubulescu
Hello

I didn't know how exactly to name the thread, so this is the result. First, I'd like to issue a warning as this will be quite a long post(!), I'll try to explain as best I can.
I'll post what I have first and then explain:

Code:

```for n:1 thru N do  for a:0.1 step 0.1 thru dB do   for sc:0 step inc do   while A(%i*sc)<=a do     if not A(%i*(sc+inc))>a then     print(float(sc)),scale:sc, inc:0.0001,       for sc:scale step inc do       while A(%i*sc)<=a do         if not A(%i*(sc+inc))>a then         (print('A(s),"=",float(A(%i*sc))," ; ",'𝜔,"=",float(sc)),inc:0.1,sc:float(sc) );```
I'm trying to find the scaling factor (𝜔, or sc) for a Bessel filter according to order (N) and attenuation (dB) at corner-frequency with the help of the amplitude formula A(s) (it doesn't matter how this is, it works by itself). The values would then be used to generate a curve-fit formula so I wouldn't have to do this whole ordeal for any random value of dB *and* N. This will be used in LTspice, to avoid tables with their obvious limitation(s).
Now, this would be straight-forward like this (for N only):

Code:

```for sc:guess step inc while A(%i*sc)>=dB do  (if not A(%i*(sc+inc))>=dB then   (scale:sc, print('A(s),"=",float(A(%i*sc))," ; ",'𝜔,"=",float(sc), " ; ",'A(s+inc),"=",float(A(%i*(sc+inc)))," ; ",'𝜔,"=",float(sc+inc))) ) \$```
which calculates A(s) with increment "inc" starting from guess value "sc:guess". I had patience to do this for dB from 0.1 to 2 and N=2, and a separate one for N from 1 to 12, but the results differ, the curve-fit formulae don't have N *and* dB both as variables.
Now, I would like the results to be pretty accurate, so inc=0.0001 but, since that will take quite a while to find the 12 values for up to N=12, I'm trying to dynamically adjust "inc" in between iterations.
So, first: N=2 (1 has no scaling), dB=0.1 and inc=0.01 and start from sc:guess(=0) . This goes very fast. When it reaches a value less than dB, inc should go from 0.01 > 0.0001 and sc=<found value> ("scale"). The value is (very) close enough from the desired one and I can "fine-tune" it with 0.0001 to my goal. That being done, inc should switch back to 0.01 and sc=scale. The loop should go back with the new values and increment a=a+0.1 and start over, then, once a=dB, it should go a step back to N=N+1, and start over. I hope I explained to be understood, my English isn't perfect...
So, in short, I'd like this to behave like a TV where you search for new channels, from scratch: first it goes in large steps then, when it finds itself close to something, it adjusts the step to a smaller one, then again.

The first code block shows what I did and, running it gives:

Code:

`Unable to evaluate predicate -6.81356/log(10)<=a`
which tells me that either it didn't assign a:0.1 or the lines aren't "arranged" the lines properly. My logic tells me it should work, Maxima contradicts me. So, here it is, the problem. If anyone can help me, please do.