------------- 3 tap lowpass filter -- by Michel Pollet 24 Sep 2002 inSampleRate := 44100: -- 0 to samplerate/2 inCutoff := 1000: -- slider("inCutOff", 100, inSampleRate / 4): -- from 0.1 to sqrt(2) inResonance := sqrt(2): --slider("inResonance", 0.1, sqrt(2)): init = cc := 1.0 / tan(pi * inCutoff / inSampleRate), a1 := 1.0 / ( 1.0 + inResonance * cc + cc * cc ), a2 := 2.0 * a1, a3 := a1, b1 := 2.0 * ( 1.0 - cc * cc ) * a1, b2 := ( 1.0 - inResonance * cc + cc * cc ) * a1, b3 := 0.0 iir(j) = a1 * in[j] + a2 * in[j - 1] + a3 * in[j - 2] - b1 * out[j - 1] - b2 * out[j - 2] - b3 * out[j - 3] max = 100 in := 0[1:max]:;in[5] := 1:; -- in[j] = sin(j/4) dim[max]; out := 0[1:max]: init: j:= 4: ( out[j] := iir(j), j := j + 1 ) while j <= max: Title := "LowPass 3 tap IIR graph": Xmin := 0:; Xmax := max: Xlabel := sprintf("cutoff = %.1fHz", inCutoff) | sprintf( " resonance = %.4f", inResonance)| sprintf( " at %.1fHz", inSampleRate)| sprintf( " - for %.4fms", max * 1000 / inSampleRate):; plotline out[4:] newaxis inCutoff := 5000: -- slider("inCutOff", 100, inSampleRate / 4): -- from 0.1 to sqrt(2) inResonance := sqrt(2) /2: out := 0[1:max]: init: j:= 4: ( out[j] := iir(j), j := j + 1 ) while j <= max: Xlabel := sprintf("cutoff = %.1fHz", inCutoff) | sprintf( " resonance = %.4f", inResonance)|sprintf( " at %.1fHz", inSampleRate)|sprintf( " - for %.4fms", max * 1000 / inSampleRate):; plotline out[4:]