You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
music-synthesizer-for-android/lab/Zero delay the easy way.ipynb

1107 lines
243 KiB

{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Zero delay the easy way"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Raph Levien \n",
"25 Jan 2014\n",
"\n",
"So-called \"zero delay\" filters have become popular in synthesizer and audio applications, due to their\n",
"accurate emulation of analog filter designs and efficient implementation. The techniques used\n",
"to create zero delay filters are considered standard in the circuit emulation field, but even so the\n",
"idea of creating a zero delay filter from scratch can be intimidating to those just wanting to design\n",
"a decent audio filter.\n",
"\n",
"This notebook presents a very easy design methodology, using cookbook tools. There are references to\n",
"the literature for those wanting to dig deeper into the theory. None of these techniques are new, but\n",
"it is my hope that presenting them in this form will make them more accessible.\n",
"\n",
"In broad outline, the approach recommended here is:\n",
"\n",
"* Choose an analog filter \"prototype\".\n",
"\n",
"* Write down the filter response in state space representation.\n",
"\n",
"* Choose a discretization method. Bilinear transform is most popular.\n",
"\n",
"* Discretize (convert from continuous time to discrete time).\n",
"\n",
"* Implement the filter in discrete state space representation.\n",
"\n",
"The resulting filter will be a reasonably (but not perfectly) accurate emulation of the analog filter.\n",
"It will share the same stability properties as the prototype, as well as similar behavior under\n",
"modulation.\n",
"\n",
"It is presented here as an IPython notebook, so you can easily read it as a static document, but you\n",
"can also load it into your IPython environment, play with the tools, and adapt the code. Have fun!"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline\n",
"from scipy import signal\n",
"from scipy import linalg"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Choose a prototype filter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I'll assume you already have a good idea which analog filter you want to simulate. We're going to concentrate on the _linear_\n",
"response, but one of the great advantages of the state space approach is that it can be extended to nonlinearities without\n",
"too much trouble.\n",
"\n",
"One of the most important factors is the _order_ of the filter, which corresponds directly to the dimensionality of the state\n",
"vector. This technique can handle arbitraty order filters, but direct state space evaluation is definitely most efficient for\n",
"smaller orders (2 or 4 especially). If you have a very high order filter, consider decomposing it into a series of smaller\n",
"filters. There are tools for doing this in transfer function space; it's particularly easy if you know where your poles and\n",
"zeros are. (Search for tf2sos for more information)\n",
"\n",
"We'll use three filter designs as running examples, all of which are popular as filters in analog synthesizers: a simple\n",
"one-pole lowpass (also known as the \"RC lowpass\"), the classic two-pole \"state variable filter\", and the 4-pole Moog resonant lowpass\n",
"filter."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"One-pole lowpass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is also known as the RC filter, as it can be trivially implemented with one resistor and one capacitor (generally in audio\n",
"applications you'd want an opamp to buffer the output so it's available at low impedance, but that's not central to the\n",
"response of the filter).\n",
"\n",
"Being only one pole, this filter is super easy to analyze. Its impulse response is just exponential decay.\n",
"\n",
"(TODO: images for circuit diagrams for these filters)"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"State variable filter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"See Figure 3 in https://ccrma.stanford.edu/~jos/svf/svf.pdf for a circuit diagram. This is given in highly idealized form,\n",
"with integrators drawn as integrators rather than expanded out as opamps. However, this is the same as the classic state\n",
"variable filter, for example, the one presented in Don Lancaster's Active Filter Cookbook, which has been the basis of many\n",
"synth builds.\n"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Moog 4-pole ladder filter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Moog 4-pole filter is of course one of the classic designs. There's quite a bit of literature on it\n",
"(see http://www.timstinchcombe.co.uk/index.php?pge=papers).\n",
"\n",
"A good simple description of the filter is given in https://ccrma.stanford.edu/~stilti/papers/moogvcf.pdf (Analyzing the\n",
"Moog VCF with Considerations for Digital Implementation, by Tom Stilson and Julious Smith). This paper presents a very\n",
"simple analog model of the linear response: it is simply 4 one pole lowpass filters in series, all tuned to the same corner\n",
"frequency, with a feedback path which controls resonance. Ignore the discretization in this paper, however; we'll do much\n",
"better."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"State space representation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once you've chosen your filter, get it into state space representation. This will be four matrices $(A, B, C, D)$ that together\n",
"represent the differential equations of the filter. The general equations are:\n",
"\n",
"$$ \\begin{align}\n",
"\\mathbf{\\dot{x}}(t) = & A\\mathbf{x}(t) + B\\mathbf{u}(t) \\\\\n",
"\\mathbf{y}(t) = & C\\mathbf{x}(t) + D\\mathbf{u}(t)\n",
"\\end{align} $$\n",
"\n",
"Here, $\\mathbf{u}(t)$ represents the input, $\\mathbf{x}(t)$ represents the state, and $\\mathbf{y}(t)$\n",
"represents the output. Such systems are known as \"single input\" or \"multiple input\" depending on the\n",
"size of $\\mathbf{u}$, and \"single output\" or \"multiple output\" depending on the size of $\\mathbf{y}$.\n",
"In this presentation, we'll concentrate on the \"single input, single output\" case."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"One-pole lowpass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Because it's just one pole, the state can be a scalar rather than a vector, so we don't even need to write this in matrix form.\n",
"The differential equation is:\n",
"\n",
"$ \\dot{x}(t) = -\\alpha x(t) + u(t) $\n",
"\n",
"Variables are as in standard state variable representation. Lowpass is $y(t) = x(t)$, and highpass is $y(t) = u(t) - x(t)$.\n",
"\n",
"Here, $\\alpha$ controls the corner frequency. It's easiest just to normalize it to 1. The state space reprentation could hardly\n",
"be simpler:\n",
"\n",
"$$ \\begin{align}\n",
"A & = -1 \\\\\n",
"B & = 1 \\\\\n",
"C & = 1 \\\\\n",
"D & = 0\n",
"\\end{align} $$\n",
"\n",
"For highpass, $C = -1$ and $D = 1$ instead."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def rc_lp_system():\n",
" return array([[-1]]), array([1]), array([1]), 0\n",
"\n",
"def rc_hp_system():\n",
" return array([[-1]]), array([1]), array([-1]), 1\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"State variable filter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The jos paper gives the state variable representation (here we switch the order of the state variables so they\n",
"respresent left-to-right flow, and to emphasize the similarity to the other filters).\n",
"\n",
"$$ \\begin{align}\n",
"A & = \\left[\\begin{array}{cc} -k & -1 \\\\ 1 & 0 \\\\ \\end{array}\\right] \\\\\n",
"B & = \\left[\\begin{array}{c} 1 \\\\ 0 \\\\ \\end{array}\\right] \\\\\n",
"C & = [ \\begin{array}{cc} 0 & 1 \\end{array} ] \\\\\n",
"D & = 0\n",
"\\end{align} $$\n",
"\n",
"Here, $k$ controls resonance. It is equal to $1/Q$, and ranges from 2 for no resonance to 0 for undamped resonance,\n",
"i.e. self-oscillation. For a resonance control that varies from 0 to 1, simply set $k = 2 - 2 \\cdot \\mathit{resonance}$.\n",
"\n",
"For bandpass, $C = [ 1 \\: 0 ]$ instead, and for highpass,\n",
"$C = [ {-k} \\: {-1} ]$ and $D=1$. In fact, all \"Audio EQ Cookbook\" responses can easily be done with a state variable\n",
"filter, making it an appealing alternative to canonical form biquads. See [Second order sections in matrix form](Second%20order%20sections%20in%20matrix%20form.ipynb) notebook for all of these recipes. Also see [Solving the continuous SVF equations using trapezoidal \n",
"integration and equivalent currents](http://www.cytomic.com/files/dsp/SvfLinearTrapOptimised2.pdf) for a different\n",
"derivation."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def svf_lp_system(res):\n",
" k = 2 - 2 * res\n",
" A = array([[-k, -1], [1, 0]])\n",
" B = array([1, 0])\n",
" C = array([0, 1])\n",
" D = 0\n",
" return A, B, C, D\n",
"\n",
"def svf_hp_system(res):\n",
" k = 2 - 2 * res\n",
" A = array([[-k, -1], [1, 0]])\n",
" B = array([1, 0])\n",
" C = array([-k, -1])\n",
" D = 1\n",
" return A, B, C, D"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Moog filter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Moog filter also has a simple state-space representation. It is easy to build the total system by stitching\n",
"together four one-pole lowpass filters and adding a feedback path.\n",
"\n",
"$$ \\begin{align}\n",
"A & = \\left[\\begin{array}{cc} -1 & 0 & 0 & -k \\\\\n",
"1 & -1 & 0 & 0 \\\\\n",
"0 & 1 & -1 & 0 \\\\\n",
"0 & 0 & 1 & -1 \\\\\n",
"\\end{array}\\right] \\\\\n",
"B & = \\left[\\begin{array}{c} 1 \\\\ 0 \\\\ 0 \\\\ 0 \\\\ \\end{array}\\right] \\\\\n",
"C & = [ \\begin{array}{cc} 0 & 0 & 0 & 1 \\end{array} ] \\\\\n",
"D & = 0\n",
"\\end{align} $$\n",
"\n",
"Here, k varies from 0 (no resonance) to 4 (self oscillation)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def moog_system(res):\n",
" k = 4 * res\n",
" A = array([[-1, 0, 0, -k], [1, -1, 0, 0], [0, 1, -1, 0], [0, 0, 1, -1]])\n",
" B = array([1, 0, 0, 0])\n",
" C = array([0, 0, 0, 1])\n",
" D = 0\n",
" return A, B, C, D"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Response of continuous time filter in state space representation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's possible to accurately compute the frequency and phase response of a state space filter, without for\n",
"example having to expand out an impulse response and compute a fourier transform.\n",
"\n",
"The transfer function of a filter in (continuous) state space formulation is simple:\n",
"\n",
"$$ H(s) = D + C(sI-A)^{-1}B $$\n",
"\n",
"The Wikipedia article on State space representation isn't a bad source for this: http://en.wikipedia.org/wiki/State_space_representation\n",
"\n",
"We can use it to plot out the frequency response of some of the filters we defined above. (Note: if you're interested in\n",
"phase response, just plot the angle(response) instead of abs(response))."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def transfer(sys, s):\n",
" A, B, C, D = sys\n",
" return D + dot(C, dot(inv(s * identity(len(A)) - A), B))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xs = logspace(-3, 0, num=200)\n",
"def db(x):\n",
" return 20 * log10(abs(x))\n",
"def freqz_ss_continuous(sys, f):\n",
" return array([transfer(sys, 1j * x / f) for x in xs])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The one-pole lowpass and highpass filters have the expected response, with both at -3dB at the corner frequency,\n",
"and 6 dB/octave rolloff."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = sqrt(1e-3)\n",
"semilogx(xs, db(freqz_ss_continuous(rc_lp_system(), f)))\n",
"semilogx(xs, db(freqz_ss_continuous(rc_hp_system(), f)))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x108a38bd0>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we plot the response of the Moog filter model, and also see the expected response."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i in range(5):\n",
" sys = moog_system(0.2 * i)\n",
" semilogx(xs, db(freqz_ss_continuous(sys, f)))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n/wO5IIM+kTMTXwAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x108a95b10>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Choose a discretization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By far, the most popular discretization method in audio applications is the bilinear transform. A second, valid choice is\n",
"step invariance. These two are the most popular discretization methods, though others exist, as they both preserve the\n",
"stability properties of the original filter.\n",
"\n",
"A very simple discretization is forward Euler. You'll see this quite a bit in older papers (particularly if they seem to\n",
"be struggling with how to accommodate the delay-free feedback path), but it's basically rubbish. It works okay at very low\n",
"frequencies, but can easily transform a stable filter into an unstable one (as happens in the discretized state variable\n",
"filter), or totally lose the resonance properties (as in the Moog). It turns out to be totally fine for the one-pole lowpass,\n",
"so you'll see it there, and as a consequence works for the Moog filter in the zero resonance case, because that's just\n",
"four of those strung together.\n",
"\n",
"Both bilinear transform and step invariant lose accuracy, but in different ways. The bilinear transform has exactly the same\n",
"_frequency_ response as the analog prototype, but with frequencies warped, so that infinite frequency in the analog domain\n",
"maps to the Nyquist frequency. By contrast, step invariance has exactly the same _impulse_ response assuming that the input\n",
"is a step exactly one sample period wide (also known as zero order hold), but since that signal is not band-limited, it\n",
"means that the frequency response is aliased. Note that it's just the response that's aliased; there are no frequencies in\n",
"the output that are not present in the input.\n",
"\n",
"A good general criterion for choosing is: does the frequency response have a sharp lowpass characteristic? If so, then\n",
"with step invariance, the aliased components will be small, and primarily affect only the near-Nyquist frequencies. Otherwise,\n",
"for example for a high-pass response, bilinear transform is a better choice. We'll show this with graphs after implementing\n",
"the discretization techniques."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Bilinear transform"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we need to pre-warp the frequency response, so that the response of the digital filter matches that of the analog filter\n",
"at the cutoff frequency. Here, frequency $f$ is as a fraction of the sampling rate, so that 1/2 is the Nyquist frequency.\n",
"\n",
"$ g = tan( \\pi f ) $\n",
"\n",
"Then, the discretization is as given by [Comparing digital implementation\n",
"via the bilinear and step-invariant transformations](http://myweb.polyu.edu.hk/~magzhang/Research/ZC04_auto.pdf), Guofeng Zhang and Tongwen Chen.\n",
"\n",
"$$ \\begin{align}\n",
"A_d & = (\\mathbf{I} - gA)^{-1} (\\mathbf{I} + gA) \\\\\n",
"B_d & = 2g(\\mathbf{I} - gA)^{-1} B \\\\\n",
"C_d & = (\\mathbf{I} - gA)^{-1} C \\\\\n",
"D_d & = g C (\\mathbf{I} - gA)^{-1} B + D\n",
"\\end{align} $$\n",
"\n",
"Here, the $(\\mathbf{I} - gA)^{-1}$ term represents solving the entire set of equations simultaneously, and includes the zero-delay\n",
"feedback term. To me, it's much easier just to throw the system into a matrix and solve it by matrix inverse in this way,\n",
"rather than solving all the individual equations by hand. Your mileage may vary."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bilinear(sys, f):\n",
" A, B, C, D = sys\n",
" g = tan(pi * f)\n",
" im = inv(identity(len(A)) - g * A)\n",
" Ad = dot(im, identity(len(A)) + g * A)\n",
" Bd = 2 * dot(im, g * B)\n",
" Cd = dot(C, im)\n",
" Dd = D + dot(C, dot(im, g * B))\n",
" return Ad, Bd, Cd, Dd"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some historical notes. To my knowledge, the first publication of a proper bilinear transform of the analog Moog filter\n",
"was: http://quod.lib.umich.edu/cgi/p/pod/dod-idx/preserving-the-structure-of-the-moog-vcf-in-the-digital.pdf, Preserving the Structure\n",
"of the Moog VCF in the Digital Domain, Federico Fontana.\n",
"\n",
"The earlier publications by Stilson and Smith, then Huovilainen, contained defective discretizations that attempted to deal with\n",
"the delay free loop some other technique than simply solving the equations.\n",
"\n",
"These days, however, the proper bilinear transform is standard. In synthesizer circles, the technique goes by the name\n",
"\"zero delay filters\" and also \"topology preserving transform\". An important milestone in popularizing this technique was\n",
"the publication of http://www.native-instruments.com/fileadmin/ni_media/downloads/pdf/VAFilterDesign_1.0.3.pdf, The Art of\n",
"VA Filter Design, by Vadim Zavalishin.\n",
"\n",
"Meanwhile, outside the published literature, there is an excellent discussion of this topic in the KVR DSP Forum thread,\n",
"http://www.kvraudio.com/forum/viewtopic.php?f=33&t=349859, Cheap non-linear zero-delay filters."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Step-invariant transform"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The step-invariant transform represents the exact response under the assumption that the input is a sequence of steps\n",
"each one sample period in width (also known as zero order hold).\n",
"There are a few ways to compute it; here is the one I find\n",
"easiest.\n",
"\n",
"$ A' = \\left[\\begin{array}{cc} 0 & 0 \\\\ B & A \\end{array}\\right] $\n",
"\n",
"Then,\n",
"\n",
"$ \\left[\\begin{array}{cc} \\_ & \\_ \\\\ B_d & A_d \\end{array}\\right] = \\exp(2 \\pi f A') $\n",
"\n",
"Here, $\\exp(A)$ represents the matrix exponential, and the underscores respresent throwing away that part of the\n",
"resulting matrix.\n",
"\n",
"And\n",
"\n",
"$$ \\begin{align}\n",
"C_d & = C \\\\\n",
"D_d & = D\n",
"\\end{align} $$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def step_invariant(sys, f):\n",
" A, B, C, D = sys\n",
" A_ = concatenate([[zeros(len(A) + 1)], concatenate([[B], A.T]).T])\n",
" eA = linalg.expm(2 * pi * f * A_)\n",
" Ad = eA[1:, 1:]\n",
" Bd = eA[1:, 0]\n",
" return Ad, Bd, C, D"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Matrix exponential is a cookbook technique (implemented as linalg.expm in NumPy). It is defined in terms of the straightforward extension of the Taylor series for\n",
"ordinary exp(x) generalized to matrices:\n",
"\n",
"$$ exp(A) = \\sum\\limits_{k=0}^{\\infty} \\frac{A^k}{k!} $$\n",
"\n",
"If you're implementing it by yourself, for small matrices, the \"scaling and squaring\"\n",
"technique works best. See http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.156.9316, The scaling and squaring method for the matrix exponential revisited, Nicholas Higham. Here's a simple implementation that computes the first n1 terms of the Taylor's series expansion\n",
"for exp, followed by n2 repeated squarings."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# should give the same results as linalg.expm for well-behaved systems\n",
"def my_expm(A, n1 = 8, n2 = 8):\n",
" A1 = A / (1 << n2)\n",
" A2 = np.identity(len(A))\n",
" A3 = np.identity(len(A))\n",
" for i in range(1, n1):\n",
" A3 = dot(A1, A3) / i\n",
" A2 = A2 + A3\n",
" for i in range(n2):\n",
" A2 = dot(A2, A2)\n",
" return A2"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Implementing state space filters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Actually running a filter given in discrete time state space formulation is pretty straightforward. Mathematically, it is\n",
"given as:\n",
"\n",
"$$ \\begin{align}\n",
"\\mathbf{x}(n + 1) = & A\\mathbf{x}(n) + B\\mathbf{u}(n) \\\\\n",
"\\mathbf{y}(n) = & C\\mathbf{x}(n) + D\\mathbf{u}(n)\n",
"\\end{align} $$\n",
"\n",
"But it's probably just as easy to show the code:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def runss(sys, inp):\n",
" A, B, C, D = sys\n",
" x = zeros(len(A))\n",
" result = []\n",
" for u in inp:\n",
" result.append(dot(C, x) + D * u)\n",
" x = dot(A, x) + B * u\n",
" return result"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that the impulse response for the bilinear and step-invariant transformations of the Moog filter are pretty similar,\n",
"but off in phase by a half sample or so."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sys = moog_system(0.8)\n",
"impulse = zeros(100)\n",
"impulse[10] = 1\n",
"plot(runss(bilinear(sys, 0.1), impulse))\n",
"plot(runss(step_invariant(sys, 0.1), impulse))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x108a803d0>"
]
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Matrix-based implementations in state space can be very, very fast. The \"raising\" trick of [Implementation of recursive\n",
"digital filters into vector SIMD DSP architectures](https://mns.ifn.et.tu-dresden.de/Lists/nPublications/Attachments/360/Robelly_P_ICASSP_04.pdf) by Robelly et al for an especially useful technique for implementing second\n",
"order filters on SIMD hardware tuned for 4xfloat vectors.\n",
"\n",
"See [Second order sections in matrix form](Second%20order%20sections%20in%20matrix%20form.ipynb) notebook for more details\n",
"on matrix implementation, including favorable comparisons of roundoff error compared to canonical direct form IIR implementations."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Response of state space filters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's possible to accurately compute the frequency and phase response of a state space filter, without for\n",
"example having to expand out an impulse response and compute a fourier transform. Of course, it doesn't\n",
"hurt to plot this Fourier transform of an impulse anyway, if for no other reason than a sanity check:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"impulse = concatenate([[1], zeros(255)])\n",
"w, h = signal.freqz(runss(bilinear(sys, 0.1), impulse))\n",
"semilogx(w, db(h))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEFCAYAAADjUZCuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHPxJREFUeJzt3X1Y1GW+x/E3CqZW5no0H2ZITEBEMT0m6ilz2sCH3Dim\nyUH3lB3z9GCtuuWa/bEb7qbo7na8ssLNVkstk6xVssu4JHP09KC4dMrVaRONWhhEaxUfykRlzh8/\nRBBEGGbm95uZz+u65prhnpnffLwvnC/3ff8eIjwejwcREQl7rcwOICIi1qCCICIigAqCiIhUU0EQ\nERFABUFERKqpIIiICODHglBSUsLtt99Ov3796N+/P0uXLgXg6NGjpKamEh8fz6hRo6ioqPBXBBER\naYYIfx2HUF5eTnl5OQMHDuTUqVMMHjyYjRs38sorr9C5c2fmzp3L4sWLOXbsGIsWLfJHBBERaQa/\njRC6devGwIEDAbjmmmvo27cvbrebd955h6lTpwIwdepUNm7c6K8IIiLSDH4bIdT29ddfM3LkSPbu\n3csNN9zAsWPHAPB4PHTq1KnmZxERMY/fF5VPnTrFxIkTee6557j22mvrPBcREUFERIS/I4iISBNE\n+nPjZ8+eZeLEidx7772MHz8egK5du1JeXk63bt04dOgQ119/fb33xcbGcvDgQX9GExEJOb179+bA\ngQNev99vIwSPx8MDDzxAYmIis2fPrmlPS0tj1apVAKxataqmUNR28OBBPB6PX29PP/203997pdc1\n9vzlnru0vaHXNeU1VunP5rzP1/3pTd9ZuS8D1Z/NaQ+X/gzE//Wm9F9L/5D22wjho48+4rXXXmPA\ngAEMGjQIgKysLObNm0d6ejorVqwgJiaGN998018RGuVwOPz+3iu9rrHnL/fcpe0Nva4l/zZvefuZ\nzXmfr/uzKW3B1JfNfa+3/dmc9nDpz0D8X2+ozdf9GZBF5eaKiIjAgrGCVmZmJpmZmWbHCAnqS99S\nf/pWS787daRyGDDjr7JQpb70LfWntWiEICISIjRCEBERn1BBEBERQAVBRESqqSCIiAiggiAiItVU\nEEREBFBBEBGRaioIIiICqCCIiEg1FQQREQFUEEREpJoKgoiIACoIIiJSTQVBREQAFQQREammgiAi\nIoAKgog0wzffwP79ZqcQf9EV00SkSU6cgNhYOHkSiouhWzezE8mldMU0EQmIN96AESPg5z+H1183\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x108a92b50>"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The transfer function of a filter in (discrete time) state space formulation is simple, and very similar to\n",
"the continuous time version:\n",
"\n",
"$$ H(z) = D + C(zI-A)^{-1}B $$\n",
"\n",
"So similar, in fact, we can reuse the existing transfer() function for both continuous and discrete time.\n",
"\n",
"See https://ccrma.stanford.edu/~jos/filters/Transfer_Function_State_Space.html for the derivation and more discussion."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we'll plot the bilinear and step-invariant transforms for the Moog filter, against the analog prototype,\n",
"for a single frequency. Both are quite close, although the frequency warping of the bilinear version causes\n",
"its rolloff to accelerate at high frequencies."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def freqz_ss(sys):\n",
" return array([transfer(sys, exp(1j * pi * x)) for x in xs])\n",
"\n",
"axis([1e-2, 1, -60, 10])\n",
"f = 0.05\n",
"sysd = bilinear(sys, f)\n",
"semilogx(xs, db(freqz_ss(sysd)))\n",
"sysd = step_invariant(sys, f)\n",
"semilogx(xs, db(freqz_ss(sysd)))\n",
"\n",
"# Analog prototype\n",
"semilogx(xs, db(freqz_ss_continuous(sys, 2 * f)))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x108ac8510>"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The bilinear transform shows the characteristic warping of frequency response, including a zero at the\n",
"Nyquist frequency."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"axis([1e-2, 1, -60, 10])\n",
"for i in range(5):\n",
" f = 0.4 * .5 ** i\n",
" sysd = bilinear(sys, f)\n",
" semilogx(xs, db(freqz_ss(sysd)))\n",
" semilogx(xs, db(freqz_ss_continuous(sys, 2 * f)))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nkr4gCEIl8n/sPdiIJGaBJwAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x108acba50>"
]
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For this particular filter response, the step invariant transform is more accurate."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"axis([1e-2, 1, -60, 10])\n",
"for i in range(5):\n",
" f = 0.4 * .5 ** i\n",
" sysd = step_invariant(sys, f)\n",
" semilogx(xs, db(freqz_ss(sysd)))\n",
" semilogx(xs, db(freqz_ss_continuous(sys, 2 * f)))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n/D8eDhGQanL/PQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x108aaef10>"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For highpass filters, the bilinear transform performs fairly well, albeit with noticeable effects\n",
"from frequency warping at higher corner frequencies."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sys = svf_hp_system(0.5)\n",
"axis([1e-2, 1, -60, 10])\n",
"for i in range(5):\n",
" f = 0.4 * .5 ** i\n",
" sysd = bilinear(sys, f)\n",
" semilogx(xs, db(freqz_ss(sysd)))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nkY38BnJggfsZxBPoAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x108a7ec50>"
]
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, step-invariant is not a good choice for high-pass filter responses, as expected."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"axis([1e-2, 1, -60, 10])\n",
"for i in range(5):\n",
" f = 0.4 * .5 ** i\n",
" sysd = step_invariant(sys, f)\n",
" semilogx(xs, db(freqz_ss(sysd)))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEFCAYAAAAPCDf9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlcFPX/wPHXLoeI94kKKgooYmjg1fGrqDTtULs0tcM8\n0zIz+5Z2a988ysrK1NQEzazU1LD6enVQmSLeKYeAoCKHgCD3tbuf3x+jKIoHsLCL+34+HvPYYZid\n+awu75l5z2feH51SSiGEEMIm6C3dACGEEDVHgr4QQtgQCfpCCGFDJOgLIYQNkaAvhBA2RIK+EELY\nkCoH/dGjR+Pi4oKvr2/psoyMDPr160enTp247777OHv2bFV3I4QQwgyqHPRHjRrFli1byiybO3cu\n/fr1Izo6mnvvvZe5c+dWdTdCCCHMQGeOh7OOHz/OwIEDOXz4MADe3t78+eefuLi4kJKSQkBAAFFR\nUVVurBBCiKqplpz+6dOncXFxAcDFxYXTp09Xx26EEEJUULXfyNXpdOh0uurejRBCiOtgXx0bPZ/W\nadWqFcnJybRs2fKydTw9PTl27Fh17F4IIW5YHh4exMbGVvr91XKmP2jQIFauXAnAypUrefjhhy9b\n59ixYyilbojp3XffvSH2WdVtVvb9FXnf9a57rfWq+vvaMlnqc9wo309LfDevtU5VT5arHPSHDx/O\nbbfdxtGjR2nbti1BQUFMnz6d7du306lTJ37//XemT59e1d1YtYCAgBtin1XdZmXfX5H3Xe+611rP\nEv9nlmCpz3mjfD8t8d2s6H4ryiy9dyq1Y50OC+1aiGuaMWMGM2bMsHQzhLhMVWOnPJErRDls5UpA\n1C7mOE+WM30hhLCgM2fgyBGIjYXkZEhK0l6TkyE9HQoKoLDwwqtSVYudEvSFEKKGJCTAX3/Bnj1a\noD9yRAvmXbtCp07Qps2FqXVraN4cnJ3ByQnq1oU6dcDeXoK+EEJYpcRE2LZNC/R//gk5OXDnnXDL\nLeDrqwV7NzeoyKNMVY2dEvSFEMKMoqNh40Ztio6Gfv0gIADuugu6dKlYgC+PBH0hhLCwhARYuRK+\n/17L0T/8MDz6qBbsHRzMuy8J+kIIYQFFRRAcDIGBWo5+6FB46im49VbQV2O/yKrGzmopwyCEEDeq\nuDj44gv4+mu4+WYYPVpL5dSta+mWXR8J+kIIcQ1KQUgIfPYZ/POPFuj37IEOHSzdsoqToC+EEFdg\nMMDq1fDJJ1BSAi+9pP1cr56lW1Z5ktMXQtwQlFKk56dzKvtU6XQ67zS5xbnkFeeRV6JNhYZCdOjQ\n6/TodNqrnc4OZwdn6jvWp55DPZzs6hF1uB5/bKtHi0b1GDKoAXf2bkTjuo1oWKchjeo0opFTI5zs\nnWr8c8qNXCGEzcktzuVQyiEOpBxgf/J+DqQcICo9CmcHZ9wautG2YVvcGrrhUs9FC+SO9ajnUI96\njvVKA7VJmVBKYVImDCYD+SX5ZBXk8eeuPH77O4/GzfPw65NHg2a55BTnkF2UTVZhFllFWWQVZpFd\nlI1ClTkINKpz7qBwbv7Sn8v8zkn7ub5jffS667/zKzdyhRA3vCJDEX+e+JPtx7bzW/xvRKVH0bVl\nV/xb+dPbtTcTek6ga4uu1HOsXN6lqEjrhfPxXK0v/f/egdtuu752ZRVllXtAOD9/Ou80MRkxpT9f\nun5BSQH1HetT37E+jnaO1LGvg6Od42WTXqev0MHhSuRMXwhhlQoNhfwc/TPrItaxNXYrPi186O/R\nn3s73ktv19442jlWfR+F8NVX8MEH0L07vP029OljhsZXgNFkJKc4h9ziXIqNxaVTkaHowryxqPTK\n5KHOD0l6Rwhx4ziQfIBFexaxPnI9fq39GNZ1GIM6D8KlvovZ9pGfD0uXwrx50LMnvPMO9Ohhts1X\nK0nvCCGql8EAeXmQm6tNBQUXfne+poBer3VUr1tXqxDm7AyOjtddc6DEWMKGyA0sCFvAyayTTOg5\ngcMTD+Pa0NWsHyUvD778Ej76SHuI6uefwc/PrLuwehL0hbB1aWlw4ABERMCpU2WnlBStr2L9+tpU\nr54W2HW6ssXdjUYtV5Kfrx0U8vO1g8X5A0GDBtC4MTRqpL2emy+s78RfWYfZnLaTei1cme0/hNvu\nfAD7Js3AUFfbhn3Vw1RuLixapHW9vPNO2LoVunWr8mZrJUnvCGFL8vJgxw5tOnhQC/Z5edqjpTfd\nBO3aaWUf3dzA1RVatboQ5CvKaLxwAMjNhbNntSkri4K0ZP7+9ycOHv2T7k7u9HL2ommx/sI659Yj\nO1vb//mDRQVfs3WNWBhYl08/13PPPfDWW1ply9pMumwKIa4uLk4rErNpk/YYqb+/drrr76/lNtzd\nq1768TrlFOXw+e7P+XT3p9zveT9v3/k2Xs28rvwGpS4cMLKyrvvVmHGW/OQs9DlZ1NUVglNd9A3q\nXbhaud5XJyetiL2T0/XN29lV+7+h5PSFsDClFEnFxcQWFHC6uJjTxcWklpRwuriYMyUlFJhMFJpM\nFF30qtfp0AN2Oh16nQ47wNnODme9vtzX+nZ2NLK3p9H51/PTuZ/r29mhuzhwp6ZqJR9XrYKTJ2HQ\nIHjlFbj7bos8TlpiLGHJviX896//0rdjX3aM2kHn5p2v/UadTksNNWgAbdtec/XMTK1UwhdfwIOP\nwJtvQidPk3a1cf6+xMX3Jy5dlpenpbuOH9d+LirS0lbnX682X1ioBf06dbTJwUFLTV1putLv7ey0\neyQ63eWTGSq5yZm+EBWQbzQSlp3NnpwcIvLziczLIzI/Hye9nk7OzrRydMTFwYGWjo64ODrSzN4e\nZzs7nPR66uj1OOn1OOp0KMCoFCbApBQGpSgwmcg3Gskv5zXHaCTLYLgwXfJzoclEA3t7GhkMNEpP\np9Hp0zRq0IBGbm40cnWlsYMDjeztaWBnR8Pzr3Z2NLhk3lmvL3vwMIPNMZt5ZdsrtGnQhk/6f0I3\nF/Mn08+cgU8/hcWLYfBgeP118PQ0+26uTintHsT5g4HBcPlUUlL+8ksnk0nbXjmTbsQISe+I2qnk\nbAn5EfkUJRRRnFKsTae1V0OWAVOhCVOBNhkLjGAEdIBe+/6gA52jDru6duid9ejr6rFztrvw6qzH\nroEd9o3ssW9kj13DcuYb2mPXyA67enblBjujUoRlZ7MlI4NtmZn8m5uLb7169GnYkK716uHj7EyX\nevVoZu6i6RVhMmEIDib744/JArJGjiTr/vvJcnK67CCRbTCQYzSSbTSSYzBorxfNF5lMNCjnYNDQ\nzq7M8ouvROpe9HNdvb50PvFsHB/89R6nzh5j3r3/ZbDXA+jNXHM4PR0+/ljrfvnYY1qwr41F0CpC\ncvrC6imlKIwrJGtHFrmHcskLzyMvPA9jlhHnLs44uTvh2MpRm1wccXBxwL6xvRbM6+rRO2kBXWen\nA6VtDxMok0KVqAsHhnxjmVdTvglDtgFjthFDlgFD1kXz2QaMWRfmTYUm7BtoBwD7hvbk1YMkJwPx\n9sWoBna0aVYX9xb1cG/uTN1GDtg1sCud7BvYa/MNtXl9nWospn4xoxHWrYNZs7R0wttvw8CBVUoB\nGM5dVZyfSg8S517PzxeYTOSbTBRcdEVyflmOoZjj2SlkFudT36kZOjsnCkwmSpTC+dwVj6NeTx2d\nrsy847nfXWne8dz6dfR6SvJ17NyhY+9uHTf76rjvXh0tm+mw15Wd7HSXLyvze7hs2fnU28WvuvJ+\nvmiZ7pL3lLe+ua6grDbob9myhSlTpmA0Ghk7dizTpk0ru2MJ+je0kjMlZGzNIGNLBpm/ZoIOGv1f\nIxr0aEC9rvVw7uqMUzsndPqauYF4LSaDiVPpBXwXm8T/4tNoUqBngH0jbqMezYrsMOYYMeYYMeRo\nB47S+fPLsy/MA+UeEOzq2ZVeieidL7kqKW/ZxVcvTnr0dfToHHXoHXXofvwB/cx3oEULLdj3719j\nN2OvRCnFDxE/MHXbVPp17McHfT+gRb0Wpb83mEwUmEwUK0XRuXsb5c0Xm0wUXWE+LUvxxw4TBw6b\n8PGFXn0Uzg209NiVJuNVfnfp70vOpdzURam3868Kyiy7dB1V3voX/Q4o98Bw8f/a+fmLDxC6S16z\n77zT+oK+0Wikc+fO/Prrr7i6utKrVy++++47unTpcmHHEvRvOIYsA2k/pJG6NpXs0GwaBzSm6f1N\naXpfU5w6OJk9V2wuYdnZzD91ii0ZGQxr2ZKxrVvjX79+pdtrKjJdOCBkX3RwyLtwBVLmqiS/nCuV\ni5flm7RUV7EJU34JKq8Ek7IDvQ59HTvtQFBHj95Rj66ODr3juQPExfPn1tE56NDZ6dDZV2C6jvVT\n8lNYdmgZZwrPMKH3BLq6dNXScHod5yPc+fnKvCYmwZJlOn76GR4fomPcc9DaVXch1Ye2j4sj5JWW\nw4X04KW/v+7lV9lHed8bde4gcOmBwXTJOnDhAHHxvLponSaOjtYX9Hft2sXMmTPZsmULAHPnzgVg\n+vTpF3YsQf+GoJQi658skpclkx6cTpN7mtByWEuaPdgMu3rV332tspRS/Hn2LO+fOEFMQQEvubkx\nulUrGlsyN381iYlawvrXX7V0zsiR2r2+YoWpyFT6Wma+2IQqUtrBokibV4aLJuMlP19rKmd9Y4mR\nqJQoYtNi6dy0Mx6NPNApHcp0IQVX5lVdYfkVXosLFWfOQH6uolFDaNRAoeei9YznYsj5iMq5fVwc\nLS9efsmy0nRhBZZfbR+XqcAB57K3XuGk467Cu6yvy2ZiYiJtL+pe5ebmxu7du6tjV8JCTCUmUtek\ncmr+KYw5RtpMaIPHRx44tqh6EazqdiAnh1ePHeNEURFvtGvHUy4uOFTnoKZVUVKi3amcNw8mTICj\nR7Xui5xL3duDnbNlDq57k/YyZtMYXBu48uVDX9KuUTuzbfvff2H2bPjtN5j8H5g0CZo0Mdvmq1V5\nB4trHlgu28iVNg5UscdttQR9a72MF1WnjIrT357m+IzjOLVzwn2mO80eaGY1ufmrOVVYyJvx8WzL\nzOTd9u0Z27o19tYa7EF7kGrcOO2p2D17oGNHS7cIgPySfN754x1W/buKj+/7mCd9nzTb3/yePdqF\nzO7dMHUqLFtWeoyrNcqkfM4vu9LpvAVUS9B3dXUlISGh9OeEhATc3NwuW2/GjBml8wEBAQQEBFRH\nc4QZKJMibUMax985jn1Te7wDvWl8V2NLN+u65BgMfHDyJIuTkpjYpg1He/emoRnquVSbvDyt7OPq\n1dpZ/ogRFr9Je97v8b8z7qdx9HHtw5GJR8rcqK2Kv/+G99/Xyv9MmwbffVd7BhqvbiEhIYSEhJhv\ng6oalJSUqI4dO6r4+HhVVFSkunfvriIiIsqsU027FtUg49cMtefmPWpvz73qzJYzymQyWbpJ1y04\nLU213blTPR0RoU4WFFi6Ode2fbtSHToo9dRTSqWmWro1pTLyM9SY4DGq7Sdt1U9HfzLLNk0mpX75\nRak77lCqY0elli1TqqjILJu+oVU1dlbL6Y69vT1ffPEF/fv3x2g0MmbMmDI9d0TtUJRYROwrseTs\nzsHjYw+aP9K81qTukouKmBwby6HcXFZ6e3O3tSeE8/Nh+nT48UftSaMBAyzdolIbIjfw4uYXGdx5\nMEeeP0LDOg2rtL3iYq1CxLx5WsWBV1+FJ54wSzFNcR3k4SxxGVOJicQFiZyYfYI2E9rQ/o32FrtZ\nWFEmpfgqOZk34+MZ37o1b7VvT90aKIJVJWFh8PTT0KsXLFhgNXcsk3OSmbR5EkdSj/DVwK+4o/0d\nVdpeTo6Wo58/Hzp3htdeg379rCZzVWtIwTVhVlmhWUSPi8axtSP+O/1x7uRs6SZdt5OFhTwbFUW+\n0cjv3bvjW7++pZt0dSUlWiL7yy+1CmFDhli6RYDWoyToYBDTf53OOP9xrH50delg4pWRkgKff65d\nwPTtq13M1JZRqm5EEvQFoD1QFP9uPCkrUvD6zIsWQ1vUmlSOUopvU1N5OTaWl93ceK1dO+ysve1x\ncTB8ODRrptW1b93a0i0CIC4zjvE/jeds4Vm2P72d7q26V3pbR49q96HXrYMnn9QuaKykA5JNs+L+\naqKm5OzLYW+PvRTEFNDr3160fKJlrQn4GSUlDI+IYNaJE2zt1o3X27e3/oC/di3ccovWK+eXX6wi\n4BtMBj7e+TG9l/Wmv0d/QseGVjrgh4bCo4/CHXdAmzYQHa1dyEjAtw5ypm/DTCUmTsw6QdKiJDzn\ne9JyRO0J9gC/ZWbybFQUjzVvTpC3t/Xn7gsK4OWXtadq//c/bURuK3Aw5SBjN42lYZ2GhI4NxbNp\nxWsSG41a2mb+fO3h4Vde0Ur5W6B0v7gGCfo2qiCugIjhETg0c6DnwZ7UaVPH0k26bgaTiRnHjxOU\nksIKb2/6NW1q6SZdW2Sk1kWla1fYvx8aVq0HjDkUlBTw3p/vsfzAcub2ncuom0dV+KCflQWBgVrO\nvnVr7Zj2yCPSE8eayX+NDTr9/WliJ8fS/q32uL7oWqvO7k8VFjI8MpK6ej37e/bExdHKyz4oBStW\naF1V5syBMWOsorvK7/G/89zPz+Hf2p9/J/5Lq/qtKvT+uDgt0H/9tVbg8/vvoU+famqsMCsJ+jbE\nmGckZnIMWX9n0W1rNxr41a7n239KT2fs0aOlN2v1VhA8ryonByZO1AYf/+MPbeBxC8soyODVba+y\nPW47Cx9YyMDOA6/7vUppT87On6+9jhkDhw5d1yiGwopI0LcRuYdziRgaQYPeDeixrwf2DWrPf73B\nZOL1+HjWpqay4aabuL1RI0s36doOHNDSOXfeqRWUcbZs11elFOsi1jFlyxQe6/JYhR6yKi7W7j3P\nn68dx6ZM0fL11t4jVpSv9vzli0pLWZXCsanH8PjEg1ZPV+wy3tJSi4t5IiICR52O/T17WnZYwuuh\nFCxcCDNnavmP4cMt3SISshJ44X8vcCzzGOuHrufWtrde1/vS0rS+9YsWQZcu2kd64AGzjM0tLEiC\n/g3MVGQidkosmb9n0v2P7tS/qXadmu3OzmZIeDjPuLgws0MH6++KmZmp5TxOnIBduywwMndZBpOB\nRXsW8d6f7zG5z2TWDVlHHftr37Dfu1frYhkcrN2U3bwZupl/LHNhIRL0b1CFJwsJfzycOm3r0GNP\nD+wb1p7/aqUUy5KTeSs+nmWdOzO4eXNLN+nadu3SzuofflgrEVnHsr2hdp/azcRfJtLYqTF/j/qb\nLi2uXvuqqAh++EGrApGSAs8/rz1Y1axZDTVY1JjaEwnEdcvYmkHkyEjavdoOt6lutap3TqHRyAsx\nMYRmZ/O3nx+dLZwLvyaTCT78UEt4L1sGgwZZtDkZBRm8/uvr/BT9E/P6zWOE74ir/v8nJsKSJVoa\nx9dXG5zroYe0QmjixiRB/waiTIoT758gaUkSXdd0rTX17s87WVjIY+HhdHByYre/P/WtvbP36dPw\nzDNa/fs9e6Cd+UaOqiilFCsPrWT6r9N53OdxIl6IoLFT+f//SsGOHVoKZ/t27cHgP/7Q8vbixmfl\nf1XiepVklhD5VCTGbCM99vagTuva87AVwK8ZGTwVGcmr7dox1a0WXJ389psW8J99VrvDacED1JHU\nI0z8ZSKFhkJ+GfELPdqUX80sP18bl+WLL7R0zqRJ2sWJFTwnJmqQlFa+AeRF5HFk8BGaPtgUj3ke\n6B1qT/cKpRQfJiTw6alTrO7ShXuspKzwFRkMWpBfvlx7MqlvX4s1Jbc4l5khM1lxaAXvBbzH+B7j\nsdNfnpeJi9N64KxYAbffrgX7e++VXji1lZRWtnHpwekcHXcUj488aPVM7eqOmWMwMCoqioSiIsL8\n/WnrVPnyvTXi1CktF+LkpJVSaGWZf2+lFOsj1zN161QC3AM4MvEILvVdyqxjNGq9bhYv1qpbjhql\nZaA6dLBIk4UVkaBfSymT4sR/T5C8PBnfX3xp2Kt2XaNH5eXxSHg4dzZqxGofH+pY+2nnTz/B2LHa\nk0nTplnsNPlgykGmbJlCZmEmqx5ZxV3ud5X5fXKydhGybJlWC2fCBK20sbXfDxc1R4J+LWTIMRD1\nTBTFqcX4h/lTp1Xtyt9vSEvjueho5nTowNg2bSzdnKsrLtaGMVy/HjZs0PIjFpCWl8Zbv7/Fj0d/\nZGbATMb6j8Ver/35KgW//66NxfLrrzB0qFbx0s/PIk0VVk6Cfi2TH5vPkcFHaHR7I3y+90Ffx8rP\nkC9iVIq34uP59vRp/ufrSy9rv4MYE6P1vXdz08oqWKCaZ4mxhIV7FjLr71k85fsUUS9E0aSudt/j\nzBlYuVLrclmnjlbmZ/lyuTErrk6Cfi2SsTWDyGcicZ/pjusEV0s3p0LSi4sZHhmJSSn29uhBC2uv\njrlqFUydCjNmaE8qWaA30ZbYLby89WXaN2rPX8/+RZcWXVBKew5s8WLYtEl7LCAoCG691SqKd4pa\nQHrv1AJKKRI+TuDUJ6fwWeND4ztqV//7fTk5PHbkCE+0bMmsDh2wt+b8fU4OvPCCdtfz+++he+WH\nC6ys6DPRTN06legz0czvP58HvB4gN1fHN99oKZz8fC1XP3Ik1IaHlYV5VTV2WvFfnwAw5huJfCqS\n1O9T8d/tX+sCfmByMgP+/ZePPDz4wMPDugP+vn3aiN2OjloBmhoO+Gfyz/Dylpe5PfB27na/myPP\nH8E1/0EmTtTRrp32aMDHH2tjz77yigR8UTlW/BcoCk8WcuD/DqDT6/D72w+ntlbepfEiRSYTE44e\n5YOTJ/nz5pt5vGVLSzfpypTSyijcfz/897/w1Vc1Os5fQUkBc3fMxXuhN8XGYvaMOkLzmFe46/8c\nGTgQXF0hPFyrjdO3r/SvF1VT6a/PunXr6Nq1K3Z2duzfv7/M7+bMmYOXlxfe3t5s27atyo20RWf/\nOsv+PvtxedIF76+9satbe4qhnCos5K4DB0gtKWFPjx74WPNAqampWrGZNWtg926tBn4NMZqMBB0I\notMXndibtJeVd/6D468L6entwpo1Wh2c+Hh4+21tgHEhzKHSN3J9fX3ZuHEjzz33XJnlERERrFmz\nhoiICBITE+nbty/R0dHo5fTkuiilSFqcxPGZx+nyTRea9qsF479eJCQzkxGRkUx2dWVau3bWXU7h\nfCmFZ56B996DGqrVr5Ric+xmpv06jYYOjXnWeS2/f3YrY+O1h6jCwqBjxxppirBBlQ763t7e5S4P\nDg5m+PDhODg44O7ujqenJ2FhYdxyyy2VbqStMBWZiJkUQ3ZoNv47/anrUdfSTbpuSinmnzrFhydP\nsqpLF+serLy4GN55R+uhs3JljZZS2Ju0l9e2v8bx9GS8T80l9OtBNL5Fx6uvwoMP1thxR9gws3fZ\nTEpKKhPg3dzcSExMNPdubjhFyUWEPxaOY2tH/Hb5YV+/9vSmzTUYGHv0KDEFBYT6++Ne14oPVhER\n8OSTWkXMAweghu41xGXG8drWN/kt5i8aHXwX497R9Bltz5KDMsasqFlXjSz9+vUjJSXlsuWzZ89m\n4MDrH1DZqi/xrUB2WDbhj4XT+rnWtH+jPTp97fn3is7P59EjR+jVsCE7/Pyoa62F2C8exnD2bK2k\nQg18L0+eTWDKhvf53/H16Ha/RN/6XzFxTD36r5Wa9cIyrhr0t2/fXuENurq6kpCQUPrzqVOncHUt\n/0GiGTNmlM4HBAQQEBBQ4f3VdslBycRNi6PzV51pPqh29cH7MS2N8dHR/LdDB8a3bm29B/fkZBg9\nGjIyYOdO8PKq9l0eTUxhwjdz+Dv7G+ofHc+r/kd5fkUzWreu9l2LG0xISAghISHm26CqooCAALV3\n797Sn8PDw1X37t1VUVGRiouLUx07dlQmk+my95lh17Wasdiool+MVqGdQlVuZK6lm1MhJUajmn7s\nmGq3c6fanZVl6eZc3YYNSrm4KPXOO0oVF1frrkwmpX7+PU11nfKq0k1rqrxenKLW/pKijMZq3a2w\nMVWNnZVOHG/cuJHJkyeTnp7Ogw8+iJ+fH5s3b8bHx4ehQ4fi4+ODvb09ixYtst4zQAspTismfEg4\ndvXs8N/tj0Pj2nP3Lq24mOEREQDWXU4hJwdeflkbEmrjRq1OQTU5cwaWrDzL/NBPyPBcSJ/mT3Bg\nxCG6d3Crtn0KUVlShqGG5ezP4cijR3B5yoUOMzugs6s9B8Sw7GyGhIfzpIsL/+3QATtrPZjv2gVP\nPw0BAdpDVw0amH0XSkFICCz6KpefUj+HW+dzj+tAvhjyNh2bStF6UX1kEJVa5PS3p4mdEovXIi9a\nPm7FT6heQinFkqQk3jl+nGWdOzPYWp//Ly7WnqhdtkyrSPbII2bfxenTWi/PL1dkkdd1Ifm+n/Hg\ng/cw+74ddG7e2ez7E8LcJOjXAJPBRPzr8aRtSKP7b92p71vf0k26bgVGIxOjo9mXm8s/fn54Weto\nHAcOaOPVtm+vzZvxjqnRCNu2aWWLt+/IpOPwz8h46gse8h7Am3eE0KWFjCguag8J+tWsJKOEiGFa\nDrzHnh44NK09+fu4ggIeCw/Hx9mZUH9/6lljH8OSEq0L5sKF8NFHWlrHTGmn+HgIDNTGlm3ePo1W\nD8/HrtcS/LwHs/b/duHVrPp7AQlhblIboRrlHs5lX6991O9eH9//+daqgP/LmTPcsn8/o1u14psu\nXawz4P/7L/Tpo9XMOXBAK6dQxYBfWAjffqsNHN67N6TkpnDPB//hxMDOtPfOYP9z+wgcHCgBX9Ra\ncqZfTVJ/SCVmYgyen3ri8qTLtd9gJYxK8d7x4yxPTmbjTTdxe6NGlm7S5QwG+OAD+PRT7XXUqCoH\n+4MHtfTNd9+Bvz88NuoU3o0/5Lvwb3iqyVP8+9C/uDWU3jii9pOgb2bKqIh/J57T35ym29ZuNPA3\nf8+R6pJWXMxTkZEUmkzs7dGDVnWscOzd8HAtd9+kiVb/vl27Sm/q7FntrH75ckhP144da36LZPXx\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x108a9c910>"
]
}
],
"prompt_number": 19
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"A bit of simplification"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's certainly possible to just use matrix primitives to design the filter. However, for modulating the filter parameters\n",
"at a high rate, it might make sense to simplify the math symbolically. For the state variable filter, the following\n",
"code goes straight to the bilinear transformed state space representation, using a by-hand symbolic solution to the matrix\n",
"inverse:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def svf_lp(f, res):\n",
" g = tan(pi * f)\n",
" k = 2 - 2 * res\n",
" a1 = 1/(1 + g * (g + k))\n",
" a2 = g * a1\n",
" a3 = g * a2\n",
" A = array([[2*a1 - 1, -2*a2],\n",
" [2*a2, 1 - 2*a3]])\n",
" B = array([2 * a2, 2 * a3])\n",
" C = array([a2, 1 - a3])\n",
" D = a3\n",
" return A, B, C, D"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we can check that this really does compute the same system."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = 0.1\n",
"res = 0.2\n",
"print svf_lp(f, res)\n",
"print bilinear(svf_lp_system(res), f)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(array([[ 0.23043279, -0.39979185],\n",
" [ 0.39979185, 0.87009975]]), array([ 0.39979185, 0.12990025]), array([ 0.19989592, 0.93504988]), 0.064950123180475744)\n",
"(array([[ 0.23043279, -0.39979185],\n",
" [ 0.39979185, 0.87009975]]), array([ 0.39979185, 0.12990025]), array([ 0.19989592, 0.93504988]), 0.064950123180475744)\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Simplified code for the rest of the [Audio EQ cookbook](http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt) designs are also at the [Second order sections in matrix form](Second%20order%20sections%20in%20matrix%20form.ipynb) notebook.\n",
"\n",
"Similarly, for the Moog filter, it's not too difficult to invert the matrix symbolically. Both Vadim's book and\n",
"the KVR thread on cheap zero delay filters contain these derivations.\n",
"\n",
"TODO: adapt code and put here."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"A note on nonlinearity"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Real analog filters have nonlinearities, and true \"virtual analog\" simulations attempt to model those as\n",
"well as the purely linear components.\n",
"Antti's paper is excellent at presenting differential equations representing\n",
"an only slightly idealized version of the Moog filter.\n",
"\n",
"Really emulating the non-linearity is beyond the scope of this cookbook, but I will note that keeping the\n",
"state space variables matching physical quantities (voltages across capacitors, etc.) is a huge help. There\n",
"are a number of ways of simply adding the nonlinearity back in. These are covered in more detail in the\n",
"\"cheap zero delay\" KVR thread and Vadim's book."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Conclusion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have shown how to design digital IIR filters in a state space framework, starting from analog prototypes\n",
"and giving some choices regarding discretization. All these techniques are cookbook and don't require solving\n",
"systems of equations by hand, or doing symbolic manipulation.\n",
"\n",
"These techniques work on a wide range of source filters and allow both easy, fast implementation and analysis, for example plotting the frequency response as a precise function of frequency, not requiring Fourier transforms\n",
"of impulse responses.\n",
"\n",
"In addition, the literature is rich in techniques for state space systems. As an example, the poles of the resulting\n",
"filter are exactly the eigenvalues of the $A$ matrix. In analog form, state space matrices can be composed arbitrarily,\n",
"including with feedback paths, making the basic technique powerful for circuit design and analysis.\n",
"\n",
"It is my hope that these matrix formulations will make the process of designing digital filters less mysterious,\n",
"and accessible to a broader audience, much in the way that Dan Lancaster's Active Filter Cookbook popularized analog\n",
"filter designs, and no doubt contributed to a great many home-built designs.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}