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/biquad in two.ipynb

305 lines
79 KiB

{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fast matrix biquad\n",
"==================\n",
"\n",
"This notebook shows the math behind a very fast NEON implementation of biquad IIR filters.\n",
"One of the main primitives NEON is very highly optimized for is multiplying a matrix by\n",
"a vector, especially of size 4.\n",
"\n",
"A biquad filter has two state variables (this is most apparent in transposed direct form II).\n",
"For this implementation, the input vector consists of two input values and the two state\n",
"variables. The output vector is two output values and the new state vector. The relationship\n",
"is linear, ie the transformation from input to output vector is simply a matrix-vector\n",
"multiplication. Each iteration computes two samples, using a single 4x4 matrix-vector multiply."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 117
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We start with a simple implementation of biquad for reference; we'll compare the error of the matrix approach against this scalar implementation. This is in direct form I."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def biquad(coefs, inp):\n",
" b0, b1, b2, a1, a2 = coefs\n",
" out = zeros(len(inp))\n",
" x1 = 0\n",
" x2 = 0\n",
" y1 = 0\n",
" y2 = 0\n",
" for i in range(len(inp)):\n",
" x = inp[i]\n",
" y = b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2\n",
" out[i] = y\n",
" x2, x1 = x1, x\n",
" y2, y1 = y1, y\n",
" return out"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 118
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As a starting step, here's the same biquad in a 2x2 matrix formulation. This version is derived from\n",
"transposed direct form II, with a little expansion of the effect _this_ input sample has on the _next_\n",
"state vector (this is the B array below). The A matrix describes the evolution of the IIR state."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bqmat(coefs, inp):\n",
" b0, b1, b2, a1, a2 = coefs\n",
" A = array([[-a1, 1], [-a2, 0]])\n",
" B = array([b1 - a1 * b0, b2 - a2 * b0])\n",
" y = array([0, 0])\n",
" out = np.zeros(len(inp))\n",
" for i in range(len(inp)):\n",
" x = inp[i]\n",
" out[i] = y[0] + x * b0\n",
" y = dot(A, y) + B * x\n",
" return out"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 119
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's test it out."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"impulse = zeros(100)\n",
"impulse[10] = 1\n",
"coefs = 1.0207, -1.7719, .9376, -1.7719, 0.9583 # peaking\n",
"plot(biquad(coefs, impulse))\n",
"plot(bqmat(coefs, impulse))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 120,
"text": [
"[<matplotlib.lines.Line2D at 0x10cecce10>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x10ced4110>"
]
}
],
"prompt_number": 120
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot(biquad(coefs, impulse) - bqmat(coefs, impulse))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 121,
"text": [
"[<matplotlib.lines.Line2D at 0x10d3a9e50>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x10d390750>"
]
}
],
"prompt_number": 121
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note the scale of the error -- it's floating point rounding.\n",
"\n",
"Now for the 4x4 matrix approach. It's really four 2x2 matrices tiled. The top\n",
"left corner is the influence of the two input samples on the two output samples;\n",
"it's the first two values of the biquad's impulse response, banded. The top\n",
"right corner is the contribution of the state vector to the output. The bottom\n",
"left is the effect of the input on the state, and the bottom right is the\n",
"evolution of the IIR. Since each iteration is two samples, this matrix is\n",
"simply the square of the A matrix above.\n",
"\n",
"Note that each iteration processes _two_ samples. The matrix-vector product\n",
"is 16 multiply-accumulates, so it amortizes to 8 per sample. This compares\n",
"well to the 5 multiply-accumulates of the direct form, but organized for extremely\n",
"fast evaluation in SIMD, and NEON in particular."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def biquadm(coefs, inp):\n",
" b0, b1, b2, a1, a2 = coefs\n",
" c1 = b1 - a1 * b0\n",
" c2 = b2 - a2 * b0\n",
" A = array([[b0, 0, 1, 0],\n",
" [c1, b0, -a1, 1],\n",
" [-a1 * c1 + c2, c1, -a2 + a1*a1, -a1],\n",
" [-a2 * c1, c2, a1*a2, -a2]])\n",
" out = np.zeros(len(inp))\n",
" y = zeros(4)\n",
" for i in range(0, len(inp), 2):\n",
" y[0:2] = inp[i:i+2]\n",
" y = dot(A, y)\n",
" out[i:i+2] = y[0:2]\n",
" return out"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 122
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, let's test it out."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot(biquad(coefs, impulse))\n",
"plot(biquadm(coefs, impulse))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 123,
"text": [
"[<matplotlib.lines.Line2D at 0x10d3b9510>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x10d3b94d0>"
]
}
],
"prompt_number": 123
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The error is similar to that of the 2x2 matrix version, but not quite the same."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot(biquadm(coefs, delta) - biquad(coefs, delta))\n",
"plot(biquadm(coefs, delta) - bqmat(coefs, delta))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 124,
"text": [
"[<matplotlib.lines.Line2D at 0x10d70b550>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nrkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x10d70b5d0>"
]
}
],
"prompt_number": 124
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 124
}
],
"metadata": {}
}
]
}