{{{id=159| %auto reset() forget() # # Copyright 2001, P. Lutus http://arachnoid.com # # Released under the GPL: http://www.gnu.org/licenses/gpl.html # # special equation rendering def render(x,name = "temp.png",size = "large"): if(type(x) != type("")): x = latex(x) latex.eval("\\" + size + " $" + x + "$",{},"",name) # NOTE: sample rate must be > 2x highest frequency of interest # just as in reality (Nyquist-Shannon) var('alpha beta cf g sr q df f ff dbGain a0 a1 a2 b0 b1 b2') # default sample rate def_sr = 40000 # default q required for some filters def_q = 1/sqrt(2) # constants that apply to all filters A = 10 ^ (dbGain / 20) beta = sqrt(A + A) omega = 2 * pi * df / sr sn = sin(omega) cs = cos(omega) alpha = sn / (2*q) phi = (sin(2 * pi * f/(2.0 * sr)))^2 # value function rf(sr,q,df,f,a1,a2,b0,b1,b2) = ((b0+b1+b2)^2 - 4*(b0*b1 + 4*b0*b2 + b1*b2)*phi + 16*b0*b2*phi*phi) / ((1+a1+a2)^2 - 4*(a1 + 4*a2 + a1*a2)*phi + 16*a2*phi*phi) # value to db conversion function db(x) = 10 * log(x) / log(10) # from db to value val(x) = 10 ^ (x/10) # vertical line drawing function def vl(x): return line(((x,-1),(x,1))) # lowpass a0 = 1+alpha b0 = ((1-cs) / 2) / a0 b1 = (1-cs) / a0 b2 = b0 a1 = (-2 * cs) / a0 a2 = (1-alpha) / a0 lpf(sr,q,df,f) = rf(sr,q,df,f,a1,a2,b0,b1,b2) # highpass a0 = 1 + alpha b0 = ((1 + cs) /2) / a0 b1 = -(1 + cs) / a0 b2 = b0 a1 = (-2 * cs) / a0 a2 = (1 - alpha) / a0 hpf(sr,q,df,f) = rf(sr,q,df,f,a1,a2,b0,b1,b2) # bandpass a0 = 1+alpha b0 = alpha / a0 b1 = 0 b2 = -b0 a1 = (-2 * cs) / a0 a2 = (1-alpha) / a0 bpf(sr,q,df,f) = rf(sr,q,df,f,a1,a2,b0,b1,b2) # notch a0 = 1 + alpha b0 = 1 / a0 b1 = (-2 * cs) / a0 b2 = b0 a1 = (-2 * cs) / a0 a2 = (1 - alpha) / a0 nf(sr,q,df,f) = rf(sr,q,df,f,a1,a2,b0,b1,b2) # peak a0 = 1 + (alpha /A) b0 = (1 + (alpha * A)) / a0 b1 = (-2 * cs) / a0 b2 = (1 - (alpha * A)) / a0 a1 = b1 a2 = (1 - (alpha /A)) / a0 pf(sr,q,df,f,dbGain) = rf(sr,q,df,f,a1,a2,b0,b1,b2) # high shelf a0 = (A + 1) - (A - 1) * cs + beta * sn b0 = (A * ((A + 1) + (A - 1) * cs + beta * sn)) / a0 b1 = (-2 * A * ((A - 1) + (A + 1) * cs)) / a0 b2 = (A * ((A + 1) + (A - 1) * cs - beta * sn)) / a0 a1 = (2 * ((A - 1) - (A + 1) * cs)) / a0 a2 = ((A + 1) - (A - 1) * cs - beta * sn) / a0 hsf(sr,q,df,f,dbGain) = rf(sr,q,df,f,a1,a2,b0,b1,b2) # low shelf a0 = (A + 1) + (A - 1) * cs + beta * sn b0 = (A * ((A + 1) - (A - 1) * cs + beta * sn)) / a0 b1 = (2 * A * ((A - 1) - (A + 1) * cs)) / a0 b2 = (A * ((A + 1) - (A - 1) * cs - beta * sn)) / a0 a1 = (-2 * ((A - 1) + (A + 1) * cs)) / a0 a2 = ((A + 1) + (A - 1) * cs - beta * sn) / a0 lsf(sr,q,df,f,dbGain) = rf(sr,q,df,f,a1,a2,b0,b1,b2) /// }}} {{{id=366| # bandpass example plot(bpf(def_sr,3,100,f),f,0,200, gridlines=True) /// }}} {{{id=357| # lowpass example plot(lpf(def_sr,def_q,100,f),f,0,200, gridlines=True) /// }}} {{{id=358| # highpass example plot(hpf(def_sr,def_q,100,f),f,0,200, gridlines=True) /// }}} {{{id=359| # notch example plot(nf(def_sr,9,100,f),f,0,200, gridlines=True) /// }}} {{{id=360| # peak example plot(pf(def_sr,9,100,f,9),f,0,200, gridlines=True) /// }}} {{{id=361| # highshelf example plot(hsf(def_sr,def_q,100,f,1),f,0,200, gridlines=True) /// }}} {{{id=362| # lowshelf example plot(lsf(def_sr,def_q,100,f,1),f,0,200, gridlines=True) /// }}} {{{id=347| # example of modeling multi-filter FM detector cf = 1000 dev = 85 start = 500 end = 1500 @interact def curve( cf = slider([500..2000],default=1000), gain = slider([10..1000],default=200), bpq = slider([1..20],default=6), msq = slider([1..20],default=12), qdev = slider([50..300],default=90), qff = slider([-100..100],default=40), bw = slider([200..1200])): bpff = cf + (qff/10) * 1000 / cf bp(f) = bpf(def_sr,bpq,bpff,f) m(f) = bpf(def_sr,msq,bpff+qdev,f) s(f) = bpf(def_sr,msq,bpff-qdev,f) v(f) = (m(f) - s(f)) * bp(f) * gain * .01 mp = v(cf+qdev).n() zp = v(cf).n() sp = v(cf-qdev).n() print sp,zp,mp p = plot(v(f) ,f,cf-bw,cf+bw) ml = vl(cf+dev) sl = vl(cf-dev) show(p+ml+sl) ///
cf 
gain 
bpq 
msq 
qdev 
qff 
bw 
}}} {{{id=365| /// }}}