music/filters.ipynb

252 lines
52 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Filters"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"import math\n",
"import matplotlib\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from signals.domain import Time\n",
"from signals import waves\n",
"\n",
"# Show plots inline.\n",
"%matplotlib inline\n",
"\n",
"# Range of frequencies to plot.\n",
"FreqRange = (0, 20000)\n",
"# Plot resolution.\n",
"Steps = 200"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The simplest low-pass filter is given by this difference equation: $$y(n) = x(n)+x(n-1)$$ where $x(n)$ is the input amplitude at time (or sample) $n$ and $y(n)$ is the output amplitude at time $n$.\n",
"\n",
"You can also write this in terms of time instead of sample indices this way: $$y(nT)=x(nT)+x[(n-1)T]$$\n",
"for $n=0,1,2,...$ where $T$ is the sampling interval in seconds. Usually this is omitted by setting $T=1$."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def simple_lowpass(x, x0=0):\n",
" '''Simplest possible low-pass filter.'''\n",
" y = np.zeros(x.size)\n",
" y[0] = x[0] + x0\n",
" for i in range(1, x.size):\n",
" y[i] = x[i] + x[i - 1]\n",
" return y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Frequency Response\n",
"\n",
"It's very useful to know how a filter respond across a frequency spectrum $x(\\cdot)$.\n",
"\n",
"If we filter a sinusoid at each frequency separately, this is called _sine-wave analysis_."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10721d240>]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sec = 1.0\n",
"time = Time(sec=sec, samples=20)\n",
"sine = waves.sine(time.domain, freq=time.rate / 4)\n",
"filtered = simple_lowpass(sine)\n",
"plt.plot(sine)\n",
"plt.plot(filtered)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The ratio of the amplitude of the output to the amplitude of the input is called the _gain_ of the filter.\n",
"\n",
"_NOTE:_ It's hard to see here because I don't know how to reconstruct the continuous signal from the sampled output signal. I should look up how to do this.\n",
"\n",
"This is called the _amplitude response_."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.0000000000000029\n"
]
}
],
"source": [
"def gain(in_signal, out_signal):\n",
" return np.max(out_signal) / np.max(in_signal)\n",
"print(gain(sine, filtered))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can do this for every frequency between 0 and $f_s / 2$ and graph the result."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/eryn/Library/Python/3.6/lib/python/site-packages/ipykernel_launcher.py:6: RuntimeWarning: invalid value encountered in double_scalars\n",
" \n"
]
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x1077cb2b0>]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"frequencies = np.linspace(0, time.samples // 2, num=40, endpoint=False)\n",
"freq_response = np.empty(frequencies.shape[0])\n",
"for f in range(0, frequencies.shape[0]):\n",
" sine = waves.sine(time.domain, freq=frequencies[f])\n",
" filtered = simple_lowpass(sine)\n",
" freq_response[f] = np.max(filtered) / np.max(sine)\n",
"\n",
"plt.plot(freq_response)\n",
"\n",
"# TODO: Deal with the nan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice here that a the lowest frequency we had a gain boost of 2, which we can express in decibels with the following formula:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"6.020599913279624"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"20 * np.log10(2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In other words, the filter's gain is about 6 dB."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}