3.1,3.2,3.3

This commit is contained in:
Patrick Hangl
2025-11-27 18:51:35 +01:00
parent 5249eb3a64
commit d78c2c8245
11 changed files with 91 additions and 44 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

BIN
Bilder/fig_plot_1_noise.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
Bilder/fig_plot_2_noise.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@@ -266,17 +266,16 @@ The LMS algorithm therefore updates the filter coefficients $w[n]$ after every s
\label{fig:fig_anr_implant}
\end{figure}
\noindent Figure \ref{fig:fig_anr_hybrid} showed us the basic concept of an ANR implementation, without a detailed description how the corrupted target signal $d[n]$ and the reference noise signal $x[n]$ are formed. Figure \ref{fig:fig_anr_implant} now shows a more complete and realistic signal flow diagram of an implanted cochlear implant system, with two signal sensors and an adaptive noise reduction circuit afterwards. The target signal sensor receives the target- and noise signal over their respective transfer functions and outputs the corrupted target signal $d[n]$, which consists out of the recorded target signal $s[n]$ and the recorded corruption noise signal $n[n]$, whereas the noise signal sensor aims to receive (ideally) only the noise signal $v[n]$ over its transfer function and outputs the reference noise signal $x[n]$, which then feeds the adaptive filter.\\ \\
Additionally, now the relevant transfer functions of the overall system are illustrated in Figure \ref{fig:fig_anr_implant}. The transfer functions $D_n$, $F_n$, and $C_n$ with $A_n$ describe the path from the signal sources to their respective sensors inside the cochlear implant system. As the sources and the relative location of the user to the sources can vary, these transfer functions are time-variant and unknown. In the case of the noise signal, we establish the possibility, that the noise signal reaches the target signal sensor not only through the air, represented through the transfer function $C_n + A_n$, but also through mechanical vibrations, represented through the transfer function $C_n + B$. This circumstance, together with the fact, that the mechanical properties of CI system are fixed and therefore can be seen as time-invariant and known, allows us to apply an hybrid static/adaptive filter design for the ANR implementation, as described in chapter 2.5.2.\\ \\
The corrupted target signal $d[n]$ can therefore be mathematically described as:
Additionally, now the relevant transfer functions of the overall system are illustrated in Figure \ref{fig:fig_anr_implant}. The transfer functions $C_n$, $D_n$, and $E_n$ describe the path from the signal sources to the cochlear implant system. As the sources, the relative location of the user to the sources and the medium bewteen them can vary, these transfer functions are time-variant and unknown. After the signals reached the implant systems, we establish the possibility, that the remaining path of the signals to their respective sensors inside the CI system is fixed and therefore can be seen as time-invariant and known. This knowen transfer functions, which are titled $A$ and $B$, allow us to apply an hybrid static/adaptive filter design for the ANR implementation, as described in chapter 2.5.2.\\ \\
\begin{equation}
\label{equation_dn}
d[n] = s[n] + n[n] = t[n] * (D_n) + v[n] * (F_n)
d[n] = s[n] + n[n] = t[n] * (C_nA) + v[n] * (D_nA)
\end{equation}
where $t[n]$ and $v[n]$ are the target- and noise signals at their respective source, $s[n]$ is the recorded target signal and $v[n]$ is the recorded corruption noise after passing the transfer functions.\\ \\
The noise reference signal $x[n]$ can be mathematically described as:
\begin{equation}
\label{equation_xn}
x[n] = v[n] * (C_n * (A_n + B))
x[n] = v[n] * (E_nB)
\end{equation}
where $v[n]$ is the noise signal at its source and $x[n]$ is the recorded reference noise signal after passing the transfer functions.\\ \\
Another possible signal interaction could be the leakage of the target signal into the noise signal sensor, leading to the partial removal of the target signal from the output signal. This case is not illustrated in Figure \ref{fig:fig_anr_implant} as it won't be further evaluated in this thesis, but shall be mentioned for the sake of completeness.\\ \\

View File

@@ -1,8 +1,6 @@
\section{High level simulations}
The main purpose of the high-level simulations is to verify and demonstrate the theoretical approach of the previous chapters and to evaluate the performance of the proposed algorithms under various conditions. The simulations include different scenarios such as, different types of signals, various filter lengths and various step sizes. The goal is to verify different approaches before taking the step to the implementation of said algorithms on the low-power DSP.\\ \\
The main purpose of the high-level simulations is to verify and demonstrate the theoretical approach of the previous chapters and to evaluate the performance of the proposed algorithms under various conditions. The following simulations include different scenarios such as, different types of noise signals and different cosniderations of transfer functions. The goal is to verify different approaches before taking the step to the implementation of said algorithms on the low-power DSP.\\ \\
The implementation is conducted in Python, which provides a flexible environment for numerical computations and data visualization. The simulation is graphically represented using the Python library Matplotlib, allowing for clear visualization of the results.
\subsection{FIR filter implementation}
\subsection{IIR filter implementation}
\subsection{LMS algorithm implementation}
The high-level implementation of the LMS algorithm follows the theoretical framework outlined in Subchapter 2.5, specificially Equation \ref{equation_lms}. The algorithm is designed to adaptively filter out noise from a desired signal using a reference noise input. The implementation of the LMS-function includes the following key steps:
\begin{itemize}
@@ -46,10 +44,54 @@ The flow diagram in Figure \ref{fig:fig_lms_logic} illustrates the logical flow
\label{fig:fig_lms_code}
\caption{Code implementation of the LMS algorithm.}
\end{figure}
To evaltuate the performance, the LMS algorithm from Figure \ref{fig:fig_lms_code} is tested with a synthetic signal, which consists out of a chirp signal, overlain with a sine wave of 1000 Hz as noise. The reference noise input is the pure 10 Hz sine wave with the same frequency as the noise in the corrupted target signal.
\subsection{Simple LMS usecases}
To evaltuate the general functionality and performance of the LMS algorithm from Figure \ref{fig:fig_lms_code} a set of three simple, artificial scenarios are introduced. These examples shall serve as a showcase to demonstrate the general functionality, the possibilities and the limitations of the LMS algorithm. In contrary to a more complex and realistic setup, which will be reviewed afterwards, the clean signals are available, which is in a realistic application not the case.\\ \\
In all three scenarios, a chirp signal with a frequency range from 100-1000 Hz is used as the desired clean signal, which is then corrupted with a sine wave (Usecase 1 and 2) or a gaussian white noise (Usecase 3) as noise signal respectively. Every approach is conducted with 16 filter coefficients and a stepsize of 0.01. The three graphs in the repsective first plot show the corrputed target signal, the noise signal and the filter output. The two graphs in the respective second plot show the performance of the filter in form of the resulting error signal and the evolution of three filter coefficients over time.\\ \\
This artificial setup could be solved analitically, as the signals do not pass seperate, different transfer functions and would not require a LSM approach, but it allows to clearly evaluate the performance of the LMS algorithm, as the clean signal is known and can be compared to the output signal of the LMS filter. \\ \\
\subsubsection{Usecase 1: Sine noise with high frequency}
In the first usecase, a sine wave with a high frequency of 2000 Hz, which lies outside the frequency spectrum of the chirp, is used as noise signal to corrupt the target signal. The filter output in Figure \ref{fig:fig_plot_1_sine_1.png} shows a statisfying performance of the LMS algorithm, as the noise is almost completely removed from the target signal.
\begin{figure}[H]
\centering
\includegraphics[width=0.9\linewidth]{Bilder/fig_lms_simulation.png}
\caption{LMS simulation.}
\label{fig:fig_lms_simulation}
\end{figure}
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_1_sine_1.png}
\caption{Corrputed target signal, noise signal and filter output of Usecase 1}
\label{fig:fig_plot_1_sine_1.png}
\end{figure}
\noindent The error signal in Figure \ref{fig:fig_plot_2_sine_1.png} confirms this observation, as the signal converges basically to zero after 200 ms The evolution of the filter coefficients also indicates a quick convergence, meaning that the algorithm has adapted effectively to minimize the error over time.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_sine_1.png}
\caption{Error signal and filter coefficient evolution of Usecase 1}
\label{fig:fig_plot_2_sine_1.png}
\end{figure}
\subsubsection{Usecase 2: Sine noise with low frequency}
The second usecase resembles the first one, but instead of a high-frequency sine wave, a low-frequency sine wave with a frequency of 500 Hz is used as noise signal. This means, that the noise signal now overlaps with the frequency spectrum of the chirp signal, making the noise cancellation task more challenging, as an osciillation beacon in the area of 500 Hz appears. The filter output in Figure \ref{fig:fig_plot_1_sine_2.png} indicates that the LMS algorithm is still able to significantly reduce the noise from the target signal,
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_1_sine_2.png}
\caption{Corrputed target signal, noise signal and filter output of Usecase 2}
\label{fig:fig_plot_1_sine_2.png}
\end{figure}
\noindent Figure \ref{fig:fig_plot_2_sine_2.png} shows a significant increase of the amplitude of the error signal compared to Usecase 1, especially around the 500 Hz frequency of the noise signal. Also the adaption of the coefficients shows far more variance compared to Usecase 1, with a complete rearrangement in the area of 500 Hz. This indicates that the LMS algorithm is struggling to adapt effectively in a scenario, where the noise signal overlaps with the target signal.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_sine_2.png}
\caption{Error signal and filter coefficient evolution of Usecase 2}
\label{fig:fig_plot_2_sine_2.png}
\end{figure}
\subsubsection{Usecase 3: Gaussian white noise}
The last on of our three simplified usecases involves the use of a gaussian white noise signal as the noise signal to corrupt the target signal. This scenario represents a more realistic and complex situation, as white noise contains a broad spectrum of frequencies, making it more challenging for the LMS algorithm to effectively generate a clean output. The filter output in Figure \ref{fig:fig_plot_1_noise.png} demonstrates that the LMS algorithm is capable of significantly reducing the noise from the target signal, although the amplitude of the filter output varies, indicating difficulties adapting due to the broad frequency spectrum of the noise.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_1_noise.png}
\caption{Corrputed target signal, noise signal and filter output of Usecase 3}
\label{fig:fig_plot_1_noise.png}
\end{figure}
The error signal in Figure \ref{fig:fig_plot_2_noise.png} shows a noticeable variance compared to the previous usecases, especially at the beginning of the signal, where low frequencies dominate. The evolution of the filter coefficients show an interesting pattern, as only the coefficinet in the beginning adapts significantly, while the others remain relatively stable around zero. This suggests that the LMS algorithm is primarily focusing on adapting to the low-frequency components of the white noise, which are more dominant in the target signal.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_noise.png}
\caption{Error signal and filter coefficient evolution of Usecase 3}
\label{fig:fig_plot_2_noise.png}
\end{figure}
\subsection{Intermediate LMS usecases}
\subsection{Realisitic LMS usecases}

View File

@@ -1,10 +1,10 @@
\relax
\@writefile{toc}{\contentsline {section}{\numberline {4}Hardware and low-level simulation of different algorithm approaches}{29}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Hardware description}{29}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}System setup}{29}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Low-level simulations of different algorithm approaches}{29}{}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4}Hardware and low-level simulation of different algorithm approaches}{32}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Hardware description}{32}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}System setup}{32}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Low-level simulations of different algorithm approaches}{32}{}\protected@file@percent }
\@setckpt{chapter_04}{
\setcounter{page}{30}
\setcounter{page}{33}
\setcounter{equation}{21}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
@@ -18,7 +18,7 @@
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{20}
\setcounter{figure}{25}
\setcounter{table}{0}
\setcounter{float@type}{16}
\setcounter{tabx@nest}{0}
@@ -139,7 +139,7 @@
\setcounter{lstnumber}{21}
\setcounter{FancyVerbLine}{0}
\setcounter{linenumber}{1}
\setcounter{LN@truepage}{29}
\setcounter{LN@truepage}{32}
\setcounter{FancyVerbWriteLine}{0}
\setcounter{FancyVerbBufferLine}{0}
\setcounter{FV@TrueTabGroupLevel}{0}

View File

@@ -1,6 +1,6 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36" version="29.1.1">
<diagram name="Seite-1" id="BWOSVWQKrhK0Pcg9Olm2">
<mxGraphModel dx="1426" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<mxGraphModel dx="1188" dy="619" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
@@ -62,10 +62,10 @@
<mxPoint x="410" y="460" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-11" edge="1" parent="1" source="uwalZ4GZDBHuo1GNIbxM-2" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=0;entryY=0.208;entryDx=0;entryDy=0;entryPerimeter=0;" target="8LSkbo7Ni411-_OUStLd-7" value="">
<mxCell id="8LSkbo7Ni411-_OUStLd-11" edge="1" parent="1" source="uwalZ4GZDBHuo1GNIbxM-2" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="100" y="252.3" as="sourcePoint" />
<mxPoint x="270" y="252.3" as="targetPoint" />
<mxPoint x="270" y="252" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-12" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
@@ -148,15 +148,6 @@
<mxPoint x="890" y="410" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-7" edge="1" parent="1" source="ngw2JN3qWJ9t0b-mEEB_-3" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;exitX=0.875;exitY=0.4;exitDx=0;exitDy=0;exitPerimeter=0;" target="8LSkbo7Ni411-_OUStLd-7" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="270" y="270" />
</Array>
<mxPoint x="150" y="360" as="sourcePoint" />
<mxPoint x="370" y="360" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-9" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Helvetica; font-size: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: nowrap; background-color: rgb(236, 236, 236); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;&quot;&gt;e[n]&lt;/span&gt;" vertex="1">
<mxGeometry height="50" width="70" x="940" y="420" as="geometry" />
</mxCell>
@@ -169,32 +160,47 @@
<mxCell id="qO-CM7M714h87kHfMT8G-12" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;Digital Signal Processor&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="85" width="222.5" x="658.75" y="142.5" as="geometry" />
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-13" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;exitX=0.004;exitY=0.544;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" target="8LSkbo7Ni411-_OUStLd-8" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="270.96000000000004" y="460.1200000000001" as="sourcePoint" />
<mxPoint x="320" y="459" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-15" edge="1" parent="1" source="qO-CM7M714h87kHfMT8G-4" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeWidth=2;exitX=0;exitY=0.543;exitDx=0;exitDy=0;exitPerimeter=0;" target="8LSkbo7Ni411-_OUStLd-8" value="">
<mxCell id="qO-CM7M714h87kHfMT8G-15" edge="1" parent="1" source="qO-CM7M714h87kHfMT8G-4" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;exitX=0;exitY=0.543;exitDx=0;exitDy=0;exitPerimeter=0;" target="8LSkbo7Ni411-_OUStLd-8" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="270" y="330" as="sourcePoint" />
<mxPoint x="430" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-18" parent="1" style="text;whiteSpace=wrap;html=1;fontColor=light-dark(#E90C0C,#EDEDED);" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;F&lt;sub&gt;n&lt;/sub&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxCell id="qO-CM7M714h87kHfMT8G-18" parent="1" style="text;whiteSpace=wrap;html=1;fontColor=light-dark(#E90C0C,#EDEDED);" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;D&lt;sub&gt;n&lt;/sub&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="30" x="140" y="330" as="geometry" />
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-19" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;font style=&quot;color: rgb(233, 12, 12);&quot;&gt;C&lt;sub&gt;n&lt;/sub&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxCell id="qO-CM7M714h87kHfMT8G-19" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;font style=&quot;color: rgb(233, 12, 12);&quot;&gt;E&lt;sub&gt;n&lt;/sub&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="30" x="140" y="455" as="geometry" />
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-20" parent="1" style="text;whiteSpace=wrap;html=1;fontColor=light-dark(#e90c0c, #ededed);" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;D&lt;sub&gt;n&lt;/sub&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxCell id="qO-CM7M714h87kHfMT8G-20" parent="1" style="text;whiteSpace=wrap;html=1;fontColor=light-dark(#e90c0c, #ededed);" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;C&lt;sub&gt;n&lt;/sub&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="30" x="140" y="217" as="geometry" />
</mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-23" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;font style=&quot;color: rgb(0, 204, 102);&quot;&gt;B&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="30" x="280" y="460" as="geometry" />
<mxGeometry height="30" width="30" x="280" y="425" as="geometry" />
</mxCell>
<mxCell id="CDVbFaDyUANw4UToDavI-1" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;font style=&quot;color: rgb(233, 12, 12);&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;A&lt;sub&gt;n&lt;/sub&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="30" x="280" y="410" as="geometry" />
<mxCell id="sM4xvtsetW-iOXl8wo82-1" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=-0.002;entryY=0.157;entryDx=0;entryDy=0;entryPerimeter=0;" target="qO-CM7M714h87kHfMT8G-4" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="80" y="455" as="sourcePoint" />
<mxPoint x="265" y="455" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="sM4xvtsetW-iOXl8wo82-2" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=0.003;entryY=0.194;entryDx=0;entryDy=0;entryPerimeter=0;" target="8LSkbo7Ni411-_OUStLd-7" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="265" y="252.07999999999998" as="sourcePoint" />
<mxPoint x="450" y="252.07999999999998" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="sM4xvtsetW-iOXl8wo82-3" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=0.001;entryY=0.621;entryDx=0;entryDy=0;entryPerimeter=0;" target="8LSkbo7Ni411-_OUStLd-7" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="270" y="277.58" as="sourcePoint" />
<mxPoint x="335" y="277.5" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="sM4xvtsetW-iOXl8wo82-5" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;font style=&quot;color: rgb(0, 204, 102);&quot;&gt;A&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="30" x="280" y="220" as="geometry" />
</mxCell>
<mxCell id="sM4xvtsetW-iOXl8wo82-6" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;color: rgb(0, 204, 102); font-family: Helvetica; font-size: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(236, 236, 236); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;&quot;&gt;A&lt;/span&gt;" vertex="1">
<mxGeometry height="50" width="50" x="280" y="277.5" as="geometry" />
</mxCell>
</root>
</mxGraphModel>