From c764ddad1775bb6bbb0ad9604fc2a5201a75c2c9 Mon Sep 17 00:00:00 2001 From: Patrick Hangl Date: Wed, 22 Apr 2026 13:53:25 +0200 Subject: [PATCH] Reduced_Update, Error_Threshold Plots --- ANR_high_level.ipynb | 274 +++++++++++++++++- reduced_update.txt | 7 - threshold_evaluation/error_threshold.xlsx | Bin 0 -> 23421 bytes .../error_threshold_breathing.csv | 18 ++ .../error_threshold_chewing.csv | 18 ++ .../error_threshold_coughing.csv | 18 ++ .../error_threshold_drinking.csv | 1 + .../error_threshold_scratching.csv | 18 ++ update_rate_evaluation/update_rate.xlsx | Bin 0 -> 16684 bytes .../update_rate_breathing.csv | 8 + .../update_rate_chewing.csv | 8 + .../update_rate_coughing.csv | 8 + .../update_rate_drinking.csv | 8 + .../update_rate_scratching.csv | 8 + 14 files changed, 382 insertions(+), 12 deletions(-) delete mode 100644 reduced_update.txt create mode 100644 threshold_evaluation/error_threshold.xlsx create mode 100644 threshold_evaluation/error_threshold_breathing.csv create mode 100644 threshold_evaluation/error_threshold_chewing.csv create mode 100644 threshold_evaluation/error_threshold_coughing.csv create mode 100644 threshold_evaluation/error_threshold_drinking.csv create mode 100644 threshold_evaluation/error_threshold_scratching.csv create mode 100644 update_rate_evaluation/update_rate.xlsx create mode 100644 update_rate_evaluation/update_rate_breathing.csv create mode 100644 update_rate_evaluation/update_rate_chewing.csv create mode 100644 update_rate_evaluation/update_rate_coughing.csv create mode 100644 update_rate_evaluation/update_rate_drinking.csv create mode 100644 update_rate_evaluation/update_rate_scratching.csv diff --git a/ANR_high_level.ipynb b/ANR_high_level.ipynb index 0eb5d71..d655470 100644 --- a/ANR_high_level.ipynb +++ b/ANR_high_level.ipynb @@ -70,6 +70,7 @@ "\n", "# Low-Level ANR Algorithmmus (wie in C)\n", "def anr_function_c(input, ref_noise, coefficients, mu, adaption_step = 1):\n", + " counter = 0\n", " sample_count = len(input)\n", " filter_line = np.zeros(coefficients)\n", " sample_line = np.zeros(coefficients)\n", @@ -88,10 +89,14 @@ " output[n] = error\n", " # update_filter_coeffcients: Filterkoeffizienten adaptieren\n", " if (n % adaption_step) == 0: # bei Rate x/adatpion_step: if (n % adaption_step) < x:\n", + " #if abs(error) > 0.00: # nur adaptieren wenn Fehler über Schwellwert\n", + " counter += 1\n", " filter_line += mu * error * sample_line\n", " # Filterkoeffizienten expoertieren\n", " coeffient_matrix[n, :] = filter_line\n", + " print(f\"Anpassungen: {counter}\")\n", " return output, coeffient_matrix\n", + " \n", "\n", "\n" ] @@ -642,7 +647,7 @@ "])\n", "\n", "# Punktweiser Mittelwert\n", - "mean_curve = np.mean(all_curves, axis=0)\n", + "mean_gain = np.mean(all_curves, axis=0)\n", "\n", "# Plot\n", "plt.figure(figsize=(15, 7))\n", @@ -651,7 +656,7 @@ "plt.plot(x, male_scratching, linestyle='-.', linewidth=1.5, alpha=0.7, label='Scratching Noise')\n", "plt.plot(x, male_drinking, linestyle=':', linewidth=1.5, alpha=0.7, label='Drinking Noise')\n", "plt.plot(x, male_coughing, linestyle=(0, (3, 1, 1, 1)), linewidth=1.5, alpha=0.7, label='Coughing Noise')\n", - "plt.plot(x, mean_curve, linestyle='--', color='red', linewidth=2.5, label='Mean SNR-Gain')\n", + "plt.plot(x, mean_gain, linestyle='--', color='red', linewidth=2.5, label='Mean SNR-Gain')\n", "\n", "plt.rcParams.update({\n", " \"text.usetex\": True,\n", @@ -946,7 +951,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Reduced Update Plot\n", + "#Single Reduced Update Plot\n", "\n", "import matplotlib.ticker as mtick\n", "from scipy.interpolate import make_interp_spline\n", @@ -954,7 +959,7 @@ "PLOT = False\n", "\n", "# Daten aus .csv laden\n", - "data_reduced_update = np.loadtxt('reduced_update.txt', delimiter=\",\")\n", + "data_reduced_update = np.loadtxt('reduced_update.txt', delimiter=\",\", skiprows=1)\n", "\n", "# Daten laden\n", "x = data_reduced_update[:, 0]\n", @@ -986,7 +991,7 @@ "plt.figure(figsize=(15, 7))\n", "plt.plot(x_smooth, gain_smooth, linestyle='--', color='indianred', linewidth=2, alpha=0.9, label='SNR-Gain')\n", "plt.plot(x_smooth, cycles_smooth, linestyle='-.', color='skyblue', linewidth=2, alpha=0.9, label='Cycles/Sample')\n", - "plt.plot(x_smooth, comp_smooth, linestyle=':', color='forestgreen', linewidth=2, alpha=0.9, label='DSP Computing')\n", + "plt.plot(x_smooth, comp_smooth, linestyle=':', color='forestgreen', linewidth=2, alpha=0.9, label='DSP Load')\n", "plt.plot([x_max, x_max], [y1_max, y2_max], color='black', linestyle=':', linewidth=2)\n", "\n", "plt.scatter(x, reduced_gain, color='indianred', s=40)\n", @@ -1023,6 +1028,265 @@ " plt.savefig(f'plots/fig_snr_reduced_update', dpi=600)\n", "plt.show()\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Single Error Threshold Plot\n", + "\n", + "import matplotlib.ticker as mtick\n", + "from scipy.interpolate import make_interp_spline\n", + "\n", + "PLOT = False\n", + "\n", + "# Daten aus .csv laden\n", + "data_error_threshold = np.loadtxt('threshold_evaluation/error_threshold_breathing.csv', delimiter=\";\", skiprows=1)\n", + "\n", + "# Daten laden\n", + "x = data_error_threshold[:, 0]\n", + "error_gain = data_error_threshold[:, 2]\n", + "error_cycles = data_error_threshold[:, 6]\n", + "error_computing = data_error_threshold[:, 7]\n", + "\n", + "# Sortieren\n", + "idx = np.argsort(x)\n", + "x = x[idx]\n", + "error_gain = error_gain[idx]\n", + "error_cycles = error_cycles[idx]\n", + "error_computing = error_computing[idx]\n", + "\n", + "# Smoothing\n", + "x_smooth = np.linspace(x.min(), x.max(), 300)\n", + "\n", + "gain_smooth = make_interp_spline(x, error_gain)(x_smooth)\n", + "cycles_smooth = make_interp_spline(x, error_cycles)(x_smooth)\n", + "comp_smooth = make_interp_spline(x, error_computing)(x_smooth)\n", + "\n", + "diff_smooth = np.abs(gain_smooth - cycles_smooth)\n", + "idx_max = np.argmax(diff_smooth)\n", + "x_max = x_smooth[idx_max]\n", + "y1_max = gain_smooth[idx_max]\n", + "y2_max = cycles_smooth[idx_max]\n", + "\n", + "# Plot\n", + "plt.figure(figsize=(15, 7))\n", + "plt.plot(x_smooth, gain_smooth, linestyle='--', color='indianred', linewidth=2, alpha=0.9, label='SNR-Gain')\n", + "plt.plot(x_smooth, cycles_smooth, linestyle='-.', color='skyblue', linewidth=2, alpha=0.9, label='Cycles/Sample')\n", + "plt.plot(x_smooth, comp_smooth, linestyle=':', color='forestgreen', linewidth=2, alpha=0.9, label='DSP Load')\n", + "plt.plot([x_max, x_max], [y1_max, y2_max], color='black', linestyle=':', linewidth=2)\n", + "\n", + "plt.scatter(x, error_gain, color='indianred', s=40)\n", + "plt.scatter(x, error_cycles, color='skyblue', s=40)\n", + "plt.scatter(x, error_computing, color='forestgreen', s=40)\n", + "\n", + "plt.text(x_max, (y1_max + y2_max)/2+0.21,\n", + " f'Maximum Offset at {x_max:.2f}',\n", + " fontsize=20,\n", + " ha='left')\n", + "\n", + "plt.rcParams.update({\n", + " \"text.usetex\": True,\n", + " \"font.family\": \"serif\",\n", + " 'font.size': 16, # Standardtext\n", + " 'axes.labelsize': 30, # Achsenbeschriftungen\n", + " 'xtick.labelsize': 25, # Tick-Beschriftungen\n", + " 'ytick.labelsize': 25,\n", + " 'legend.fontsize': 25 # Legende\n", + "})\n", + "\n", + "plt.xlabel(\"Error Threshold\")\n", + "plt.ylabel(\"Relative Performance\")\n", + "plt.grid(True, linestyle='-.', alpha=0.4)\n", + "#Spines auf ganzen Plot anwenden\n", + "plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(1.0))\n", + "plt.gca().spines['top'].set_visible(False)\n", + "plt.gca().spines['right'].set_visible(False)\n", + "#plt.gca().invert_xaxis()\n", + "plt.legend(frameon=False, loc='upper right')\n", + "plt.tight_layout()\n", + "if PLOT == True:\n", + " plt.savefig(f'plots/fig_snr_error_threshold', dpi=600)\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Multi Error Threshold Plot\n", + "\n", + "import matplotlib.ticker as mtick\n", + "from scipy.interpolate import make_interp_spline\n", + "\n", + "PLOT = False\n", + "\n", + "# Daten aus .csv laden\n", + "error_threshold_breathing = np.loadtxt('threshold_evaluation/error_threshold_breathing.csv', delimiter=\";\", skiprows=1)\n", + "error_threshold_chewing = np.loadtxt('threshold_evaluation/error_threshold_chewing.csv', delimiter=\";\", skiprows=1)\n", + "error_threshold_coughing = np.loadtxt('threshold_evaluation/error_threshold_coughing.csv', delimiter=\";\", skiprows=1)\n", + "error_threshold_drinking = np.loadtxt('threshold_evaluation/error_threshold_drinking.csv', delimiter=\";\", skiprows=1)\n", + "error_threshold_scratching = np.loadtxt('threshold_evaluation/error_threshold_scratching.csv', delimiter=\";\", skiprows=1)\n", + "\n", + "# Daten laden\n", + "x = error_threshold_breathing[:, 0]\n", + "error_gain_breathing = error_threshold_breathing[:, 2]\n", + "error_cycles_breathing = error_threshold_breathing[:, 6]\n", + "error_computing_breathing = error_threshold_breathing[:, 7]\n", + "error_gain_chewing = error_threshold_chewing[:, 2]\n", + "error_cycles_chewing = error_threshold_chewing[:, 6]\n", + "error_computing_chewing = error_threshold_chewing[:, 7]\n", + "error_gain_coughing = error_threshold_coughing[:, 2]\n", + "error_cycles_coughing = error_threshold_coughing[:, 6]\n", + "error_computing_coughing = error_threshold_coughing[:, 7]\n", + "error_gain_drinking = error_threshold_drinking[:, 2]\n", + "error_cycles_drinking = error_threshold_drinking[:, 6]\n", + "error_computing_drinking = error_threshold_drinking[:, 7]\n", + "error_gain_scratching = error_threshold_scratching[:, 2]\n", + "error_cycles_scratching = error_threshold_scratching[:, 6] \n", + "error_computing_scratching = error_threshold_scratching[:, 7] \n", + "\n", + "# Sortieren\n", + "idx = np.argsort(x)\n", + "x = x[idx]\n", + "error_gain_breathing = error_gain_breathing[idx]\n", + "error_cycles_breathing = error_cycles_breathing[idx]\n", + "error_computing_breathing = error_computing_breathing[idx]\n", + "error_gain_chewing = error_gain_chewing[idx]\n", + "error_cycles_chewing = error_cycles_chewing[idx]\n", + "error_computing_chewing = error_computing_chewing[idx]\n", + "error_gain_coughing = error_gain_coughing[idx]\n", + "error_cycles_coughing = error_cycles_coughing[idx]\n", + "error_computing_coughing = error_computing_coughing[idx]\n", + "error_gain_drinking = error_gain_drinking[idx]\n", + "error_cycles_drinking = error_cycles_drinking[idx]\n", + "error_computing_drinking = error_computing_drinking[idx]\n", + "error_gain_scratching = error_gain_scratching[idx]\n", + "error_cycles_scratching = error_cycles_scratching[idx]\n", + "error_computing_scratching = error_computing_scratching[idx]\n", + "\n", + "# Smoothing\n", + "x_smooth = np.linspace(x.min(), x.max(), 300)\n", + "\n", + "gain_smooth_breathing = make_interp_spline(x, error_gain_breathing)(x_smooth)\n", + "cycles_smooth_breathing = make_interp_spline(x, error_cycles_breathing)(x_smooth)\n", + "computing_smooth_breathing = make_interp_spline(x, error_computing_breathing)(x_smooth)\n", + "gain_smooth_chewing = make_interp_spline(x, error_gain_chewing)(x_smooth)\n", + "cycles_smooth_chewing = make_interp_spline(x, error_cycles_chewing)(x_smooth)\n", + "computing_smooth_chewing = make_interp_spline(x, error_computing_chewing)(x_smooth)\n", + "gain_smooth_coughing = make_interp_spline(x, error_gain_coughing)(x_smooth)\n", + "cycles_smooth_coughing = make_interp_spline(x, error_cycles_coughing)(x_smooth)\n", + "computing_smooth_coughing = make_interp_spline(x, error_computing_coughing)(x_smooth)\n", + "gain_smooth_drinking = make_interp_spline(x, error_gain_drinking)(x_smooth)\n", + "cycles_smooth_drinking = make_interp_spline(x, error_cycles_drinking)(x_smooth)\n", + "computing_smooth_drinking = make_interp_spline(x, error_computing_drinking)(x_smooth)\n", + "gain_smooth_scratching = make_interp_spline(x, error_gain_scratching)(x_smooth)\n", + "cycles_smooth_scratching = make_interp_spline(x, error_cycles_scratching)(x_smooth)\n", + "computing_smooth_scratching = make_interp_spline(x, error_computing_scratching)(x_smooth)\n", + "\n", + "diff_smooth_breathing = gain_smooth_breathing - cycles_smooth_breathing\n", + "diff_smooth_chewing = gain_smooth_chewing - cycles_smooth_chewing\n", + "diff_smooth_coughing = gain_smooth_coughing - cycles_smooth_coughing\n", + "diff_smooth_drinking = gain_smooth_drinking - cycles_smooth_drinking\n", + "diff_smooth_scratching = gain_smooth_scratching - cycles_smooth_scratching\n", + "\n", + "# Alle Kurven in ein Array stapeln\n", + "stack_difference = np.vstack([\n", + " diff_smooth_breathing,\n", + " diff_smooth_chewing,\n", + " diff_smooth_coughing,\n", + " diff_smooth_drinking,\n", + " diff_smooth_scratching\n", + "])\n", + "\n", + "# Alle Kurven in ein Array stapeln\n", + "stack_computing = np.vstack([\n", + " computing_smooth_breathing,\n", + " computing_smooth_chewing,\n", + " computing_smooth_coughing,\n", + " computing_smooth_drinking,\n", + " computing_smooth_scratching\n", + "])\n", + "\n", + "# Punktweiser Mittelwert\n", + "mean_gain = np.mean(stack_difference, axis=0)\n", + "mean_computing = np.mean(stack_computing, axis=0) \n", + "\n", + "idx_max_gain = np.argmax(mean_gain)\n", + "x_max_gain = x_smooth[idx_max_gain]\n", + "y_max_gain = mean_gain[idx_max_gain]\n", + "x_max_computing = x_smooth[idx_max_gain]\n", + "y_max_computing = mean_computing[idx_max_gain]\n", + "\n", + "\n", + "# Plot\n", + "figure1, ax1 = plt.subplots(figsize=(15, 7))\n", + "ax1.plot(x_smooth, diff_smooth_breathing, linestyle='--', color='indianred', linewidth=1.5, alpha=0.7, label='Breathing Noise')\n", + "ax1.plot(x_smooth, diff_smooth_chewing, linestyle='-.', color='skyblue', linewidth=1.5, alpha=0.7, label='Chewing Noise')\n", + "ax1.plot(x_smooth, diff_smooth_coughing, linestyle=':', color='forestgreen', linewidth=1.5, alpha=0.7, label='Coughing Noise')\n", + "ax1.plot(x_smooth, diff_smooth_drinking, linestyle='--', color='darkorange', linewidth=1.5, alpha=0.7, label='Drinking Noise')\n", + "ax1.plot(x_smooth, diff_smooth_scratching, linestyle='-.', color='darkorchid', linewidth=1.5, alpha=0.7, label='Scratching Noise')\n", + "ax1.plot(x_smooth, mean_gain, linestyle='--', color='red', linewidth=2.5, alpha=1, label='Mean Performance Gain')\n", + "ax1.plot([x_max_gain, x_max_gain], [y_max_gain, 0], color='black', linestyle=':', linewidth=2)\n", + "\n", + "ax1.text(x_max_gain, y_max_gain+0.01,\n", + " f'{y_max_gain*100:.1f} \\% mean performance gain at error threshold {x_max_gain:.2f}',\n", + " fontsize=20,\n", + " ha='left')\n", + "\n", + "figure2, ax2 = plt.subplots(figsize=(15, 7))\n", + "ax2.plot(x_smooth, computing_smooth_breathing, linestyle='--', color='indianred', linewidth=1.5, alpha=0.7, label='Breathing Noise')\n", + "ax2.plot(x_smooth, computing_smooth_chewing, linestyle='-.', color='skyblue', linewidth=1.5, alpha=0.7, label='Chewing Noise')\n", + "ax2.plot(x_smooth, computing_smooth_coughing, linestyle=':', color='forestgreen', linewidth=1.5, alpha=0.7, label='Coughing Noise')\n", + "ax2.plot(x_smooth, computing_smooth_drinking, linestyle='--', color='darkorange', linewidth=1.5, alpha=0.7, label='Drinking Noise')\n", + "ax2.plot(x_smooth, computing_smooth_scratching, linestyle='-.', color='darkorchid', linewidth=1.5, alpha=0.7, label='Scratching Noise')\n", + "ax2.plot(x_smooth, mean_computing, linestyle='--', color='blue', linewidth=2.5, alpha=1, label='Mean DSP Load')\n", + "ax2.plot([x_max_computing, x_max_computing], [y_max_computing, 0], color='black', linestyle=':', linewidth=2)\n", + "\n", + "ax2.text(x_max_computing, y_max_computing+0.01,\n", + " f'{y_max_computing*100:.1f} \\% mean DSP load at error threshold {x_max_computing:.2f}',\n", + " fontsize=20,\n", + " ha='left')\n", + "\n", + "plt.rcParams.update({\n", + " \"text.usetex\": True,\n", + " \"font.family\": \"serif\",\n", + " 'font.size': 16, # Standardtext\n", + " 'axes.labelsize': 30, # Achsenbeschriftungen\n", + " 'xtick.labelsize': 25, # Tick-Beschriftungen\n", + " 'ytick.labelsize': 25,\n", + " 'legend.fontsize': 25 # Legende\n", + "})\n", + "\n", + "ax1.set_xlabel(\"Error Threshold\")\n", + "ax2.set_xlabel(\"Error Threshold\")\n", + "ax1.set_ylabel(\"Performance Gain\")\n", + "ax2.set_ylabel(\"DSP Load\")\n", + "ax1.grid(True, linestyle='-.', alpha=0.4)\n", + "ax2.grid(True, linestyle='-.', alpha=0.4)\n", + "ax1.set_ylim(0, 1)\n", + "ax2.set_ylim(0, 0.5)\n", + "#Spines auf ganzen Plot anwenden\n", + "ax1.yaxis.set_major_formatter(mtick.PercentFormatter(1.0))\n", + "ax2.yaxis.set_major_formatter(mtick.PercentFormatter(1.0))\n", + "ax1.spines['top'].set_visible(False)\n", + "ax2.spines['top'].set_visible(False)\n", + "ax1.spines['right'].set_visible(False)\n", + "ax2.spines['right'].set_visible(False)\n", + "ax1.legend(frameon=False, loc='upper right')\n", + "ax2.legend(frameon=False, loc='upper right')\n", + "figure1.tight_layout()\n", + "figure2.tight_layout()\n", + "if PLOT == True:\n", + " figure1.savefig(f'plots/fig_snr_error_threshold', dpi=600)\n", + " figure2.savefig(f'plots/fig_snr_error_threshold_computing', dpi=600)\n", + "figure1.show()\n", + "figure2.show()\n" + ] } ], "metadata": { diff --git a/reduced_update.txt b/reduced_update.txt deleted file mode 100644 index 27ac27f..0000000 --- a/reduced_update.txt +++ /dev/null @@ -1,7 +0,0 @@ -1, 9.47, 1, 357, 1, 0.446 -0.75, 8.54, 0.902, 288, 0.807, 0.358 -0.66, 8.16, 0.863, 263, 0.737, 0.328 -0.5, 7.27, 0.768, 218, 0.611, 0.272 -0.33, 6.05, 0.642, 171, 0.479, 0.213 -0.25, 5.21, 0.551, 149, 0.417, 0.186 -0.20, 4.59, 0.478, 135, 0.378, 0.168 \ No newline at end of file diff --git a/threshold_evaluation/error_threshold.xlsx b/threshold_evaluation/error_threshold.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9b556d9d94bb7bd60acb74c8acb724190db65972 GIT binary patch literal 23421 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 literal 0 HcmV?d00001 diff --git a/threshold_evaluation/error_threshold_breathing.csv b/threshold_evaluation/error_threshold_breathing.csv new file mode 100644 index 0000000..b3b1109 --- /dev/null +++ b/threshold_evaluation/error_threshold_breathing.csv @@ -0,0 +1,18 @@ +Threshold;SNR_Gain;%SNR_Gain;Adjustments;%Adjustments;Cycles;%Cycles;DSP_Load +0;9.47;1.000;200000;1.000;357;1.000;0.446 +0.001;9.47;1.000;174704;0.874;322;0.902;0.402 +0.005;9.43;0.996;133980;0.670;265;0.743;0.332 +0.01;9.27;0.979;108728;0.544;230;0.645;0.288 +0.02;8.63;0.911;81434;0.407;192;0.538;0.240 +0.03;7.84;0.828;66027;0.330;171;0.478;0.213 +0.04;7.12;0.752;55964;0.280;157;0.439;0.196 +0.05;6.56;0.693;48488;0.242;146;0.410;0.183 +0.06;6.12;0.646;42814;0.214;139;0.388;0.173 +0.07;5.75;0.607;37829;0.189;132;0.369;0.164 +0.08;5.46;0.577;33634;0.168;126;0.352;0.157 +0.09;5.28;0.558;29944;0.150;121;0.338;0.151 +0.1;5.15;0.544;26675;0.133;116;0.325;0.145 +0.2;4.19;0.442;7867;0.039;90;0.252;0.112 +0.3;2.87;0.303;1852;0.009;82;0.228;0.102 +0.4;1.24;0.131;268;0.001;79;0.222;0.099 +0.5;0.47;0.050;55;0.000;79;0.222;0.099 diff --git a/threshold_evaluation/error_threshold_chewing.csv b/threshold_evaluation/error_threshold_chewing.csv new file mode 100644 index 0000000..6e1ea3d --- /dev/null +++ b/threshold_evaluation/error_threshold_chewing.csv @@ -0,0 +1,18 @@ +Threshold;SNR_Gain;%SNR_Gain;Adjustments;%Adjustments;Cycles;%Cycles;DSP_Load +0;14.73;1.000;200000;1.000;357;1.000;0.446 +0.001;14.73;1.000;165597;0.828;309;0.866;0.386 +0.005;14.71;0.999;122374;0.612;249;0.698;0.311 +0.01;14.66;0.995;99585;0.498;217;0.609;0.272 +0.02;14.54;0.987;77702;0.389;187;0.524;0.234 +0.03;14.42;0.979;64922;0.325;169;0.474;0.212 +0.04;14.28;0.969;55559;0.278;156;0.438;0.195 +0.05;14.16;0.961;48584;0.243;147;0.410;0.183 +0.06;14.04;0.953;42922;0.215;139;0.388;0.173 +0.07;13.89;0.943;38016;0.190;132;0.369;0.165 +0.08;13.7;0.930;33790;0.169;126;0.353;0.157 +0.09;13.53;0.919;30161;0.151;121;0.339;0.151 +0.1;13.33;0.905;26947;0.135;116;0.326;0.146 +0.2;11.21;0.761;7958;0.040;90;0.252;0.113 +0.3;8.5;0.577;1954;0.010;82;0.229;0.102 +0.4;5.62;0.382;333;0.002;79;0.223;0.099 +0.5;2.82;0.191;92;0.000;79;0.222;0.099 diff --git a/threshold_evaluation/error_threshold_coughing.csv b/threshold_evaluation/error_threshold_coughing.csv new file mode 100644 index 0000000..f69433f --- /dev/null +++ b/threshold_evaluation/error_threshold_coughing.csv @@ -0,0 +1,18 @@ +Threshold;SNR_Gain;%SNR_Gain;Adjustments;%Adjustments;Cycles;%Cycles;DSP_Load +0;16.16;1.000;200000;1.000;357;1.000;0.446 +0.001;16.16;1.000;162975;0.815;306;0.856;0.382 +0.005;16.15;0.999;115499;0.577;240;0.671;0.299 +0.01;16.14;0.999;98322;0.492;216;0.604;0.270 +0.02;16.13;0.998;80002;0.400;190;0.533;0.238 +0.03;16.09;0.996;67510;0.338;173;0.484;0.216 +0.04;16.05;0.993;58126;0.291;160;0.448;0.200 +0.05;15.98;0.989;50618;0.253;149;0.418;0.187 +0.06;15.9;0.984;44366;0.222;141;0.394;0.176 +0.07;15.83;0.980;39322;0.197;134;0.374;0.167 +0.08;15.72;0.973;34938;0.175;128;0.357;0.159 +0.09;15.66;0.969;31110;0.156;122;0.342;0.153 +0.1;15.54;0.962;27649;0.138;117;0.329;0.147 +0.2;14.41;0.892;8105;0.041;90;0.253;0.113 +0.3;12.19;0.754;2009;0.010;82;0.229;0.102 +0.4;9.78;0.605;381;0.002;80;0.223;0.099 +0.5;6.37;0.394;118;0.001;79;0.222;0.099 diff --git a/threshold_evaluation/error_threshold_drinking.csv b/threshold_evaluation/error_threshold_drinking.csv new file mode 100644 index 0000000..f047d0d --- /dev/null +++ b/threshold_evaluation/error_threshold_drinking.csv @@ -0,0 +1 @@ +Threshold;SNR_Gain;%SNR_Gain;Adjustments;%Adjustments;Cycles;%Cycles;DSP_Load 0;9.92;1.000;200000;1.000;357;1.000;0.446 0.001;9.92;1.000;159969;0.800;301;0.844;0.377 0.005;9.91;0.999;113708;0.569;237;0.664;0.296 0.01;9.88;0.996;96418;0.482;213;0.597;0.266 0.02;9.78;0.986;76532;0.383;185;0.519;0.232 0.03;9.66;0.974;64201;0.321;168;0.471;0.210 0.04;9.53;0.961;55326;0.277;156;0.437;0.195 0.05;9.39;0.947;48549;0.243;146;0.410;0.183 0.06;9.23;0.930;42848;0.214;139;0.388;0.173 0.07;9.06;0.913;37993;0.190;132;0.369;0.165 0.08;8.89;0.896;33837;0.169;126;0.353;0.158 0.09;8.69;0.876;30152;0.151;121;0.339;0.151 0.1;8.51;0.858;26928;0.135;116;0.326;0.146 0.2;6.44;0.649;7925;0.040;90;0.252;0.113 0.3;4.42;0.446;1851;0.009;82;0.228;0.102 0.4;2.42;0.244;276;0.001;79;0.222;0.099 0.5;0.63;0.064;56;0.000;79;0.222;0.099 diff --git a/threshold_evaluation/error_threshold_scratching.csv b/threshold_evaluation/error_threshold_scratching.csv new file mode 100644 index 0000000..3fdcb4a --- /dev/null +++ b/threshold_evaluation/error_threshold_scratching.csv @@ -0,0 +1,18 @@ +Threshold;SNR_Gain;%SNR_Gain;Adjustments;%Adjustments;Cycles;%Cycles;DSP_Load +0;7.78;1.000;200000;1.000;357;1.000;0.446 +0.001;7.78;1.000;175840;0.879;323;0.906;0.404 +0.005;7.75;0.996;128988;0.645;258;0.724;0.323 +0.01;7.66;0.985;104311;0.522;224;0.627;0.280 +0.02;7.44;0.956;79884;0.399;190;0.532;0.238 +0.03;7.2;0.925;65731;0.329;170;0.477;0.213 +0.04;6.98;0.897;56297;0.281;157;0.440;0.197 +0.05;6.77;0.870;48985;0.245;147;0.412;0.184 +0.06;6.61;0.850;43085;0.215;139;0.389;0.174 +0.07;6.44;0.828;38061;0.190;132;0.369;0.165 +0.08;6.29;0.808;33901;0.170;126;0.353;0.158 +0.09;6.1;0.784;30072;0.150;121;0.338;0.151 +0.1;5.95;0.765;26803;0.134;116;0.326;0.145 +0.2;4.78;0.614;7910;0.040;90;0.252;0.112 +0.3;3.61;0.464;1837;0.009;82;0.228;0.102 +0.4;2.16;0.278;270;0.001;79;0.222;0.099 +0.5;0.71;0.091;48;0.000;79;0.221;0.099 diff --git a/update_rate_evaluation/update_rate.xlsx b/update_rate_evaluation/update_rate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cffa4049daf611ce34e817e1dc2853dc52d9c5a9 GIT binary patch literal 16684 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 SzeFD*0ONh5|Bd_Cr~e0|8%AaT literal 0 HcmV?d00001 diff --git a/update_rate_evaluation/update_rate_breathing.csv b/update_rate_evaluation/update_rate_breathing.csv new file mode 100644 index 0000000..0e352b5 --- /dev/null +++ b/update_rate_evaluation/update_rate_breathing.csv @@ -0,0 +1,8 @@ +Update_Rate;SNR_Gain;%SNR_Gain;Cycles;%Cycles;%DSP_Load +1;9.47;1;357;1;0.446 +0.75;8.54;0.902;288;0.805;0.359 +0.66;8.16;0.862;262;0.735;0.328 +0.5;7.27;0.768;218;0.611;0.273 +0.33;6.05;0.639;171;0.478;0.213 +0.25;5.21;0.550;149;0.416;0.186 +0.2;4.59;0.485;135;0.377;0.168 diff --git a/update_rate_evaluation/update_rate_chewing.csv b/update_rate_evaluation/update_rate_chewing.csv new file mode 100644 index 0000000..0aacc54 --- /dev/null +++ b/update_rate_evaluation/update_rate_chewing.csv @@ -0,0 +1,8 @@ +Update_Rate;SNR_Gain;%SNR_Gain;Cycles;%Cycles;%DSP_Load +1;14.73;1;357;1;0.446 +0.75;14;0.950;288;0.805;0.359 +0.66;13.63;0.925;262;0.735;0.328 +0.5;12.78;0.868;218;0.611;0.273 +0.33;11.35;0.771;171;0.478;0.213 +0.25;10.13;0.688;149;0.416;0.186 +0.2;9.22;0.626;135;0.377;0.168 diff --git a/update_rate_evaluation/update_rate_coughing.csv b/update_rate_evaluation/update_rate_coughing.csv new file mode 100644 index 0000000..eb63b6f --- /dev/null +++ b/update_rate_evaluation/update_rate_coughing.csv @@ -0,0 +1,8 @@ +Update_Rate;SNR_Gain;%SNR_Gain;Cycles;%Cycles;%DSP_Load +1;16.16;1;357;1;0.446 +0.75;15.86;0.981;288;0.805;0.359 +0.66;15.72;0.973;262;0.735;0.328 +0.5;15.35;0.950;218;0.611;0.273 +0.33;14.58;0.902;171;0.478;0.213 +0.25;13.8;0.854;149;0.416;0.186 +0.2;13.07;0.809;135;0.377;0.168 diff --git a/update_rate_evaluation/update_rate_drinking.csv b/update_rate_evaluation/update_rate_drinking.csv new file mode 100644 index 0000000..38d4262 --- /dev/null +++ b/update_rate_evaluation/update_rate_drinking.csv @@ -0,0 +1,8 @@ +Update_Rate;SNR_Gain;%SNR_Gain;Cycles;%Cycles;%DSP_Load +1;9.92;1;357;1;0.446 +0.75;8.91;0.898;288;0.805;0.359 +0.66;8.51;0.858;262;0.735;0.328 +0.5;7.54;0.760;218;0.611;0.273 +0.33;6.13;0.618;171;0.478;0.213 +0.25;5.3;0.534;149;0.416;0.186 +0.2;4.63;0.467;135;0.377;0.168 diff --git a/update_rate_evaluation/update_rate_scratching.csv b/update_rate_evaluation/update_rate_scratching.csv new file mode 100644 index 0000000..4ef440e --- /dev/null +++ b/update_rate_evaluation/update_rate_scratching.csv @@ -0,0 +1,8 @@ +Update_Rate;SNR_Gain;%SNR_Gain;Cycles;%Cycles;%DSP_Load +1;7.78;1;357;1;0.446 +0.75;7.12;0.915;288;0.805;0.359 +0.66;6.83;0.878;262;0.735;0.328 +0.5;6.25;0.803;218;0.611;0.273 +0.33;5.48;0.704;171;0.478;0.213 +0.25;5.09;0.654;149;0.416;0.186 +0.2;4.46;0.573;135;0.377;0.168