DSA_SS24/notebooks/feature_detection.ipynb

374 lines
481 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Signal Processing\n",
"\n",
"The notebook goes into more detail on the processing of the 12 ECG data per patient. First, the signal itself is considered and then the ECG signal processing methods integrated in the 'wfdb' module are explored. Various approaches are then used to normalize the data and reduce noise in order to make the signals as comparable as possible."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import pyplot as plt\n",
"import wfdb.processing\n",
"import sys\n",
"import json\n",
"import scipy\n",
"import numpy as np\n",
"\n",
"sys.path.append('../scripts')\n",
"import data_helper"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load Data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Reading SB\n",
"Reading AFIB\n",
"Reading GSVT\n",
"Reading SR\n",
"Number of patients per category:\n",
"SB: 16559\n",
"AFIB: 9839\n",
"GSVT: 948\n",
"SR: 9720\n"
]
}
],
"source": [
"data = data_helper.load_data(only_demographic=False)\n",
"\n",
"print(\"Number of patients per category:\")\n",
"for cat_name in data.keys():\n",
" print(f\"{cat_name}: {len(data[cat_name])}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load the parameters needed to filter the data"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"with open('../filter_params.json', 'r') as f:\n",
" filter_params = json.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"example_data = data['SB'][0]\n",
"sig_channel= 0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Filter the data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"filtered_data = data_helper.filter_data(example_data, filter_params)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Learning initial signal parameters...\n",
"Failed to find 8 beats during learning.\n",
"Initializing using default parameters\n",
"Running QRS detection...\n",
"QRS detection complete.\n",
"[ 544 1114 1683 2281 2855 3452 4016 4606]\n"
]
},
{
"data": {
"image/png": "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Xbp0YadOnco6HA7heF1dHduhQwd28uTJwrEZM2aw0dHR7NmzZ4Vjhw8fZo1Go0d75Vi0aBELgI2Li2OnT5/OPvPMM+zu3bs9zpPrkz59+rBt2rRhq6urhWMbN25kAbDt27f3eG/Lli3ZsrIy4fj//vc/FgD7448/Sn6jO1988QULgN20aZNwjP8b5uXlNfr7evXqxd5www3C84EDB7LXX389C4A9cuQIy7Isu3z5chYA+/vvvwvntW/fXvK3/eabb1gA7IYNGzy+o3379h7tKyoqYqOioti///3vjbaPZVkWADt37ly2uLiYLSoqYrdv385OnDiRBcC+/PLLLMuy7MSJE9k+ffqwDQ0NwvscDgc7YsQItkuXLsKxhoYG1m63Sz4/Ly+PjYqKYp966inhGD/2vvnmG7a6upodO3Ysm5qayu7du1fy3qSkJPavf/1rk7+BIAgiWFC4IEEQhM548803sWbNGsk/tbAsi++++w5XX301WJZFSUmJ8G/q1KmorKz0CLWaPXs2YmJihOf79u3DiRMncPPNN6O0tFR4f21tLSZOnIhNmzbB4XDAbrdj1apVmDFjBtq1aye8v0ePHpg6dapP7V28eDE+//xzDBgwAKtWrcJjjz2GQYMGYeDAgThy5IjX9128eBEHDhzAbbfdhvj4eOH42LFj0adPH9n33HjjjWjRooXwfPTo0QA47wuPuB8aGhpQUlKCK664AgD8ClEbPXo0Nm/eDIALffv9999x1113ITU1VTi+efNmJCcno3fv3oo/n6dnz57C7wGAtLQ0dOvWTfLbGuPf//430tLSkJ6ejmHDhuG3337DggULMH/+fJSVlWH9+vW44YYbUF1dLYyH0tJSTJ06FSdOnMCFCxcAcLlkfD6f3W5HaWkp4uPj0a1bN9n+q6ysxJQpU3D06FFs3LgR/fv3l7yenJyM7du34+LFi372DEEQRGChcEGCIAidMXToUK/CF/5SXFyMiooKvPvuu3j33XdlzxELSgDwUDg8ceIEAM748kZlZSXMZjPq6+vRpUsXj9e7deuGFStW+NTmm266CTfddBOqqqqwfft2fPTRR/j8889x9dVX4+DBg7KCF2fPngUAIZxNTOfOnWUX9GJDEIBgcJWXlwvHysrKsHjxYnz55Zce/VRZWenT7xEzevRoLFu2DCdPnsSpU6fAMAyGDx8uGF933nknNm/ejJEjR6oSG3H/bQD3+8S/rTGuvfZazJs3DwzDICEhAb169UJcXBwALhSRZVk8/vjjePzxx2XfX1RUhKysLDgcDvzrX//CW2+9hby8PNjtduGcli1berxv/vz5aGhowN69e2XDGl944QXMnj0bbdu2xaBBg5CTk4PbbrsNHTt29Ol3EQRBBBoysgiCIC4DHA4HAOCWW27xaiTx+UE8Yu+N+DNefPFFD88CT3x8PMxms8rWSklMTMTkyZMxefJkRERE4OOPP8b27dsxduxYTT7faDTKHmdZVnh8ww03YOvWrXjooYfQv39/xMfHw+FwYNq0aUK/KGHUqFEAgE2bNuH06dMYOHAg4uLiMHr0aLz22muoqanB3r178cwzz/j3o5z48tsao02bNpg0aZLsa/zvfvDBB716KHlj99lnn8Xjjz+OO+64A08//TRSUlJgMBgwf/582f679tpr8eWXX+K
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Normalize data by setting qrs peaks to index position 0 (“X-axis normalization”)\n",
"indicies = wfdb.processing.xqrs_detect(filtered_data.p_signal[:,sig_channel],example_data.fs,0,5000)\n",
"print(indicies)\n",
"\n",
"peak_points_y = [filtered_data.p_signal[:,sig_channel][i] for i in indicies] \n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"plt.plot(filtered_data.p_signal[:,sig_channel])\n",
"plt.scatter(indicies, peak_points_y, color='red', label='Peaks')\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Amplitude')\n",
"plt.title('Filtered XQRS Signal with Peaks')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAHWCAYAAACFeEMXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3wT9f/HX5d0Lwp0Ugpl771EqICyrCJYUb64AHH/QBFx4ADBgbJEFMSF4EARrCgOhghSBEFBBBSQPUrpgu6R5HK/Pz65y11Gm+SuNAnv5+PRR3OXT5JP3vnc5z7vz3txgiAIIAiCIAiCIAiCIDRBV9cdIAiCIAiCIAiC8CdIySIIgiAIgiAIgtAQUrIIgiAIgiAIgiA0hJQsgiAIgiAIgiAIDSEliyAIgiAIgiAIQkNIySIIgiAIgiAIgtAQUrIIgiAIgiAIgiA0hJQsgiAIgiAIgiAIDSEliyAIgiAIgiAIQkNIySIIgvARTp8+DY7jsGLFCuncSy+9BI7j6q5TbqJ1fx3JpC5ZsWIFOI7D6dOna+X9U1JSMH78eJfb3nzzzbXSj9pi27Zt4DgOa9eureuuEARBqIKULIIgCC9BXKA7+nv22Wddfp/XXnsN69atq72OXiHWr1+PAQMGIC4uDmFhYWjevDnuuOMObNiwoa675jX8+++/eOmll2pFqZOPP51Oh0aNGmHo0KHYtm2b5p9FEAThbwTUdQcIgiAIJbNnz0azZs0U5zp27IimTZuioqICgYGB1b7+tddew+jRozFq1Kha7GXtMn/+fDz11FMYMGAApk+fjrCwMBw/fhw///wzvvzySwwfPhwAXJaJv3D06FHodNb90X///RezZs3CwIEDkZKSovnnDRkyBPfeey8EQcCpU6ewdOlSXH/99fjhhx9w4403av55BEEQ/gIpWQRBEF7GjTfeiJ49ezp8LiQk5Ar3hlFZWYmgoCDFAr+2MJlMePnllzFkyBBs2rTJ7vnc3FzpMcdxdSaTuiA4OPiKfl7r1q1x9913S8e33norOnfujEWLFpGSRRAEUQ3kLkgQBOEjuBJ/xHEcysrKsHLlSsnVSx7Dk5WVhfvuuw/x8fEIDg5Ghw4dsHz5csV7iHExX375JV544QUkJSUhLCwMxcXFAIDdu3dj+PDhqFevHsLCwjBgwAD89ttvdn3ZsWMHevXqhZCQELRo0QLvvfeeS98zPz8fxcXF6Nevn8Pn4+LiapTJmjVr0L59e4SEhKBjx4745ptvMH78eIW1R3zt/Pnz8f7776NFixYIDg5Gr1698Mcffyje78CBAxg/fjyaN2+OkJAQJCQk4L777kNBQYFL30nOd999B47jcODAAenc119/DY7jkJ6ermjbrl07jBkzRjqWx2StWLECt99+OwBg0KBB0u9t6863Y8cO9O7dGyEhIWjevDk++eQTt/ss0qlTJ8TExODUqVPSuSNHjmD06NFo0KABQkJC0LNnT3z33XeK1126dAnTpk1Dp06dEBERgaioKNx44434+++/a/zMqqoq3HzzzahXrx527twJACgpKcGUKVOQkpKC4OBgxMXFYciQIdi3b5/H340gCEJLyJJFEAThZRQVFSE/P19xLiYmxqXXfvrpp7j//vvRu3dvPPjggwCAFi1aAABycnJwzTXXgOM4TJo0CbGxsfjpp58wceJEFBcXY8qUKYr3evnllxEUFIRp06ahqqoKQUFB+OWXX3DjjTeiR48emDlzJnQ6HT7++GNcf/31yMzMRO/evQEABw8exNChQxEbG4uXXnoJJpMJM2fORHx8fI3fIS4uDqGhoVi/fj0mT56MBg0auPTdRX744QeMGTMGnTp1wpw5c3D58mVMnDgRSUlJDtuvWrUKJSUleOihh8BxHObOnYv09HScPHlSckPcvHkzTp48iQkTJiAhIQH//PMP3n//ffzzzz/4/fff3Urm0b9/f3Ach+3bt6Nz584AgMzMTOh0OuzYsUNql5eXhyNHjmDSpEkO3+e6667DY489hsWLF+O5555Du3btAED6DwDHjx/H6NGjMXHiRIwbNw7Lly/H+PHj0aNHD3To0MHlPotcvnwZly9fRsuWLQEA//zzD/r164ekpCQ8++yzCA8Px1dffYVRo0bh66+/xq233goAOHnyJNatW4fbb78dzZo1Q05ODt577z0MGDAA//77Lxo1auTw8yoqKjBy5Ej8+eef+Pnnn9GrVy8AwMMPP4y1a9di0qRJaN++PQoKCrBjxw4cPnwY3bt3d/t7EQRBaI5AEARBeAUff/yxAMDhnyAIwqlTpwQAwscffyy9ZubMmYLtVB4eHi6MGzfO7v0nTpwoJCYmCvn5+Yrz//vf/4R69eoJ5eXlgiAIwtatWwUAQvPmzaVzgiAIZrNZaNWqlTBs2DDBbDZL58vLy4VmzZoJQ4YMkc6NGjVKCAkJEc6cOSOd+/fffwW9Xm/XX0fMmDFDACCEh4cLN954o/Dqq68Ke/futWvnSCadOnUSGjduLJSUlEjntm3bJgAQmjZtavfahg0bCpcuXZLOf/vttwIAYf369YrvaMsXX3whABC2b98unRN/w1OnTlX7/Tp06CDccccd0nH37t2F22+/XQAgHD58WBAEQcjIyBAACH///bfUrmnTporfds2aNQIAYevWrXaf0bRpU7v+5ebmCsHBwcKTTz5Zbf8EQRAACBMnThTy8vKE3NxcYffu3cINN9wgABAWLFggCIIg3HDDDUKnTp2EyspK6XVms1m49tprhVatWknnKisrBZ7nFe9/6tQpITg4WJg9e7Z0Thx7a9asEUpKSoQBAwYIMTExwl9//aV4bb169YT/+7//q/E7EARB1BXkLkgQBOFlLFmyBJs3b1b8qUUQBHz99dcYMWIEBEFAfn6+9Dds2DAUFRXZuVqNGzcOoaGh0vH+/ftx7Ngx3HnnnSgoKJBeX1ZWhhtuuAHbt2+H2WwGz/PYuHEjRo0ahSZNmkivb9euHYYNG+ZSf2fNmoVVq1ahW7du2LhxI55//nn06NED3bt3x+HDh52+7sKFCzh48CDuvfdeRERESOcHDBiATp06OXzNmDFjUL9+fek4NTUVALO+iMjlUFlZifz8fFxzzTUA4JGLWmpqKjIzMwEw17e///4bDz74IGJiYqTzmZmZiI6ORseOHd1+f5H27dtL3wcAYmNj0aZNG8V3q46PPvoIsbGxiIuLQ58+ffDbb79h6tSpmDJlCi5duoRffvkFd9xxB0pKSqTxUFBQgGHDhuHYsWPIysoCwGLJxHg+nudRUFCAiIgItGnTxqH8ioqKMHToUBw5cgTbtm1D165dFc9HR0dj9+7duHDhgoeSIQiCqF3IXZAgCMLL6N27t9PEF56Sl5eHwsJCvP/++3j//fcdtpEnlABgl+Hw2LFjAJjy5YyioiJUVVWhoqICrVq1snu+TZs2+PHHH13q89ixYzF27FgUFxdj9+7dWLFiBVatWoURI0bg0KFDDhNenDlzBgAkdzY5LVu2dLiglyuCACSF6/Lly9K5S5cuYdasWfjyyy/t5FRUVOTS95GTmpqKZcuW4fjx4zhx4gQ4jkPfvn0l5euBBx5AZmYm+vXrpyrZiO13A9j3k3+36hg5ciQmTZoEjuMQGRmJDh06IDw8HABzRRQEAS+++CJefPFFh6/Pzc1FUlISzGYz3nrrLSxduhSnTp0Cz/NSm4YNG9q9bsqUKaisrMRff/3l0K1x7ty5GDduHJKTk9GjRw+kpaXh3nvvRfPmzV36XgRBELUNKVkEQRBXAWazGQBw9913O1WSxPggEbn1Rv4e8+bNs7MsiERERKCqqkplb5VERUVhyJAhGDJkCAIDA7Fy5Urs3r0bAwYM0OT99Xq9w/OCIEiP77jjDuzcuRNPPfUUunbtioiICJjNZgwfPlySizv0798fALB9+3acPHkS3bt3R3h4OFJTU7F48WKUlpbir7/+wquvvurZl7LgynerjsaNG2Pw4MEOnxO/97Rp05xaKEVl97XXXsOLL76I++67Dy+//DIaNGgAnU6HKVOmOJTfyJEj8eWXX+L111/HJ59
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"indicies = wfdb.processing.find_local_peaks(filtered_data.p_signal[:,sig_channel],radius=3) \n",
"peak_points_y = [filtered_data.p_signal[:,sig_channel][i] for i in indicies] \n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"plt.plot(filtered_data.p_signal[:,sig_channel])\n",
"plt.scatter(indicies, peak_points_y, color='red', label='Peaks')\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Amplitude')\n",
"plt.title('Filtered Signal with Peaks')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[]\n"
]
}
],
"source": [
"plt.figure(figsize=(10, 5))\n",
"plt.plot(filtered_data.p_signal[:,sig_channel])\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Amplitude')\n",
"plt.title('Cut Signal with Minimas Q, S detection')\n",
"plt.grid(True)\n",
"\n",
"for peak in indicies:\n",
" start_idx = 20\n",
" end_idx = 25\n",
" signal_section = filtered_data.p_signal[:,sig_channel][peak-start_idx:peak+end_idx]\n",
" minimas = scipy.signal.argrelextrema(signal_section, comparator=np.less, order=5)\n",
" \n",
" # map the minimas to the original signal\n",
" minimas = minimas[0] + peak - start_idx\n",
" minimas_y = [filtered_data.p_signal[:,sig_channel][i] for i in minimas]\n",
" # if minimas more than 2 take those with biggest difference in y\n",
" if len(minimas) > 2:\n",
" minimas_y = [filtered_data.p_signal[:,sig_channel][i] for i in minimas]\n",
" minimas_y = sorted(minimas_y)\n",
" minimas_y = minimas_y[:2]\n",
" minimas = [minimas[i] for i in range(0,2)]\n",
"\n",
" # plot the minimas\n",
" plt.plot(minimas, minimas_y, 'ro')\n",
"\n",
"plt.legend(['Signal', 'Minimas'])\n",
"plt.show()\n",
"\n",
"#print y values of minimas\n",
"print(minimas_y)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# find peaks in the cut signal\n",
"hard = wfdb.processing.find_local_peaks(filtered_data.p_signal[:,sig_channel],radius=3)\n",
"#peak_points_y = [cut_signal[i] for i in hard]\n",
"\n",
"tolerance = 1\n",
"# get standard deviation of the hard peaks\n",
"std = filtered_data.p_signal[:,sig_channel][hard].std() * tolerance\n",
"mean = np.mean(filtered_data.p_signal[:,sig_channel])\n",
"\n",
"#hard = [i for i in hard if abs(filtered_data.p_signal[:,sig_channel][i] - mean) > std]\n",
"# filter peaks with std\n",
"hard = [i for i in hard if filtered_data.p_signal[:,sig_channel][i] > std]\n",
"# get the y values of the peaks\n",
"peak_points_y = [filtered_data.p_signal[:,sig_channel][i] for i in hard]\n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"plt.plot(filtered_data.p_signal[:,sig_channel])\n",
"plt.plot(hard, peak_points_y, 'ro', label='Peaks')\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Amplitude')\n",
"plt.title('Cuted Signal with Peaks (STD)')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAHWCAYAAACFeEMXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAADhF0lEQVR4nOydd5gT5fbHv5NkewW2F1h6770svdtwxYKFIvaLykW9il4LehUrol6Va/fen4pXRK8F6SAgTUCk975s7zWbMr8/JjOZSSa7mcxkUzif5+EhmZ0kb96888573nPO9zAsy7IgCIIgCIIgCIIgNEHn6wYQBEEQBEEQBEEEE2RkEQRBEARBEARBaAgZWQRBEARBEARBEBpCRhZBEARBEARBEISGkJFFEARBEARBEAShIWRkEQRBEARBEARBaAgZWQRBEARBEARBEBpCRhZBEARBEARBEISGkJFFEARBEARBEAShIWRkEQRBBAjnzp0DwzD47LPPhGPPPfccGIbxXaMUonV75frEl3z22WdgGAbnzp3zyvtnZWVh9uzZbp979dVXe6Ud3mLz5s1gGAYrVqzwdVMIgiBUQUYWQRCEn8Av0OX+PfHEE26/z0svvYTvv//eew1tJn788UeMGjUKSUlJiIyMRLt27XDTTTdh9erVvm6a33DkyBE899xzXjHqxONPp9MhLS0NEydOxObNmzX/LIIgiGDD4OsGEARBEFKef/55tG3bVnKsR48eaNOmDerq6hASEtLo61966SVMnz4d06ZN82Irvcvrr7+Oxx57DKNGjcLChQsRGRmJU6dOYf369Vi+fDkmT54MAG73SbBw/Phx6HT2/dEjR45g0aJFGD16NLKysjT/vAkTJmDmzJlgWRZnz57Fe++9h7Fjx+Lnn3/GlClTNP88giCIYIGMLIIgCD9jypQpGDBggOzfwsPDm7k1HPX19QgNDZUs8L2F2WzGCy+8gAkTJmDt2rVOfy8sLBQeMwzjsz7xBWFhYc36eZ06dcLtt98uPL/++uvRq1cvLF26lIwsgiCIRqBwQYIgiADBnfwjhmFQU1ODzz//XAj1Eufw5Obm4s4770RycjLCwsLQvXt3fPLJJ5L34PNili9fjr///e9IT09HZGQkKisrAQC7du3C5MmTERcXh8jISIwaNQq//fabU1u2bduGgQMHIjw8HO3bt8e//vUv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
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Find peaks in Channel 6 of Record 25\n",
"hard = wfdb.processing.find_local_peaks(filtered_data.p_signal[:,sig_channel],radius=50)\n",
"record = filtered_data.p_signal[:,sig_channel]\n",
"peak_points_y = [record[i] for i in hard] \n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"plt.plot(record)\n",
"plt.plot(hard, peak_points_y, 'ro', label='Peaks')\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Amplitude')\n",
"plt.title('Filtered Signal with Peaks')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Find peaks in Channel 6 of Record 25\n",
"hard, soft = wfdb.processing.find_peaks(filtered_data.p_signal[:,sig_channel])\n",
"record = filtered_data.p_signal[:,sig_channel]\n",
"peak_points_y = [record[i] for i in hard] \n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"plt.plot(record)\n",
"plt.plot(hard, peak_points_y, 'ro', label='Peaks')\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Amplitude')\n",
"plt.title('Filtered Signal with Peaks')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.show()"
]
}
],
"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.10.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}