diff --git a/simulation/test/Makefile b/simulation/test/Makefile new file mode 100644 index 0000000..7d63d5d --- /dev/null +++ b/simulation/test/Makefile @@ -0,0 +1,21 @@ +build_dir:=./build +sources:= test.c ../signalProcessing/signal_path.c + +#compile_cmd:=clang-17 -std=c2x -g -lm +compile_cmd_append:=-lm +compile_cmd_opt?=-g +compile_cmd:=gcc $(compile_cmd_opt) + +#extra_defines:= -DDEBUG_PRINTS +pre_build_cmd:=mkdir -p $(build_dir) + + +$(build_dir)/cSensor_processing_single: $(sources) + $(pre_build_cmd) + $(compile_cmd) $(sources) -o $(build_dir)/cSensor_processing_single $(extra_defines) -DPLATFORM_GENERIC -DBLOCK_LEN=1 -DMAX_FIR_COEFFS=128 $(compile_cmd_append) +$(build_dir)/cSensor_processing_block: $(sources) + $(pre_build_cmd) + $(compile_cmd) $(sources) -o $(build_dir)/cSensor_processing_block $(extra_defines) -DPLATFORM_GENERIC -DBLOCK_LEN=2 -DMAX_FIR_COEFFS=128 $(compile_cmd_append) + +clean: + rm -f $(build_dir)/cSensor_processing_single $(build_dir)/cSensor_processing_block diff --git a/simulation/test/helper.py b/simulation/test/helper.py new file mode 100644 index 0000000..c79d70c --- /dev/null +++ b/simulation/test/helper.py @@ -0,0 +1,124 @@ +import numpy as np +import matplotlib.pyplot as plt +from scipy import signal +import pandas as pd + +def get_psd(data, fs, bin_width): + f, psd = signal.welch(data, + fs=fs, + nperseg=fs/bin_width, + window='hann', + axis=0 + ) + + return f[1:], psd[1:] #drop the first value because it makes the plots look bad and is effectively 0 + + +def setup_timeplot(figsize=(11, 6), plot_coeffs=False): + global plot1, line1, plot2, line2, plot3, line3, plot4 + # time domain plot + cols = 1 + rows = 4 + plt.figure(0, figsize=figsize) + plt.clf() + + plot1 = plt.subplot2grid( (rows, cols), (0,0), 1) + line1 = plot1.plot([0], label="mic") + plt.legend() + plot2 = plt.subplot2grid((rows,cols),(1,0), sharex=plot1) + line2 = plot2.plot([0], label="acc") + plt.legend() + plot3 = plt.subplot2grid((rows, cols), (2,0), sharex=plot1) + line3 = plot3.plot([0], label="out") + plt.legend() + + if plot_coeffs: + plot4 = plt.subplot2grid( (rows, cols), (3,0), sharex=plot1, rowspan=3) + plt.legend(loc='upper right') + + plt.xlabel("sample") + plt.tight_layout() + plt.show() + + +def setup_freqplot(figsize=(11, 6)): + global plot_freq, line_freq1, line_freq2, line_freq3 + cols = 1 + rows = 1 + # frequency domain plot + plt.figure(1, figsize=figsize) + plt.clf() + plt.title("Power spectrum") + plot_freq = plt.subplot2grid( (rows, cols), (0,0), 1) + line_freq1 = plot_freq.loglog([0], label="mic") + line_freq2 = plot_freq.loglog([0], label="acc") + line_freq3 = plot_freq.loglog([0], label="out") + plt.xlabel("frequency / Hz") + plt.ylabel("dB²/Hz") + plt.legend() + plt.tight_layout() + plt.show() + + +def plot_freqdomain(fs, ch1, ch2, output): + + x_min = [] + x_max = [] + y_min = [] + y_max = [] + + f, psd = get_psd(ch1, fs, 10) + x_min.append(min(f)) + x_max.append(max(f)) + y_min.append(min(psd)) + y_max.append(max(psd)) + line_freq1[0].set_data(f, psd) + + f, psd = get_psd(ch2, fs, 10) + x_min.append(min(f)) + x_max.append(max(f)) + y_min.append(min(psd)) + y_max.append(max(psd)) + line_freq2[0].set_data(f, psd) + + f, psd = get_psd(output, fs, 10) + x_min.append(min(f)) + x_max.append(max(f)) + y_min.append(min(psd)) + y_max.append(max(psd)) + line_freq3[0].set_data(f, psd) + + plot_freq.set_xlim(min(x_min), max(x_max)) + plot_freq.set_ylim(min(y_min), max(y_max)) + + +def plot_timedomain(ch1, ch2, output, coeffs: pd.DataFrame =None): + #Plot the result + data= output + line3[0].set_data(range(len(data)), data) + plot3.set_xlim(0, len(data)) + plot3.set_ylim(np.min(data), np.max(data)) + + # plot the chirp with noise + data = ch1 + line1[0].set_data(range(len(data)), data) + plot1.set_xlim(0, len(data)) + plot1.set_ylim(min(data), max(data)) + + # Plot the noise + data = ch2 + line2[0].set_data(range(len(data)), data) + plot2.set_xlim(0, len(data)) + plot2.set_ylim(min(data), max(data)) + + # Plot the coeffs + if coeffs is not None: + data = coeffs + coeffs.plot(ax=plot4) + #plot4.legend(bbox_to_anchor=(1.2, 1.05)) + + #line4 = plot4.plot([0], label="coeffs") + #line4[0].set_data(range(len(data)), data) + + #plot4.set_xlim(0, len(data)) + #plot4.set_ylim(min(data), max(data)) \ No newline at end of file diff --git a/simulation/test/plot_sim_out.ipynb b/simulation/test/plot_sim_out.ipynb new file mode 100644 index 0000000..ee10e7d --- /dev/null +++ b/simulation/test/plot_sim_out.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "717b91ed74cd4828a590a3cf043b894c", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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tdeirKxslz4bNmyIIUOGxO233x7/9E//FBERL774Yhx55JFRW1sbxx133NsTyWTil7/85T6HJE1NTVFcXBwbNmyIoqKifZsgAAAA0C3s7/f8Tr3CpLa2NkpKSnJhSUREZWVl5OXlRV1dXZt9li5dGjt27IjKysrctjFjxsSIESOitra2Ve2MGTNi8ODBMWHChPiv//qv6MQsCAAAAOhBenXmyerr62Po0KGtB9CrVwwcODDq6+t326egoCBKSkpabS8tLW3V55prrolPfvKT0a9fv/jtb38b559/fmzatCkuvPDCNo+7bdu22LZtW+51U1PTPs4KAAAA6GnaJTCZNWtWXHfddXusWbFiRXucareuuuqq3N8/+tGPxubNm+OGG27YbWAyb968uPrqqzt0TAAAAMCBqV0Ck0suuSTOO++8PdYcfvjhkc1mY926da22//Wvf40333wzstlsm/2y2Wxs3749GhsbW11l0tDQsNs+ERHl5eVx7bXXxrZt26KwsHCX/bNnz46ZM2fmXjc1NcXw4cP3OAcAAADg/aFdApMhQ4bEkCFD3rWuoqIiGhsbY+nSpTF+/PiIiFiyZEm0tLREeXl5m33Gjx8fvXv3jpqamjjttNMiImLlypWxevXqqKio2O25li9fHgcffHCbYUlERGFh4W73AQAAAO9vnXoPkyOPPDJOOumk+PznPx8LFiyIHTt2xJe//OU488wzc0/I+dOf/hSTJk2K2267LSZMmBDFxcUxbdq0mDlzZgwcODCKioriggsuiIqKitwTcu65555oaGiI4447Lvr06ROLFy+Ob37zm3HppZe+57HtvEGse5kAAADAgW/n9/t9fiBM0snWr1+fVFdXJwMGDEiKioqSqVOnJhs3bsztX7VqVRIRyQMPPJDb9tZbbyXnn39+cvDBByf9+vVLTjnllOT111/P7f/1r3+djBs3LhkwYEDSv3//5JhjjkkWLFiQNDc3v+dxrVmzJokITdM0TdM0TdM0TdN6UFuzZs0+5ReZJPHs3YiIlpaWWLt2bRx00EGRyWS6ejh0Yzvvd7NmzZp9epY3dHfWOD2dNU5PZ43T01njvFdJksTGjRujrKws8vLy9rp/p/4kpzvLy8uLQw89tKuHwQGkqKjIBzQ9mjVOT2eN09NZ4/R01jjvRXFx8T733fuIBQAAAKCHE5gAAAAApAhMYC8VFhbG3LlzPZaaHssap6ezxunprHF6OmuczuKmrwAAAAAprjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITSHnzzTfjrLPOiqKioigpKYlp06bFpk2b9thn69atMWPGjBg0aFAMGDAgTjvttGhoaGizdv369XHooYdGJpOJxsbGDpgB7FlHrPGnn346qqurY/jw4dG3b9848sgj46abburoqUDO9773vTjssMOiT58+UV5eHk888cQe6xcuXBhjxoyJPn36xNixY+P+++9vtT9JkpgzZ04MGzYs+vbtG5WVlfHSSy915BRgj9pzje/YsSO+9rWvxdixY6N///5RVlYW5557bqxdu7ajpwG71d6f4+/0xS9+MTKZTMyfP7+dR01PJzCBlLPOOiuef/75WLx4cdx7773x8MMPx/Tp0/fY5+KLL4577rknFi5cGA899FCsXbs2Tj311DZrp02bFkcffXRHDB3ek45Y40uXLo2hQ4fGT3/603j++efjiiuuiNmzZ8fNN9/c0dOBuPPOO2PmzJkxd+7cWLZsWRxzzDFRVVUV69ata7P+sccei+rq6pg2bVr84Q9/iMmTJ8fkyZPjueeey9Vcf/318Z3vfCcWLFgQdXV10b9//6iqqoqtW7d21rQgp73X+JYtW2LZsmVx1VVXxbJly+K///u/Y+XKlfHZz362M6cFOR3xOb7TL3/5y3j88cejrKyso6dBT5QAOS+88EISEcmTTz6Z2/brX/86yWQyyZ/+9Kc2+zQ2Nia9e/dOFi5cmNu2YsWKJCKS2traVrXf//73k4kTJyY1NTVJRCR/+ctfOmQesDsdvcbf6fzzz09OOOGE9hs87MaECROSGTNm5F43NzcnZWVlybx589qsP/3005OTTz651bby8vLkC1/4QpIkSdLS0pJks9nkhhtuyO1vbGxMCgsLk5/97GcdMAPYs/Ze42154oknkohI/vjHP7bPoGEvdNQaf+2115JDDjkkee6555KRI0cm//7v/97uY6dnc4UJvENtbW2UlJTEsccem9tWWVkZeXl5UVdX12afpUuXxo4dO6KysjK3bcyYMTFixIiora3NbXvhhRfimmuuidtuuy3y8vynR9foyDWetmHDhhg4cGD7DR7asH379li6dGmr9ZmXlxeVlZW7XZ+1tbWt6iMiqqqqcvWrVq2K+vr6VjXF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rVvXavtf//rXePPNNyObzbbZL5vNxvbt26OxsbHVVSYNDQ277RMRUV5eHtdee21s27YtCgsLd9k/e/bsmDlzZu51U1NTDB8+fI9zAAAAAN4f2iUwGTJkSAwZMuRd6yoqKqKxsTGWLl0a48ePj4iIJUuWREtLS5SXl7fZZ/z48dG7d++oqamJ0047LSIiVq5cGatXr46Kiordnmv58uVx8MEHtxmWREQUFhbudh8AAADw/tap9zA58sgj46STTorPf/7zsWDBgtixY0d8+ctfjjPPPDP3hJw//elPMWnSpLjttttiwoQJUVxcHNOmTYuZM2fGwIEDo6ioKC644IKoqKjIPSHnnnvuiYaGhjjuuOOiT58+sXjx4vjmN78Zl1566Xse284bxLqXCQAAABz4dn6/3+cHwiSdbP369Ul1dXUyYMCApKioKJk6dWqycePG3P5Vq1YlEZE88MADuW1vvfVWcv755ycHH3xw0q9fv+SUU05JXn/99dz+X//618m4ceOSAQMGJP3790+OOeaYZMGCBUlzc/N7HteaNWuSiNA0TdM0TdM0TdM0rQe1NWvW7FN+kUkSz96NiGhpaYm1a9fGQQcdFJlMpquHQze28343a9as2adneUN3Z43T01nj9HTWOD2dNc57lSRJbNy4McrKyiIvL2+v+3fqT3K6s7y8vDj00EO7ehgcQIqKinxA06NZ4/R01jg9nTVOT2eN814UFxfvc9+9j1gAAAAAejiBCQAAAECKwAT2UmFhYcydO9djqemxrHF6Omucns4ap6ezxuksbvoKAAAAkOIKEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMIGUN998M84666woKiqKkpKSmDZtWmzatGmPfbZu3RozZsyIQYMGxYABA+K0006LhoaGNmvXr18fhx56aGQymWhsbOyAGcCedcQaf/rpp6O6ujqGDx8effv2jSOPPDJuuummjp4K5Hzve9+Lww47LPr06RPl5eXxxBNP7LF+4cKFMWbMmOjTp0+MHTs27r///lb7kySJOXPmxLBhw6Jv375RWVkZL730UkdOAfaoPdf4jh074mtf+1qMHTs2+vfvH2VlZXHuuefG2rVrO3oasFvt/Tn+Tl/84hcjk8nE/Pnz23nU9HQCE0g566yz4vnnn4/FixfHvffeGw8//HBMnz59j30uvvjiuOee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", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure 0\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib widget\n", + "\n", + "import numpy as np\n", + "\n", + "from helper import setup_timeplot, plot_timedomain\n", + "\n", + "\n", + "c_sensor = np.genfromtxt(\"./testdata/input/chirp_disturber.txt\", dtype=int)\n", + "acc_sensor = np.genfromtxt(\"./testdata/input/disturber.txt\", dtype=int)\n", + "out = np.genfromtxt(\"./testdata/output/out_simulated.txt\", dtype=int)\n", + "\n", + "setup_timeplot()\n", + "plot_timedomain(c_sensor, acc_sensor, out)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "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.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/simulation/test/test.c b/simulation/test/test.c new file mode 100644 index 0000000..7123daa --- /dev/null +++ b/simulation/test/test.c @@ -0,0 +1,114 @@ +/*Test enviornment for testing of the signal path on a generic platform (pc)*/ +#include +#include "../signalProcessing/include/signal_path.h" + +int main(int argc, char* argv[]){ + + /*Some environment related prints*/ + #ifdef DEBUG_PRINTS + printf("The size of int in bytes is: %lu\n", sizeof(int)); + printf("The size of accum_t in bytes is: %lu\n", sizeof(accum_t)); + #endif + + static SingleSignalPath cSensorSignal; + static SingleSignalPath accSensorSignal; + //static LmsFilter lms; + //int lms_fir_coeffs[MAX_FIR_COEFFS]; + + static int16_t cSensor[BLOCK_LEN], accSensor[BLOCK_LEN]; + static int16_t output_port[BLOCK_LEN]; + + // Deactivate preemphasis filter by initializing with coefficients {1., 0., 0., 0., 0.} + // can not be modeled on a generic platform (pc) + // biquad filter coefficients - off + double b0[5]={1., 0., 0., 0., 0.}; + double b1[5]={1., 0., 0., 0., 0.}; + int N_lms_fir_coeffs = MAX_FIR_COEFFS; + // get parameters from command line + OutputMode mode = (OutputMode) (*argv[1] - '0'); // Convert char to int (only works for single digits) + int pipe_input = (*argv[2] - '0'); + int return_coeffs = (*argv[3] - '0'); + + init( + &cSensorSignal, &accSensorSignal, + //&lms, lms_fir_coeffs, + b0, + b1, + 0, // sample delay + 0, + 1., // weight + 1., + 0.005, // lms learning rate + N_lms_fir_coeffs // Numer of lms fir coefficients + ); + + if (mode == OUTPUT_MODE_FIR){ //FIR filter mit fixen coeffizienten + for (int i=0; i 4\u001b[0m \u001b[38;5;28;43mcompile\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mtarget\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbuild_target\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 6\u001b[0m \u001b[38;5;66;03m# select the desired data\u001b[39;00m\n\u001b[0;32m 7\u001b[0m use_chirp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "Cell \u001b[1;32mIn[2], line 76\u001b[0m, in \u001b[0;36mcompile\u001b[1;34m(target)\u001b[0m\n\u001b[0;32m 73\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcompile\u001b[39m(target\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m./build/cSensor_processing_single\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[0;32m 74\u001b[0m \u001b[38;5;66;03m# Build\u001b[39;00m\n\u001b[0;32m 75\u001b[0m ret \u001b[38;5;241m=\u001b[39m subprocess\u001b[38;5;241m.\u001b[39mcall([\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmake\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m-B\u001b[39m\u001b[38;5;124m'\u001b[39m, target])\u001b[38;5;66;03m# , \"compile_cmd_opt=-O2\"\u001b[39;00m\n\u001b[1;32m---> 76\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m ret \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbuild failed\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "\u001b[1;31mAssertionError\u001b[0m: build failed" + ] + } + ], + "source": [ + "\n", + "build_target='./build/cSensor_processing_single'\n", + "output_mode = OutputMode.OUTPUT_MODE_FIR.value\n", + "\n", + "compile(target=build_target)\n", + "\n", + "# select the desired data\n", + "use_chirp = True\n", + "plot_coeffs=True\n", + "if use_chirp: # Rather trivial input data in form of a chirp with sine as a disturber\n", + " cSensor= y_signal_disturber\n", + " accSensor= y_sine\n", + " df=pipe_input_output(cSensor, accSensor, target=build_target, output_mode=output_mode)\n", + " setup_timeplot(plot_coeffs=plot_coeffs)\n", + " #setup_freqplot()\n", + " if plot_coeffs:\n", + " coeffs=df.iloc[:, 1:]\n", + " else: \n", + " coeffs=None\n", + " plot_timedomain(cSensor, accSensor, df[\"out\"], coeffs=coeffs)\n", + " #plot_freqdomain(fs_chirp, cSensor, accSensor, output)\n", + "else:\n", + " single_file=False\n", + "\n", + " input_dir=\"./testdata/input\"\n", + " output_dir=\"./testdata/output\"\n", + " os.makedirs(output_dir, exist_ok=True)\n", + "\n", + " if single_file:\n", + " file = \"breathing_peak_016g_external_Speaker_80dBSPL_PDM.wav\"\n", + " #file = \".1kHz_peak_1g_external_Speaker_0dBSPL_PDM.wav\" \n", + " load_process_save(file, build_target, output_mode)\n", + "\n", + " else:# all files\n", + " wav_files = [file for file in os.listdir(input_dir) if file.endswith(\".wav\")]\n", + " # process files in parallel \n", + " def calc(file):\n", + " load_process_save(file, build_target, output_mode)\n", + "\n", + " num_processes = int(multiprocessing.cpu_count()/2)\n", + " pool = multiprocessing.Pool(processes=num_processes)\n", + "\n", + " pool.map(calc, wav_files)\n", + " pool.close()\n", + " pool.join()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plot the generated data" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dfbccdb3271643b0ba9bdb1b86fbff5b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Dropdown(description='Select a file:', options=('1kHz_peak_1g_external_Speaker_0dBSPL_PDM.wav', 'breathing_pea…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "691f1f6e69f947b2a5ef5d241bfcc18e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Checkbox(value=True, description='Is APx data')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "08efe8e78f6d4fe58304828923f3704c", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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65MkSZIzzzwzmTFjRq7+4YcfTnr06JF897vfTZ5//vlk9uzZSc+ePZOnn346V/Od73wnKSkpSX73u98lTz31VPKlL30pGTFiRPLWW291+vygvdf41q1bky9+8YvJgQcemCxdurTV+/aWLVu6ZI58uHXE+3iap+SwJwQmkLJ27dqkuro66devX1JUVJRMnjw5Wb9+fW7/8uXLk4hI7rvvvty2t956KznnnHOS/fffP+nTp09y4oknJqtXr97pOQQmdKWOWOOzZ89OImKHNnz48E6cGR9m3//+95Nhw4YlBQUFybhx45JHH300t2/8+PHJpEmTWtX/6le/Sj72sY8lBQUFySc+8Ynk7rvvbrW/paUlufLKK5PS0tKksLAwmTBhQrJs2bLOmAq0qT3X+Pb3+bbau9/7oTO19/t4msCEPZFJkv+9mQIAAAAAEeEeJgAAAAA7EJgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMAEAAABIEZgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKT26egD7ipaWlli1alXst99+kclkuno4AAAAwF5IkiTWr18fZWVlkZe3B9eLJF3kpptuSoYPH54UFhYm48aNS+rq6nZZ/6tf/So55JBDksLCwuSwww5L7r777lb7J02alEREq1ZVVfW+x7Ny5cod+muapmmapmmapmma9sFuK1eu3KPcokuuMLn99ttj+vTpMW/evCgvL4+5c+dGVVVVLFu2LAYPHrxD/SOPPBLV1dUxZ86c+MIXvhC33nprTJw4MZYsWRKHHXZYru64446Ln/3sZ7m/CwsL3/eY9ttvv4iIWLlyZRQVFe3F7AAAAICu1tTUFEOHDs193t9dmSRJknYe03sqLy+PT33qU3HTTTdFxDtfhxk6dGicd955MWPGjB3qTz311Ni4cWPcdddduW1HHXVUjBkzJubNmxcREWeffXY0NjbGHXfcsUdjampqiuLi4li3bp3ABAAAAD7g9vZzfqff9HXr1q2xePHiqKys/Nsg8vKisrIyamtr2+xTW1vbqj4ioqqqaof6+++/PwYPHhyHHHJIfO1rX4u1a9fudBxbtmyJpqamVg0AAAAgogsCkzfeeCOam5ujtLS01fbS0tKor69vs099ff171h933HFxyy23RE1NTVx77bXxwAMPxOc///lobm5u85hz5syJ4uLiXBs6dOhezgwAAADoLrrNU3JOO+203O+jR4+Oww8/PD7ykY/E/fffHxMmTNihfubMmTF9+vTc39u/2wQAAADQ6YHJwIEDIz8/PxoaGlptb2hoiGw222afbDa7W/UREQcffHAMHDgwXnrppTYDk8LCwt26KSwAAAB0hebm5ti2bVtXD2Of07Nnz8jPz++w43d6YFJQUBBjx46NmpqamDhxYkS8c9PXmpqaOPfcc9vsU1FRETU1NXHBBRfkti1cuDAqKip2ep7XXnst1q5dG0OGDGnP4QMAAECnSJIk6uvro7GxsauHss8qKSmJbDYbmUym3Y/dJV/JmT59ekyaNCmOPPLIGDduXMydOzc2btwYkydPjoiIs846Kw444ICYM2dORER8/etfj/Hjx8cNN9wQJ5xwQtx2223xxBNPxI9//OOIiNiwYUNcddVVcfLJJ0c2m42XX345Lr300vjoRz8aVVVVXTFFAAAA2Cvbw5LBgwdHnz59OiQU+KBKkiQ2bdoUa9asiYjokIsluiQwOfXUU+P111+PWbNmRX19fYwZMyYWLFiQu7HrihUrIi/vb/ejPfroo+PWW2+NK664Ii677LIYOXJk3HHHHXHYYYdFRER+fn489dRT8fOf/zwaGxujrKwsjj322Ljmmmt87QYAAIAPnObm5lxYMmDAgK4ezj6pd+/eERGxZs2aGDx4cLt/PSeTJEnSrkf8gNrb5zMDAABAe9m8eXMsX748DjrooFwwwI7eeuuteOWVV2LEiBHRq1evVvv29nN+pz9WGAAAAHh/fA1n1zry9RGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAoF0tWLAgPvOZz0RJSUkMGDAgvvCFL8TLL7+c2//aa69FdXV19O/fP/r27RtHHnlk1NXV5fbfeeed8alPfSp69eoVAwcOjBNPPLHT59AljxUGAAAAdk+SJPHWtuYu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8YiIZ599No455piYNGlS/Ou//mvHTRbepaCgIMaOHdtqfba0tERNTU2r9fluFRUVreojIhYuXJirHzFiRGSz2VY1TU1NUVdXt9NjQkfpiDUe8bew5MUXX4w//vGPMWDAgI6ZALyHjljjZ555Zjz11FO5f3svXbo0ysrK4pJLLonf//73HTcZup+uvuss7GuOO+645JOf/GRSV1eXPPTQQ8nIkSOT6urq3P7XXnstOeSQQ5K6urrctq9+9avJsGHDkkWLFiVPPPFEUlFRkVRUVOz0HPfdd5+n5NBlOmKNP/3008mgQYOSM844I1m9enWurVmzplPnxofTbbfdlhQWFiY333xz8txzzyVTp05NSkpKkvr6+iRJkuTMM89MZsyYkat/+OGHkx49eiTf/e53k+effz6ZPXt20rNnz+Tpp5/O1XznO99JSkpKkt/97nfJU089lXzpS19KRowYkbz11ludPj9o7zW+devW5Itf/GJy4IEHJkuXLm31vr1ly5YumSMfbh3xPp7mKTnsCYEJpKxduzaprq5O+vXrlxQVFSWTJ09O1q9fn9u/fPnyJCKS++67L7ftrbfeSs4555xk//33T/r06ZOceOKJyerVq3d6DoEJXakj1vjs2bOTiNihDR8+vBNnxofZ97///WTYsGFJQUFBMm7cuOTRRx/N7Rs/fnwyadKkVvW/+tWvko997GNJQUFB8olPfCK5++67W+1vaWlJrrzyyqS0tDQpLCxMJkyYkCxbtqwzpgJtas81vv19vq327vd+6Ezt/T6eJjBhT2SS5H9vpgAAAABARLiHCQAAAMAOBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMAEAAABIEZgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABASo+uHsC+oqWlJVatWhX77bdfZDKZrh4OAAAAsBeSJIn169dHWVlZ5OXtwfUi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AAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAC8D2effXZMnDixq4cBAHQSgQkAAABAisAEAAAAIEVgAgDsc37961/H6NGjo3fv3jFgwICorKyMjRs3xuOPPx5///d/HwMHDozi4uIYP358LFmypFXfTCYT//7v/x5f+MIXok+fPnHooYdGbW1tvPTSS/HZz342+vbtG0cffXS8/PLLuT7f/OY3Y8yYMfHv//7vMXTo0OjTp0+ccsopsW7dup2OsaWlJebMmRMjRoyI3r17xxFHHBG//vWvO+w1AQA6l8AEANinrF69Oqqrq+Nf/uVf4vnnn4/7778/TjrppEiSJNavXx+TJk2Khx56KB599NEYOXJkHH/88bF+/fpWx7jmmmvirLPOiqVLl8aoUaPin//5n+MrX/lKzJw5M5544olIkiTOPffcVn1eeuml+NWvfhV33nlnLFiwIP785z/HOeecs9NxzpkzJ2655ZaYN29ePPvss3HhhRfGGWecEQ888ECHvC4AQOfKJEmSdPUgAAC2W7JkSYwdOzZeeeWVGD58+C5rW1paoqSkJG699db4whe+EBHvXGFyxRVXxDXXXBMREY8++mhUVFTEf/zHf8S//Mu/RETEbbfdFpMnT4633norIt65wuRb3/pWvPrqq3HAAQdERMSCBQvihBNOiL/85S+RzWbj7LPPjsbGxrjjjjtiy5Yt0b9///jjH/8YFRUVufH83//7f2PTpk1x6623tvvrAgB0LleYAAD7lCOOOCImTJgQo0ePjn/6p3+Kn/zkJ/HXv/41IiIaGhriy1/+cowcOTKKi4ujqKgoNmzYECtWrGh1jMMPPzz3e2lpaUREjB49utW2zZs3R1NTU27bsGHDcmFJRERFRUW0tLTEsmXLdhjjSy+9FJs2bYq///u/j379+uXaLbfc0uqrPgDAB1ePrh4AAMC75efnx8KFC+ORRx6JP/zhD/H9738/Lr/88qirq4uvfe1rsXbt2rjxxhtj+PDhUVhYGBUVFbF169ZWx+jZs2fu90wms9NtLS0tezTGDRs2RETE3Xff3SpkiYgoLCzco2MCAPsWgQkAsM/JZDLx6U9/Oj796U/HrFmzYvjw4fHb3/42Hn744fjhD38Yxx9/fERErFy5Mt544412OeeKFSti1apVUVZWFhHvfJUnLy8vDjnkkB1qP/7xj0dhYWGsWLEixo8f3y7nBwD2LQITAGCfUldXFzU1NXHsscfG4MGDo66uLl5//fU49NBDY+TIkfH//t//iyOPPDKamprikksuid69e7fLeXv16hWTJk2K7373u9HU1BTnn39+nHLKKZHNZneo3W+//eLiiy+OCy+8MFpaWuIzn/lMrFu3Lh5++OEoKiqKSZMmtcuYAICuIzABAPYpRUVF8eCDD8bcuXOjqakphg8fHjfccEN8/vOfj2w2G1OnTo2/+7u/i6FDh8a3v/3tuPjii9vlvB/96EfjpJNOiuOPPz7efPPN+MIXvhA//OEPd1p/zTXXxKBBg2LOnDnxP//zP1FSUhJ/93d/F5dddlm7jAcA6FqekgMAfOh985vfjDvuuCOWLl3a1UMBAPYRnpIDAAAAkCIwAQAAAEjxlRwAAACAFFeYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMAEAAABIEZgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMAEAAABIEZgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMAEAAABIEZgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMAEAAABIEZgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEgRmAAAAACkCEwAAAAAUgQmAAAAACkCEwAAAIAUgQkAAABAisAEAAAAIEVgAgAAAJAiMAEAAABIEZgAAAAApAhMAAAAAFIEJgAAAAApAhMAAACAFIEJAAAAQIrABAAAACBFYAIAAACQIjABAAAASBGYAAAAAKQITAAAAABSBCYAAAAAKQITAAAAgBSBCQAAAECKwAQAAAAgRWACAAAAkCIwAQAAAEj5/9yXFh/rTIedAAAAAElFTkSuQmCC", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure 0\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3134babcf04744a69ef011569cf3c3a3", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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cbnrrrs2uxEsAAAAwLvRLYPJpEmTNvtaodLnP//5fP7zn++iiQAAAID3kh53DxMAAACAHU0wAQAAACgIJgAAAAAFwQQAAACgIJgAAAAAneKuu+7Khz/84QwePDi77bZb/uqv/irPPvts2/MvvPBCTjvttAwZMiQDBgzIYYcdlocffrjt+Z///OeZMGFC+vfvn6FDh2bGjBnVeBtJBBMAAACgkzQ3N2f27Nl55JFHMm/evPTq1SszZsxIS0tL1q5dm6OPPjrLli3L3Llzs3jx4nzpS19KS0tLkuQ///M/M2PGjHzkIx/J448/nnnz5mXixIlVey+V1nf6/t73oKamptTX12fNmjWpq6ur9jgAAAC8h7z++utZsmRJ3ve+96V///5/2tjammxY1/XD9KlNKpV3/eurV6/O7rvvnieeeCK//e1vc8EFF+S5557LkCFDNnvtkUcemfe///35/ve/v8373+Jn9f/p6Ll97+3+DQAAAKBrbViXfHVk1x/3n5cnfQds88v/8Ic/5KKLLsrDDz+c1atXt60eef7557No0aJ88IMf3GIsSZJFixbl7LPP7pSxO4NgAgAAAHSKadOmZa+99soNN9yQkSNHpqWlJQceeGDWr1+fXXbZZau/+07PdzXBBAAAALq7PrV/Wu1RjeNuo//7v//L//7v/+aGG27IUUcdlST5zW9+0/b8wQcfnBtvvDEvv/zyFleZHHzwwZk3b15mzZrV8bk7gWACAAAA3V2lsl2XxlTDrrvumt122y3f+c53MmLEiDz//PP5p3/6p7bnTzvttHz1q1/Nxz72sXzta1/LiBEj8vjjj2fkyJE54ogjcvHFF+e4447L3nvvnb/+67/Oxo0b88tf/jJf/vKXq/J+fEsOAAAA0GG9evXKf/zHf+TRRx/NgQcemH/4h3/IFVdc0fZ83759c/fdd2ePPfbIRz7ykRx00EH5+te/npqamiTJpEmT8uMf/zhz587NuHHjcuyxx2bBggXVeju+JWdLfEsOAAAA1bK1b36hvR35LTlWmLxFY2NjGhoaMmHChGqPAgAAAFSRYPIW55xzTp566qksXLiw2qMAAAAAVSSYAAAAABQEEwAAAICCYAIAAABQEEwAAAAACoIJAAAAQEEwAQAAACgIJgAAAAAFwQQAAACgIJgAAAAA3cIll1yScePGVXuMJIIJAAAAwGYEEwAAAKBTvPHGGznvvPOyxx57pH///vnwhz+chQsXJknmzJmTwYMHt3v97bffnkql0vb8pZdemsWLF6dSqaRSqWTOnDld/A7+f72rdmQAAABgp/KlL30pP/3pT3PLLbdkr732yuWXX54pU6bkmWeeecffPfXUU/Pkk0/mrrvuyj333JMkqa+v39Ejvy3BBAAAALq51tbW/HHjH7v8uLv03qVtBcg7aW5uzrXXXps5c+Zk6tSpSZIbbrghv/71r3PTTTdl99133/qxdtklAwcOTO/evTN8+PAOz95RggkAAAB0c3/c+Mcc/sPDu/y4D5/+cGr71G7Ta5999tls2LAhH/rQh9q29enTJxMnTszvfve7dwwm3Y17mAAAAAA7XK9evdLa2tpu24YNG6o0zTuzwgQAAAC6uV1675KHT3+4KsfdVnvvvXf69u2bBx98MHvttVeSPwWRhQsX5vzzz8/uu++e1157Lc3NzRkwYECSZNGiRe320bdv32zatKnT5u8IwQQAAAC6uUqlss2XxlTLgAED8tnPfjZf/OIXM2TIkOy55565/PLLs27dupx11llpbW1NbW1t/vmf/znnnXdeHn744c2+BWfs2LFZsmRJFi1alNGjR2fQoEHp169fVd6PS3IAAACATvH1r389J598cs4444wceuiheeaZZ/KrX/0qu+66a4YMGZLvf//7+eUvf5mDDjoot956ay655JJ2v3/yySfnhBNOyDHHHJPdd989t956a3XeSJJKa3kBEWlqakp9fX3WrFmTurq6ao8DAADAe8jrr7+eJUuW5H3ve1/69+9f7XG6ta19Vh09t7fCBAAAAKAgmAAAAAAUBBMAAACAgmACAAAAUBBM3qKxsTENDQ2ZMGFCtUcBAAAAqkgweYtzzjknTz31VBYuXFjtUQAAAHiP86W272xHfkaCCQAAAHQjffr0SZKsW7euypN0f29+Rm9+Zp2pd6fvEQAAAHjXampqMnjw4KxatSpJUltbm0qlUuWpupfW1tasW7cuq1atyuDBg1NTU9PpxxBMAAAAoJsZPnx4krRFE7Zs8ODBbZ9VZxNMAAAAoJupVCoZMWJE9thjj2zYsKHa43RLffr02SErS94kmAAAAEA3VVNTs0OjAG/PTV8BAAAACoIJAAAAQEEwAQAAACgIJgAAAAAFwQQAAACgIJgAAAAAFAQTAAAA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AgAAQM/W0XP7HRJM3uqll17K3LlzM3fu3Bx11FG54IILduThOoVgAgAAAD1btwgmzc3NGTBgQJLkueeey9ixYzu6y6oSTAAAAKBn6+i5fYfvYXLeeedlzJgxuf7665Mkp59+ekd3CQAAAFBVvTu6g3nz5mXFihX53Oc+l6FDh3bGTAAAAABV1eFgMmrUqPTt2zfXX399Pvaxj2X58uWdMRcAAABA1XT4kpx99903GzduTE1NTb7zne9k8ODBnTAWAAAAQPXs8G/J6Ync9BUAAAB6to6e23f4kpwtaW5uzm233ZY//vGPOf7447PvvvvuiMMAAAAA7BAdviTn+eefz9FHH51BgwblL//yL/P888/n0EMPzac//emce+65GTduXO6///7OmBUAAACgS3Q4mFxwwQVZv359rrvuutTW1mbKlCnZd9998+KLL2blypWZOnVqLrnkkk4YFQAAAKBrdPgeJsOHD8/cuXMzceLEvPzyyxk6dGgefPDBHHHEEUmSxYsX57jjjsvq1as7ZeCu4B4mAAAA0LN19Ny+wytMVq1alb322itJMmTIkNTW1mbYsGFtzw8fPjyvvPJKRw/TJRobG9PQ0JAJEyZUexQAAACgijocTJKkUqls8b97mnPOOSdPPfVUFi5cWO1RAAAAgCrqlG/Jueiii1JbW5skWb9+ff71X/819fX1SZJ169Z1xiEAAAAAukyH72EyadKkbVpVcu+993bkMF3KPUwAAACgZ+vouX2HV5jMnz+/o7sAAAAA6FY6FExmz569za+96qqrOnIoAAAAgC7ToWDy+OOPt3v82GOPZePGjdlvv/2SJE8//XRqamoyfvz4jhwGAAAAoEt1KJi89b4kV111VQYNGpRbbrklu+66a5LklVdeyaxZs3LUUUd1bEoAAACALtThm76+adSoUbn77rtzwAEHtNv+5JNP5vjjj8/y5cs74zBdwk1fAQAAoGfr6Ll9r84c5KWXXtps+0svvZTXXnutsw4DAAAAsMN1WjCZMWNGZs2alZ/97Gd54YUX8sILL+SnP/1pzjrrrJx00kmddRgAAACAHa7DXyv8puuuuy4XXHBBTj/99GzYsOFPO+/dO2eddVauuOKKzjoMAAAAwA7XafcweVNzc3OeffbZJMnee++dAQMGdObuu4R7mAAAAEDP1tFz+05bYfKmAQMG5OCDD+7s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NmxYzjjjjKxevbptf83NzfnkJz+ZgQMHZsSIEbnyyiszadKknH/++W2vqVQquf3229vNMXjw4MyZM6ft8dKlS/OJT3wigwcPzpAhQ3LiiSfmueeeazf3xz72sXzjG9/IiBEjsttuu+Wcc87Jhg0b2l7zxhtv5Mtf/nLGjBmTfv36ZZ999slNN92U1tbW7LPPPvnGN77RboZFixalUqnkmWeeedvPa+nSpfmf//mfnHDCCdv4CW/ZmWeemUqlstnP/PnzO7RfAGDLBBMAYLt885vfzFe+8pWMHj06L774YhYuXNj23C233JK+ffvmwQcfzHXXXZdXX301xx57bD74wQ/mkUceyV133ZWVK1fmE5/4RNvvfPGLX8x9992XO+64I3fffXfmz5+fxx57bLtm2rBhQ6ZMmZJBgwblgQceyIMPPpiBAwfmhBNOaLfS5d57782zzz6be++9N7fcckvmzJnTLrp88pOfzK233ppvfetb+d3vfpfrr78+AwcOTKVSyac+9al897vfbXfc7373u/mLv/iL7LPPPm8729y5czNp0qTU1dVt13sqffOb38yLL77Y9vOFL3whe+yxR/bff/8O7RcA2LLN188CAGxFfX19Bg0alJqamgwfPrzdc/vuu28uv/zytseXXXZZPvjBD+arX/1q27abb745Y8aMydNPP52RI0fmpptuyve///0cd9xxSf4UXUaPHr1dM912221paWnJjTfemEqlkuRPMWPw4MGZP39+jj/++CTJrrvummuuuSY1NTXZf//989GPfjTz5s3L2Wefnaeffjo/+tGP8utf/zqTJ09Okrz//e9vO8aZZ56Ziy66KAsWLMjEiROzYcOG/PCHP9xs1UnpjjvuyIknnrjV1zzxxBMZOHBgu22tra3tHtfX16e+vj5J8rOf/SzXX3997rnnns3+DACAziGYAACdZvz48e0eL168OPfee+9mMSD5031Q/vjHP2b9+vU5/PDD27YPGTIk++2333Ydd/HixXnmmWcyaNCgdttff/31PPvss22PDzjggNTU1LQ9HjFiRJ544okkf7q8pqamJkcfffQWjzFy5Mh89KMfzc0335yJEyfm5z//ed54442ccsopbztXU1NT7rvvvtx0001bnX+//fbL3Llz221btmxZJk2atNlrH3/88Zxxxhm55ppr8qEPfWir+wUA3j3BBADoNAMGDGj3eO3atZk2bVr+7d/+bbPXjhgxYqv3/nirSqWy2YqLt957ZO3atRk/fnx+8IMfbPa7u+++e9t/9+nTZ7P9trS0JEl22WWXd5zj05/+dM4444z8+7//e7773e/m1FNPTW1t7du+/s4770xDQ0PGjBmz1f327dt3s8t6tnQj3RUrVmT69On59Kc/nbPOOusd5wUA3j3BBADYYQ499ND89Kc/zdixY7cYAPbee+/06dMnDz/8cPbcc88kySuvvJKnn3663UqP3XffPS+++GLb4z/84Q9Zt25du+Pcdttt2WOPPd71vUIOOuigtLS05L777mu7JKf0kY98JAMGDMi1116bu+66K/fff/9W97ktl+Nsq9dffz0nnnhi9t9//1x11VWdsk8A4O256SsAsMOcc845efnll3Paaadl4cKFefbZZ/OrX/0qs2bNyqZNmzJw4MCcddZZ+eIXv5j/+q//ypNPPpkzzzwzvXq1/1+UY489Ntdcc00ef/zxPPLII/n7v//7dqtF/uZv/iZDhw7NiSeemAceeCBLlizJ/Pnzc9555+WFF17YplnHjh2bmTNn5lOf+lRuv/32tn386Ec/antNTU1NzjzzzFx44YXZd999c8QRR7zt/jZu3Jg777yz075O+O/+7u+ydOnSfOtb38pLL72UFStWZMWKFb6+GQB2EMEEANhhRo4cmQcffDCbNm3K8ccfn4MOOijnn39+Bg8e3BZFrrjiihx11FGZNm1aJk+enA9/+MOb3QvlyiuvzJgxY3LUUUfl9NNPzwUXXNDuUpja2trcf//92XPPPXPSSSflAx/4QM4666y8/vrr27Xi5Nprr83HP/7xfO5zn8v++++fs88+O83Nze1ec9ZZZ2X9+vWZNWvWVvd13333ZeDAgTn00EO3+fjvtL8XX3wxDQ0NGTFiRNvPb3/7207ZPwDQXqW1vCAYAKDKJk2alHHjxuXqq6+u9iibeeCBB3Lcccdl6dKlGTZs2Nu+7rzzzsvGjRvz7W9/uwunAwA6i3uYAABsgzfeeCMvvfRSLrnkkpxyyilbjSVJcuCBB271kh0AoHtzSQ4AwDa49dZbs9dee+XVV1/N5Zdf/o6v/8xnPpODDjqoCyYDAHYEl+QAAAAAFKwwAQAAACgIJgAAAAAFwQQAAACgIJgAAAAAFAQTAAAAgIJgAgAAAFAQTAAAAAAKggkAAABAQTABAAAAKAgmAAAAAAXBBAAAAKAgmAAAAAAUBBMAAACAgmACAAAAUPh/3WLpFR8/wNoAAAAASUVORK5CYII=", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure 1\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected file: 1kHz_peak_1g_external_Speaker_0dBSPL_PDM.wav\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected file: breathing_peak_01g_external_Speaker_80dBSPL_PDM.wav\n", + "Selected file: eatCrunchy_peak_05g_external_Speaker_80dBSPL_PDM.wav\n", + "Selected file: ownVoice_shaker0.2g_speaker80dBSPL_PDM.wav\n", + "Selected file: eatCrunchy_peak_2g_clipping_external_Speaker_80dBSPL_PDM.wav\n" + ] + }, + { + "ename": "ValueError", + "evalue": "all input arrays must have the same shape", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:767\u001b[0m, in \u001b[0;36mWidget._handle_msg\u001b[1;34m(self, msg)\u001b[0m\n\u001b[0;32m 765\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data:\n\u001b[0;32m 766\u001b[0m _put_buffers(state, data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m], msg[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffers\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m--> 767\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_state\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 769\u001b[0m \u001b[38;5;66;03m# Handle a state request.\u001b[39;00m\n\u001b[0;32m 770\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrequest_state\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:644\u001b[0m, in \u001b[0;36mWidget.set_state\u001b[1;34m(self, sync_data)\u001b[0m\n\u001b[0;32m 639\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_send(msg, buffers\u001b[38;5;241m=\u001b[39mecho_buffers)\n\u001b[0;32m 641\u001b[0m \u001b[38;5;66;03m# The order of these context managers is important. Properties must\u001b[39;00m\n\u001b[0;32m 642\u001b[0m \u001b[38;5;66;03m# be locked when the hold_trait_notification context manager is\u001b[39;00m\n\u001b[0;32m 643\u001b[0m \u001b[38;5;66;03m# released and notifications are fired.\u001b[39;00m\n\u001b[1;32m--> 644\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_lock_property\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msync_data\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhold_trait_notifications\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msync_data\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 646\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m:\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\contextlib.py:144\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[1;34m(self, typ, value, traceback)\u001b[0m\n\u001b[0;32m 142\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m typ \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 143\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 144\u001b[0m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen)\n\u001b[0;32m 145\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[0;32m 146\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1502\u001b[0m, in \u001b[0;36mHasTraits.hold_trait_notifications\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1500\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m changes \u001b[38;5;129;01min\u001b[39;00m cache\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[0;32m 1501\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m change \u001b[38;5;129;01min\u001b[39;00m changes:\n\u001b[1;32m-> 1502\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget_selection.py:236\u001b[0m, in \u001b[0;36m_Selection._propagate_index\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 234\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlabel \u001b[38;5;241m=\u001b[39m label\n\u001b[0;32m 235\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value:\n\u001b[1;32m--> 236\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m \u001b[38;5;241m=\u001b[39m value\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:732\u001b[0m, in \u001b[0;36mTraitType.__set__\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 730\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TraitError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m trait is read-only.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m 731\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 732\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:721\u001b[0m, in \u001b[0;36mTraitType.set\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 717\u001b[0m silent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 718\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m silent \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m 719\u001b[0m \u001b[38;5;66;03m# we explicitly compare silent to True just in case the equality\u001b[39;00m\n\u001b[0;32m 720\u001b[0m \u001b[38;5;66;03m# comparison above returns something other than True/False\u001b[39;00m\n\u001b[1;32m--> 721\u001b[0m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_trait\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnew_value\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1505\u001b[0m, in \u001b[0;36mHasTraits._notify_trait\u001b[1;34m(self, name, old_value, new_value)\u001b[0m\n\u001b[0;32m 1504\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_notify_trait\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, old_value, new_value):\n\u001b[1;32m-> 1505\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1506\u001b[0m \u001b[43m \u001b[49m\u001b[43mBunch\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1507\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1508\u001b[0m \u001b[43m \u001b[49m\u001b[43mold\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1509\u001b[0m \u001b[43m \u001b[49m\u001b[43mnew\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1510\u001b[0m \u001b[43m \u001b[49m\u001b[43mowner\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1511\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchange\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1512\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1513\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[19], line 36\u001b[0m, in \u001b[0;36mon_file_selection\u001b[1;34m(change)\u001b[0m\n\u001b[0;32m 34\u001b[0m fs2, data2 \u001b[38;5;241m=\u001b[39m load_wav(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfolder_path_output_apx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mselected_file_mod\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m fs \u001b[38;5;241m==\u001b[39m fs2, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSampling rates do not match\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m---> 36\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstack\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata2\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 38\u001b[0m plot_timedomain(data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n\u001b[0;32m 39\u001b[0m plot_freqdomain(fs, data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\numpy\\core\\shape_base.py:449\u001b[0m, in \u001b[0;36mstack\u001b[1;34m(arrays, axis, out, dtype, casting)\u001b[0m\n\u001b[0;32m 447\u001b[0m shapes \u001b[38;5;241m=\u001b[39m {arr\u001b[38;5;241m.\u001b[39mshape \u001b[38;5;28;01mfor\u001b[39;00m arr \u001b[38;5;129;01min\u001b[39;00m arrays}\n\u001b[0;32m 448\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(shapes) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m--> 449\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mall input arrays must have the same shape\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 451\u001b[0m result_ndim \u001b[38;5;241m=\u001b[39m arrays[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 452\u001b[0m axis \u001b[38;5;241m=\u001b[39m normalize_axis_index(axis, result_ndim)\n", + "\u001b[1;31mValueError\u001b[0m: all input arrays must have the same shape" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected file: breathing_peak_016g_external_Speaker_80dBSPL_PDM.wav\n" + ] + }, + { + "ename": "ValueError", + "evalue": "all input arrays must have the same shape", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:767\u001b[0m, in \u001b[0;36mWidget._handle_msg\u001b[1;34m(self, msg)\u001b[0m\n\u001b[0;32m 765\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data:\n\u001b[0;32m 766\u001b[0m _put_buffers(state, data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m], msg[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffers\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m--> 767\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_state\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 769\u001b[0m \u001b[38;5;66;03m# Handle a state request.\u001b[39;00m\n\u001b[0;32m 770\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrequest_state\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:644\u001b[0m, in \u001b[0;36mWidget.set_state\u001b[1;34m(self, sync_data)\u001b[0m\n\u001b[0;32m 639\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_send(msg, buffers\u001b[38;5;241m=\u001b[39mecho_buffers)\n\u001b[0;32m 641\u001b[0m \u001b[38;5;66;03m# The order of these context managers is important. Properties must\u001b[39;00m\n\u001b[0;32m 642\u001b[0m \u001b[38;5;66;03m# be locked when the hold_trait_notification context manager is\u001b[39;00m\n\u001b[0;32m 643\u001b[0m \u001b[38;5;66;03m# released and notifications are fired.\u001b[39;00m\n\u001b[1;32m--> 644\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_lock_property\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msync_data\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhold_trait_notifications\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msync_data\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 646\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m:\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\contextlib.py:144\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[1;34m(self, typ, value, traceback)\u001b[0m\n\u001b[0;32m 142\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m typ \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 143\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 144\u001b[0m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen)\n\u001b[0;32m 145\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[0;32m 146\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1502\u001b[0m, in \u001b[0;36mHasTraits.hold_trait_notifications\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1500\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m changes \u001b[38;5;129;01min\u001b[39;00m cache\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[0;32m 1501\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m change \u001b[38;5;129;01min\u001b[39;00m changes:\n\u001b[1;32m-> 1502\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget_selection.py:236\u001b[0m, in \u001b[0;36m_Selection._propagate_index\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 234\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlabel \u001b[38;5;241m=\u001b[39m label\n\u001b[0;32m 235\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value:\n\u001b[1;32m--> 236\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m \u001b[38;5;241m=\u001b[39m value\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:732\u001b[0m, in \u001b[0;36mTraitType.__set__\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 730\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TraitError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m trait is read-only.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m 731\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 732\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:721\u001b[0m, in \u001b[0;36mTraitType.set\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 717\u001b[0m silent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 718\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m silent \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m 719\u001b[0m \u001b[38;5;66;03m# we explicitly compare silent to True just in case the equality\u001b[39;00m\n\u001b[0;32m 720\u001b[0m \u001b[38;5;66;03m# comparison above returns something other than True/False\u001b[39;00m\n\u001b[1;32m--> 721\u001b[0m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_trait\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnew_value\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1505\u001b[0m, in \u001b[0;36mHasTraits._notify_trait\u001b[1;34m(self, name, old_value, new_value)\u001b[0m\n\u001b[0;32m 1504\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_notify_trait\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, old_value, new_value):\n\u001b[1;32m-> 1505\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1506\u001b[0m \u001b[43m \u001b[49m\u001b[43mBunch\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1507\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1508\u001b[0m \u001b[43m \u001b[49m\u001b[43mold\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1509\u001b[0m \u001b[43m \u001b[49m\u001b[43mnew\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1510\u001b[0m \u001b[43m \u001b[49m\u001b[43mowner\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1511\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchange\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1512\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1513\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[19], line 36\u001b[0m, in \u001b[0;36mon_file_selection\u001b[1;34m(change)\u001b[0m\n\u001b[0;32m 34\u001b[0m fs2, data2 \u001b[38;5;241m=\u001b[39m load_wav(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfolder_path_output_apx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mselected_file_mod\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m fs \u001b[38;5;241m==\u001b[39m fs2, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSampling rates do not match\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m---> 36\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstack\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata2\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 38\u001b[0m plot_timedomain(data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n\u001b[0;32m 39\u001b[0m plot_freqdomain(fs, data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\numpy\\core\\shape_base.py:449\u001b[0m, in \u001b[0;36mstack\u001b[1;34m(arrays, axis, out, dtype, casting)\u001b[0m\n\u001b[0;32m 447\u001b[0m shapes \u001b[38;5;241m=\u001b[39m {arr\u001b[38;5;241m.\u001b[39mshape \u001b[38;5;28;01mfor\u001b[39;00m arr \u001b[38;5;129;01min\u001b[39;00m arrays}\n\u001b[0;32m 448\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(shapes) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m--> 449\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mall input arrays must have the same shape\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 451\u001b[0m result_ndim \u001b[38;5;241m=\u001b[39m arrays[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 452\u001b[0m axis \u001b[38;5;241m=\u001b[39m normalize_axis_index(axis, result_ndim)\n", + "\u001b[1;31mValueError\u001b[0m: all input arrays must have the same shape" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected file: eatCrunchy_peak_1g_clipping_external_Speaker_80dBSPL_PDM.wav\n", + "Selected file: breathing_peak_016g_external_Speaker_80dBSPL_PDM.wav\n" + ] + }, + { + "ename": "ValueError", + "evalue": "all input arrays must have the same shape", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:767\u001b[0m, in \u001b[0;36mWidget._handle_msg\u001b[1;34m(self, msg)\u001b[0m\n\u001b[0;32m 765\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data:\n\u001b[0;32m 766\u001b[0m _put_buffers(state, data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m], msg[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffers\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m--> 767\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_state\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 769\u001b[0m \u001b[38;5;66;03m# Handle a state request.\u001b[39;00m\n\u001b[0;32m 770\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrequest_state\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:644\u001b[0m, in \u001b[0;36mWidget.set_state\u001b[1;34m(self, sync_data)\u001b[0m\n\u001b[0;32m 639\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_send(msg, buffers\u001b[38;5;241m=\u001b[39mecho_buffers)\n\u001b[0;32m 641\u001b[0m \u001b[38;5;66;03m# The order of these context managers is important. Properties must\u001b[39;00m\n\u001b[0;32m 642\u001b[0m \u001b[38;5;66;03m# be locked when the hold_trait_notification context manager is\u001b[39;00m\n\u001b[0;32m 643\u001b[0m \u001b[38;5;66;03m# released and notifications are fired.\u001b[39;00m\n\u001b[1;32m--> 644\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_lock_property\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msync_data\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhold_trait_notifications\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msync_data\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 646\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m:\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\contextlib.py:144\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[1;34m(self, typ, value, traceback)\u001b[0m\n\u001b[0;32m 142\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m typ \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 143\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 144\u001b[0m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen)\n\u001b[0;32m 145\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[0;32m 146\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1502\u001b[0m, in \u001b[0;36mHasTraits.hold_trait_notifications\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1500\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m changes \u001b[38;5;129;01min\u001b[39;00m cache\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[0;32m 1501\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m change \u001b[38;5;129;01min\u001b[39;00m changes:\n\u001b[1;32m-> 1502\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget_selection.py:236\u001b[0m, in \u001b[0;36m_Selection._propagate_index\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 234\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlabel \u001b[38;5;241m=\u001b[39m label\n\u001b[0;32m 235\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value:\n\u001b[1;32m--> 236\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m \u001b[38;5;241m=\u001b[39m value\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:732\u001b[0m, in \u001b[0;36mTraitType.__set__\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 730\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TraitError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m trait is read-only.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m 731\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 732\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:721\u001b[0m, in \u001b[0;36mTraitType.set\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 717\u001b[0m silent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 718\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m silent \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m 719\u001b[0m \u001b[38;5;66;03m# we explicitly compare silent to True just in case the equality\u001b[39;00m\n\u001b[0;32m 720\u001b[0m \u001b[38;5;66;03m# comparison above returns something other than True/False\u001b[39;00m\n\u001b[1;32m--> 721\u001b[0m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_trait\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnew_value\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1505\u001b[0m, in \u001b[0;36mHasTraits._notify_trait\u001b[1;34m(self, name, old_value, new_value)\u001b[0m\n\u001b[0;32m 1504\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_notify_trait\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, old_value, new_value):\n\u001b[1;32m-> 1505\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1506\u001b[0m \u001b[43m \u001b[49m\u001b[43mBunch\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1507\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1508\u001b[0m \u001b[43m \u001b[49m\u001b[43mold\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1509\u001b[0m \u001b[43m \u001b[49m\u001b[43mnew\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1510\u001b[0m \u001b[43m \u001b[49m\u001b[43mowner\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1511\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchange\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1512\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1513\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[19], line 36\u001b[0m, in \u001b[0;36mon_file_selection\u001b[1;34m(change)\u001b[0m\n\u001b[0;32m 34\u001b[0m fs2, data2 \u001b[38;5;241m=\u001b[39m load_wav(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfolder_path_output_apx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mselected_file_mod\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m fs \u001b[38;5;241m==\u001b[39m fs2, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSampling rates do not match\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m---> 36\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstack\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata2\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 38\u001b[0m plot_timedomain(data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n\u001b[0;32m 39\u001b[0m plot_freqdomain(fs, data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\numpy\\core\\shape_base.py:449\u001b[0m, in \u001b[0;36mstack\u001b[1;34m(arrays, axis, out, dtype, casting)\u001b[0m\n\u001b[0;32m 447\u001b[0m shapes \u001b[38;5;241m=\u001b[39m {arr\u001b[38;5;241m.\u001b[39mshape \u001b[38;5;28;01mfor\u001b[39;00m arr \u001b[38;5;129;01min\u001b[39;00m arrays}\n\u001b[0;32m 448\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(shapes) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m--> 449\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mall input arrays must have the same shape\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 451\u001b[0m result_ndim \u001b[38;5;241m=\u001b[39m arrays[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 452\u001b[0m axis \u001b[38;5;241m=\u001b[39m normalize_axis_index(axis, result_ndim)\n", + "\u001b[1;31mValueError\u001b[0m: all input arrays must have the same shape" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected file: breathing_peak_01g_external_Speaker_80dBSPL_PDM.wav\n" + ] + }, + { + "ename": "LibsndfileError", + "evalue": "Error opening './testdata/output/ap_measured/breathing_peak_01g_external_Speaker_80dBSPL_PDM_Acquired Waveform.wav': System error.", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mLibsndfileError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:767\u001b[0m, in \u001b[0;36mWidget._handle_msg\u001b[1;34m(self, msg)\u001b[0m\n\u001b[0;32m 765\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data:\n\u001b[0;32m 766\u001b[0m _put_buffers(state, data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m], msg[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffers\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m--> 767\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_state\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 769\u001b[0m \u001b[38;5;66;03m# Handle a state request.\u001b[39;00m\n\u001b[0;32m 770\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrequest_state\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:644\u001b[0m, in \u001b[0;36mWidget.set_state\u001b[1;34m(self, sync_data)\u001b[0m\n\u001b[0;32m 639\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_send(msg, buffers\u001b[38;5;241m=\u001b[39mecho_buffers)\n\u001b[0;32m 641\u001b[0m \u001b[38;5;66;03m# The order of these context managers is important. Properties must\u001b[39;00m\n\u001b[0;32m 642\u001b[0m \u001b[38;5;66;03m# be locked when the hold_trait_notification context manager is\u001b[39;00m\n\u001b[0;32m 643\u001b[0m \u001b[38;5;66;03m# released and notifications are fired.\u001b[39;00m\n\u001b[1;32m--> 644\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_lock_property\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msync_data\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhold_trait_notifications\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msync_data\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 646\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m:\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\contextlib.py:144\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[1;34m(self, typ, value, traceback)\u001b[0m\n\u001b[0;32m 142\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m typ \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 143\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 144\u001b[0m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen)\n\u001b[0;32m 145\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[0;32m 146\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1502\u001b[0m, in \u001b[0;36mHasTraits.hold_trait_notifications\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1500\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m changes \u001b[38;5;129;01min\u001b[39;00m cache\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[0;32m 1501\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m change \u001b[38;5;129;01min\u001b[39;00m changes:\n\u001b[1;32m-> 1502\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget_selection.py:236\u001b[0m, in \u001b[0;36m_Selection._propagate_index\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 234\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlabel \u001b[38;5;241m=\u001b[39m label\n\u001b[0;32m 235\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value:\n\u001b[1;32m--> 236\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m \u001b[38;5;241m=\u001b[39m value\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:732\u001b[0m, in \u001b[0;36mTraitType.__set__\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 730\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TraitError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m trait is read-only.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m 731\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 732\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:721\u001b[0m, in \u001b[0;36mTraitType.set\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 717\u001b[0m silent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 718\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m silent \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m 719\u001b[0m \u001b[38;5;66;03m# we explicitly compare silent to True just in case the equality\u001b[39;00m\n\u001b[0;32m 720\u001b[0m \u001b[38;5;66;03m# comparison above returns something other than True/False\u001b[39;00m\n\u001b[1;32m--> 721\u001b[0m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_trait\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnew_value\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1505\u001b[0m, in \u001b[0;36mHasTraits._notify_trait\u001b[1;34m(self, name, old_value, new_value)\u001b[0m\n\u001b[0;32m 1504\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_notify_trait\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, old_value, new_value):\n\u001b[1;32m-> 1505\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1506\u001b[0m \u001b[43m \u001b[49m\u001b[43mBunch\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1507\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1508\u001b[0m \u001b[43m \u001b[49m\u001b[43mold\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1509\u001b[0m \u001b[43m \u001b[49m\u001b[43mnew\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1510\u001b[0m \u001b[43m \u001b[49m\u001b[43mowner\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1511\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchange\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1512\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1513\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[19], line 34\u001b[0m, in \u001b[0;36mon_file_selection\u001b[1;34m(change)\u001b[0m\n\u001b[0;32m 32\u001b[0m fs, data1 \u001b[38;5;241m=\u001b[39m load_wav(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfolder_path_input\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mselected_file\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 33\u001b[0m selected_file_mod \u001b[38;5;241m=\u001b[39m selected_file\u001b[38;5;241m.\u001b[39mreplace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.wav\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_Acquired Waveform.wav\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 34\u001b[0m fs2, data2 \u001b[38;5;241m=\u001b[39m \u001b[43mload_wav\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mfolder_path_output_apx\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mselected_file_mod\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m fs \u001b[38;5;241m==\u001b[39m fs2, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSampling rates do not match\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 36\u001b[0m data \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mstack((data1[\u001b[38;5;241m0\u001b[39m], data1[\u001b[38;5;241m1\u001b[39m], data2), axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n", + "Cell \u001b[1;32mIn[1], line 66\u001b[0m, in \u001b[0;36mload_wav\u001b[1;34m(filename)\u001b[0m\n\u001b[0;32m 65\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_wav\u001b[39m(filename):\n\u001b[1;32m---> 66\u001b[0m y, fs \u001b[38;5;241m=\u001b[39m \u001b[43msf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mint16\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 67\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fs, y\u001b[38;5;241m.\u001b[39mT\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\soundfile.py:285\u001b[0m, in \u001b[0;36mread\u001b[1;34m(file, frames, start, stop, dtype, always_2d, fill_value, out, samplerate, channels, format, subtype, endian, closefd)\u001b[0m\n\u001b[0;32m 199\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mread\u001b[39m(file, frames\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, start\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m, stop\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, dtype\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfloat64\u001b[39m\u001b[38;5;124m'\u001b[39m, always_2d\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 200\u001b[0m fill_value\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, out\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, samplerate\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, channels\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m 201\u001b[0m \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, subtype\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, endian\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, closefd\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[0;32m 202\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Provide audio data from a sound file as NumPy array.\u001b[39;00m\n\u001b[0;32m 203\u001b[0m \n\u001b[0;32m 204\u001b[0m \u001b[38;5;124;03m By default, the whole file is read from the beginning, but the\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 283\u001b[0m \n\u001b[0;32m 284\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 285\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mSoundFile\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msamplerate\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mchannels\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 286\u001b[0m \u001b[43m \u001b[49m\u001b[43msubtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mendian\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclosefd\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[0;32m 287\u001b[0m frames \u001b[38;5;241m=\u001b[39m f\u001b[38;5;241m.\u001b[39m_prepare_read(start, stop, frames)\n\u001b[0;32m 288\u001b[0m data \u001b[38;5;241m=\u001b[39m f\u001b[38;5;241m.\u001b[39mread(frames, dtype, always_2d, fill_value, out)\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\soundfile.py:658\u001b[0m, in \u001b[0;36mSoundFile.__init__\u001b[1;34m(self, file, mode, samplerate, channels, subtype, endian, format, closefd)\u001b[0m\n\u001b[0;32m 655\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m=\u001b[39m mode\n\u001b[0;32m 656\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_info \u001b[38;5;241m=\u001b[39m _create_info_struct(file, mode, samplerate, channels,\n\u001b[0;32m 657\u001b[0m \u001b[38;5;28mformat\u001b[39m, subtype, endian)\n\u001b[1;32m--> 658\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_open\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode_int\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclosefd\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 659\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mset\u001b[39m(mode)\u001b[38;5;241m.\u001b[39missuperset(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr+\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mseekable():\n\u001b[0;32m 660\u001b[0m \u001b[38;5;66;03m# Move write position to 0 (like in Python file objects)\u001b[39;00m\n\u001b[0;32m 661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mseek(\u001b[38;5;241m0\u001b[39m)\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\soundfile.py:1216\u001b[0m, in \u001b[0;36mSoundFile._open\u001b[1;34m(self, file, mode_int, closefd)\u001b[0m\n\u001b[0;32m 1213\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file_ptr \u001b[38;5;241m==\u001b[39m _ffi\u001b[38;5;241m.\u001b[39mNULL:\n\u001b[0;32m 1214\u001b[0m \u001b[38;5;66;03m# get the actual error code\u001b[39;00m\n\u001b[0;32m 1215\u001b[0m err \u001b[38;5;241m=\u001b[39m _snd\u001b[38;5;241m.\u001b[39msf_error(file_ptr)\n\u001b[1;32m-> 1216\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m LibsndfileError(err, prefix\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError opening \u001b[39m\u001b[38;5;132;01m{0!r}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname))\n\u001b[0;32m 1217\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m mode_int \u001b[38;5;241m==\u001b[39m _snd\u001b[38;5;241m.\u001b[39mSFM_WRITE:\n\u001b[0;32m 1218\u001b[0m \u001b[38;5;66;03m# Due to a bug in libsndfile version <= 1.0.25, frames != 0\u001b[39;00m\n\u001b[0;32m 1219\u001b[0m \u001b[38;5;66;03m# when opening a named pipe in SFM_WRITE mode.\u001b[39;00m\n\u001b[0;32m 1220\u001b[0m \u001b[38;5;66;03m# See http://github.com/erikd/libsndfile/issues/77.\u001b[39;00m\n\u001b[0;32m 1221\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_info\u001b[38;5;241m.\u001b[39mframes \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n", + "\u001b[1;31mLibsndfileError\u001b[0m: Error opening './testdata/output/ap_measured/breathing_peak_01g_external_Speaker_80dBSPL_PDM_Acquired Waveform.wav': System error." + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected file: breathing_peak_016g_external_Speaker_80dBSPL_PDM.wav\n" + ] + }, + { + "ename": "ValueError", + "evalue": "all input arrays must have the same shape", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:767\u001b[0m, in \u001b[0;36mWidget._handle_msg\u001b[1;34m(self, msg)\u001b[0m\n\u001b[0;32m 765\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data:\n\u001b[0;32m 766\u001b[0m _put_buffers(state, data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffer_paths\u001b[39m\u001b[38;5;124m'\u001b[39m], msg[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbuffers\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m--> 767\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_state\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 769\u001b[0m \u001b[38;5;66;03m# Handle a state request.\u001b[39;00m\n\u001b[0;32m 770\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrequest_state\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:644\u001b[0m, in \u001b[0;36mWidget.set_state\u001b[1;34m(self, sync_data)\u001b[0m\n\u001b[0;32m 639\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_send(msg, buffers\u001b[38;5;241m=\u001b[39mecho_buffers)\n\u001b[0;32m 641\u001b[0m \u001b[38;5;66;03m# The order of these context managers is important. Properties must\u001b[39;00m\n\u001b[0;32m 642\u001b[0m \u001b[38;5;66;03m# be locked when the hold_trait_notification context manager is\u001b[39;00m\n\u001b[0;32m 643\u001b[0m \u001b[38;5;66;03m# released and notifications are fired.\u001b[39;00m\n\u001b[1;32m--> 644\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_lock_property\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msync_data\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhold_trait_notifications\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msync_data\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 646\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m:\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\contextlib.py:144\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[1;34m(self, typ, value, traceback)\u001b[0m\n\u001b[0;32m 142\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m typ \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 143\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 144\u001b[0m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen)\n\u001b[0;32m 145\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[0;32m 146\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1502\u001b[0m, in \u001b[0;36mHasTraits.hold_trait_notifications\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1500\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m changes \u001b[38;5;129;01min\u001b[39;00m cache\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[0;32m 1501\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m change \u001b[38;5;129;01min\u001b[39;00m changes:\n\u001b[1;32m-> 1502\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget_selection.py:236\u001b[0m, in \u001b[0;36m_Selection._propagate_index\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 234\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlabel \u001b[38;5;241m=\u001b[39m label\n\u001b[0;32m 235\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value:\n\u001b[1;32m--> 236\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m \u001b[38;5;241m=\u001b[39m value\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:732\u001b[0m, in \u001b[0;36mTraitType.__set__\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 730\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TraitError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m trait is read-only.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m 731\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 732\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:721\u001b[0m, in \u001b[0;36mTraitType.set\u001b[1;34m(self, obj, value)\u001b[0m\n\u001b[0;32m 717\u001b[0m silent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 718\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m silent \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m 719\u001b[0m \u001b[38;5;66;03m# we explicitly compare silent to True just in case the equality\u001b[39;00m\n\u001b[0;32m 720\u001b[0m \u001b[38;5;66;03m# comparison above returns something other than True/False\u001b[39;00m\n\u001b[1;32m--> 721\u001b[0m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_trait\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnew_value\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1505\u001b[0m, in \u001b[0;36mHasTraits._notify_trait\u001b[1;34m(self, name, old_value, new_value)\u001b[0m\n\u001b[0;32m 1504\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_notify_trait\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, old_value, new_value):\n\u001b[1;32m-> 1505\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1506\u001b[0m \u001b[43m \u001b[49m\u001b[43mBunch\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1507\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1508\u001b[0m \u001b[43m \u001b[49m\u001b[43mold\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mold_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1509\u001b[0m \u001b[43m \u001b[49m\u001b[43mnew\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1510\u001b[0m \u001b[43m \u001b[49m\u001b[43mowner\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1511\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchange\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1512\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1513\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\ipywidgets\\widgets\\widget.py:695\u001b[0m, in \u001b[0;36mWidget.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[0;32m 693\u001b[0m \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend_state(key\u001b[38;5;241m=\u001b[39mname)\n\u001b[1;32m--> 695\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1517\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[1;34m(self, change)\u001b[0m\n\u001b[0;32m 1515\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m 1516\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\traitlets\\traitlets.py:1564\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1562\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m-> 1564\u001b[0m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[19], line 36\u001b[0m, in \u001b[0;36mon_file_selection\u001b[1;34m(change)\u001b[0m\n\u001b[0;32m 34\u001b[0m fs2, data2 \u001b[38;5;241m=\u001b[39m load_wav(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfolder_path_output_apx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mselected_file_mod\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m fs \u001b[38;5;241m==\u001b[39m fs2, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSampling rates do not match\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m---> 36\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstack\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata1\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata2\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 38\u001b[0m plot_timedomain(data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n\u001b[0;32m 39\u001b[0m plot_freqdomain(fs, data[\u001b[38;5;241m1\u001b[39m], data[\u001b[38;5;241m0\u001b[39m], data[\u001b[38;5;241m2\u001b[39m])\n", + "File \u001b[1;32mc:\\Users\\pstruebi\\AppData\\Local\\miniconda3\\envs\\jupyter\\Lib\\site-packages\\numpy\\core\\shape_base.py:449\u001b[0m, in \u001b[0;36mstack\u001b[1;34m(arrays, axis, out, dtype, casting)\u001b[0m\n\u001b[0;32m 447\u001b[0m shapes \u001b[38;5;241m=\u001b[39m {arr\u001b[38;5;241m.\u001b[39mshape \u001b[38;5;28;01mfor\u001b[39;00m arr \u001b[38;5;129;01min\u001b[39;00m arrays}\n\u001b[0;32m 448\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(shapes) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m--> 449\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mall input arrays must have the same shape\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 451\u001b[0m result_ndim \u001b[38;5;241m=\u001b[39m arrays[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 452\u001b[0m axis \u001b[38;5;241m=\u001b[39m normalize_axis_index(axis, result_ndim)\n", + "\u001b[1;31mValueError\u001b[0m: all input arrays must have the same shape" + ] + } + ], + "source": [ + "%matplotlib widget\n", + "\n", + "# Define the folder path where the files are located\n", + "folder_path_input = \"./testdata/input\"\n", + "folder_path_output_default = \"./testdata/output\"\n", + "folder_path_output_apx = \"./testdata/output/ap_measured\"\n", + "\n", + "\n", + "# Get a list of all files in the folder\n", + "file_names = [f for f in os.listdir(folder_path_output_default) if f.endswith(\".wav\")]\n", + "\n", + "# Create a dropdown widget to select the file\n", + "file_dropdown = widgets.Dropdown(\n", + " options=file_names,\n", + " description='Select a file:'\n", + ")\n", + "ap_data_checkbox = widgets.Checkbox(\n", + " value=True,\n", + " description='Is APx data',\n", + ")\n", + "\n", + "# Function to handle the dropdown value change\n", + "def on_file_selection(change):\n", + " selected_file = change['new']\n", + " # Do something with the selected file\n", + " print(f\"Selected file: {selected_file}\")\n", + " if not ap_data_checkbox.value:\n", + " fs, data = load_wav(f\"{folder_path_output_default}/{selected_file}\")\n", + " else:\n", + " #fs, data1 = load_wav(f\"{folder_path}/{selected_file}\")\n", + " \n", + " fs, data1 = load_wav(f\"{folder_path_input}/{selected_file}\")\n", + " selected_file_mod = selected_file.replace(\".wav\", \"_Acquired Waveform.wav\")\n", + " fs2, data2 = load_wav(f\"{folder_path_output_apx}/{selected_file_mod}\")\n", + " assert fs == fs2, \"Sampling rates do not match\"\n", + " data = np.stack((data1[0], data1[1], data2), axis=0)\n", + "\n", + " plot_timedomain(data[1], data[0], data[2])\n", + " plot_freqdomain(fs, data[1], data[0], data[2])\n", + "\n", + "\n", + "def on_checkbutton(change):\n", + " val = change['new']\n", + " \n", + " if val:\n", + " file_names = [f for f in os.listdir(folder_path_input) if f.endswith(\".wav\")]\n", + " else:\n", + " file_names = [f for f in os.listdir(folder_path_output_default) if f.endswith(\".wav\")]\n", + "\n", + " file_dropdown.options = file_names\n", + "\n", + "\n", + "# Register the function to be called when the dropdown value changes\n", + "file_dropdown.observe(on_file_selection, names='value')\n", + "ap_data_checkbox.observe(on_checkbutton, names='value')\n", + "\n", + "# Display the file dropdown widget\n", + "display(file_dropdown)\n", + "display(ap_data_checkbox)\n", + "\n", + "# Setup the plots for later usage\n", + "setup_timeplot()\n", + "setup_freqplot()\n", + "\n", + "on_checkbutton({'new': ap_data_checkbox.value})\n", + "#plot the initially selected file\n", + "if file_dropdown.value is not None:\n", + " on_file_selection({'new': file_dropdown.value})\n" + ] + } + ], + "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.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/simulation/test/test_hw.py b/simulation/test/test_hw.py new file mode 100644 index 0000000..2f9ec58 --- /dev/null +++ b/simulation/test/test_hw.py @@ -0,0 +1,68 @@ +import dwfpy as dwf +import numpy as np + +F_SYSCLK_ANALOG_DISCOVERY=100e6 +BITS_PER_FRAME=32 +F_BITCLK=640e3 +F_FRAMECLK=20e3 + +print(f'DWF Version: {dwf.Application.get_version()}') + +def gen_pcm(device, data, f_bitclk=F_BITCLK, words_per_frame=1, bits_per_word=16): + + + # Convert data to a list of bits + bits_list = [] + for word in data: + # Check if word violates the 16-bit signed integer range + assert -32768 <= word <= 32767, 'Word value is out of range.' + + # Convert word to binary representation + binary = bin(word & 0xFFFF)[2:].zfill(bits_per_word) + + # Add binary representation to bits_list + bits_list.extend([int(bit) for bit in binary]) + + + print(f'Found device: {device.name} ({device.serial_number})') + + do_channels = device.digital_output + + f_sysclk=do_channels[0]._module.clock_frequency + + # Setup bitclock + counter_bitclk=round(f_sysclk/f_bitclk) + print(f"Set f bitclk to :{round(f_sysclk/counter_bitclk, 2)}Hz") + assert counter_bitclk % 2 == 0, 'Counter must be even.' + high_counter_bitclk=int(counter_bitclk/2) + low_counter_bitclk=int(counter_bitclk/2) + do_channels[0].setup(output_type=dwf.DigitalOutputType.PULSE, initial_counter=1, high_counter=high_counter_bitclk, low_counter=low_counter_bitclk) + + # Setup frameclock + counter_frameclk= counter_bitclk*bits_per_word*words_per_frame + assert counter_frameclk % counter_bitclk == 0, 'Counter frameclk must be multiple of bit clock.' + do_channels[1].setup(output_type=dwf.DigitalOutputType.PULSE, high_counter=counter_bitclk, low_counter=counter_frameclk-counter_bitclk) + + #setup data + do_channels[2].setup(output_type=dwf.DigitalOutputType.CUSTOM, divider=counter_bitclk, high_counter=1, low_counter=1) + do_channels[2].set_custom_bits(bits_list) + + return do_channels + + +if __name__ == '__main__': + + # Generate sine wave + f_sine = 1e3 + t = np.arange(0, 1/f_sine, 1/F_FRAMECLK) + sine_wave = np.sin(2 * np.pi * f_sine * t)*0.5 + + # Convert sine wave to PCM data + pcm_data = (sine_wave * 32767).astype(int) + + # Generate PCM channels + with dwf.Device() as device: + channels = gen_pcm(device, pcm_data, f_bitclk=F_BITCLK, words_per_frame=1, bits_per_word=16) + channels.configure(start=True) + input('Press Enter key to continue.') + channels.reset() diff --git a/simulation/test/testdata/input/1kHz_peak_1g_external_Speaker_0dBSPL_PDM.wav b/simulation/test/testdata/input/1kHz_peak_1g_external_Speaker_0dBSPL_PDM.wav new file mode 100644 index 0000000..f9a2218 Binary files /dev/null and b/simulation/test/testdata/input/1kHz_peak_1g_external_Speaker_0dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/breathing_peak_016g_external_Speaker_80dBSPL_PDM.wav b/simulation/test/testdata/input/breathing_peak_016g_external_Speaker_80dBSPL_PDM.wav new file mode 100644 index 0000000..171c68d Binary files /dev/null and b/simulation/test/testdata/input/breathing_peak_016g_external_Speaker_80dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/breathing_peak_01g_external_Speaker_80dBSPL_PDM.wav b/simulation/test/testdata/input/breathing_peak_01g_external_Speaker_80dBSPL_PDM.wav new file mode 100644 index 0000000..00991cb Binary files /dev/null and b/simulation/test/testdata/input/breathing_peak_01g_external_Speaker_80dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/chirp_disturber.wav b/simulation/test/testdata/input/chirp_disturber.wav new file mode 100644 index 0000000..57925cb Binary files /dev/null and b/simulation/test/testdata/input/chirp_disturber.wav differ diff --git a/simulation/test/testdata/input/chirp_noise.wav b/simulation/test/testdata/input/chirp_noise.wav new file mode 100644 index 0000000..394412e Binary files /dev/null and b/simulation/test/testdata/input/chirp_noise.wav differ diff --git a/simulation/test/testdata/input/chirp_sine.wav b/simulation/test/testdata/input/chirp_sine.wav new file mode 100644 index 0000000..a61ef49 Binary files /dev/null and b/simulation/test/testdata/input/chirp_sine.wav differ diff --git a/simulation/test/testdata/input/eatCrunchy_peak_05g_external_Speaker_80dBSPL_PDM.wav b/simulation/test/testdata/input/eatCrunchy_peak_05g_external_Speaker_80dBSPL_PDM.wav new file mode 100644 index 0000000..ce7fcd6 Binary files /dev/null and b/simulation/test/testdata/input/eatCrunchy_peak_05g_external_Speaker_80dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/eatCrunchy_peak_1g_clipping_external_Speaker_80dBSPL_PDM.wav b/simulation/test/testdata/input/eatCrunchy_peak_1g_clipping_external_Speaker_80dBSPL_PDM.wav new file mode 100644 index 0000000..2aa2d8c Binary files /dev/null and b/simulation/test/testdata/input/eatCrunchy_peak_1g_clipping_external_Speaker_80dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/eatCrunchy_peak_2g_clipping_external_Speaker_80dBSPL_PDM.wav b/simulation/test/testdata/input/eatCrunchy_peak_2g_clipping_external_Speaker_80dBSPL_PDM.wav new file mode 100644 index 0000000..c4dbba5 Binary files /dev/null and b/simulation/test/testdata/input/eatCrunchy_peak_2g_clipping_external_Speaker_80dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/ownVoice_shaker0.2g_speaker80dBSPL_PDM.wav b/simulation/test/testdata/input/ownVoice_shaker0.2g_speaker80dBSPL_PDM.wav new file mode 100644 index 0000000..f8449cf Binary files /dev/null and b/simulation/test/testdata/input/ownVoice_shaker0.2g_speaker80dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/peak_0g_external_Speaker_80dBSPL_PDM.wav b/simulation/test/testdata/input/peak_0g_external_Speaker_80dBSPL_PDM.wav new file mode 100644 index 0000000..4084165 Binary files /dev/null and b/simulation/test/testdata/input/peak_0g_external_Speaker_80dBSPL_PDM.wav differ diff --git a/simulation/test/testdata/input/sine_noise.wav b/simulation/test/testdata/input/sine_noise.wav new file mode 100644 index 0000000..9713daf Binary files /dev/null and b/simulation/test/testdata/input/sine_noise.wav differ