lasprs 0.14.3

Library for Acoustic Signal Processing (Rust edition, with optional Python bindings via pyo3)
Documentation
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bcd07c1e-6722-44c7-b162-267f1341c2fe",
   "metadata": {},
   "source": [
    "# Compare Butterworth bandpass implementation with Scipy's implementation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f0c4d6ef-69b2-4b5c-92fd-d987a11f3cbd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Prerequisites, uncomment below in case of errors. Also for ipympl, restart Jupyter Lab if it was not installed\n",
    "\n",
    "#!cd .. && maturin develop -F python-bindings\n",
    "#!pip install ipympl scipy matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "23b45cf6-85bc-4eaa-8f27-77c5b354e772",
   "metadata": {},
   "outputs": [],
   "source": [
    "# If this does not work, install ipympl and reboot Jupyter Lab\n",
    "%matplotlib widget"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "96090ac9-2033-411d-8e45-0c6b375a268b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from lasprs.filter import Biquad, SeriesBiquad, BiquadBank, FilterSpec, ZPKModel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8c137d60-51f3-4a14-892c-925aad662dc5",
   "metadata": {},
   "outputs": [],
   "source": [
    "#!pip install matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from numpy import log10, sqrt, exp, pi\n",
    "from scipy.signal import butter, freqs_zpk\n",
    "# Cut-\n",
    "fc = 100\n",
    "fl = fc/1.1\n",
    "fu = fc*1.5\n",
    "order = 4\n",
    "fs = 32e3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "25d36d28-80e9-40cc-9364-f708d21f9b49",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create Scipy filter\n",
    "but = butter(order, [2*pi*fl, 2*pi*fu],'bandpass', analog=True, output ='zpk')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1f877979-55a8-4eee-b1f3-fc8500414664",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# fspec = FilterSpec.Lowpass(fc, order)\n",
    "# fspec = FilterSpec.Highpass(fc, order)\n",
    "fspec = FilterSpec.Bandpass(fl, fu, order)\n",
    "m = ZPKModel.butter(fspec)\n",
    "freq = np.logspace(log10(fc)-1, log10(fc)+1, 100)\n",
    "def level(a):\n",
    "    return 20*np.log10(np.abs(a))\n",
    "#m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3ae5384d-2b5e-4688-b20d-148120e66147",
   "metadata": {},
   "outputs": [],
   "source": [
    "w, hbut = freqs_zpk(*but, worN=2*np.pi*freq)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad12c873-a47f-4ed5-a5ad-bb4d45bc5c3a",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.figure()\n",
    "plt.subplot(211)\n",
    "plt.title('Magnitude [dB]')\n",
    "plt.semilogx(freq, level(hbut), lw=3)\n",
    "plt.semilogx(freq, level(m.tf(1e-16, freq)), '--')\n",
    "plt.ylim(-10, 1)\n",
    "plt.legend(['Scipy', 'Lasprs'])\n",
    "plt.subplot(212)\n",
    "plt.title('Phase [deg]')\n",
    "plt.semilogx(freq, np.angle(m.tf(1e-16, freq), deg=True))\n",
    "plt.semilogx(freq, np.angle(hbut, deg=True))\n",
    "plt.xlabel('Freq. [Hz]')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}