Compare commits

..

10 Commits

Author SHA1 Message Date
Patrick Hangl
8acc132548 5.4 2026-03-19 16:30:42 +01:00
Patrick Hangl
44a38a429b 5.3 2026-03-10 11:15:02 +01:00
Patrick Hangl
0ac01e1f76 Plots überarbeitet 2026-03-02 21:17:31 +01:00
4e92e5d9bc Rechtschreibfehler 2026-03-01 12:26:00 +01:00
Patrick Hangl
30b3376676 High-Level Plots neu 2026-02-27 12:27:50 +01:00
Patrick Hangl
9651256442 Plots upgedatet, hybirder Ansatz raus 2026-02-25 10:50:59 +01:00
Patrick Hangl
61ad5c514b 4.3.3 2026-02-12 15:05:45 +01:00
Patrick Hangl
0ee96f9c01 4.3.3 2026-02-10 16:33:26 +01:00
Patrick Hangl
80012ce7d8 4.3 2026-02-06 13:08:46 +01:00
Patrick Hangl
2c8c9cdf2d update .gitignore 2026-02-06 12:40:10 +01:00
42 changed files with 1035 additions and 227 deletions

2
.gitignore vendored
View File

@@ -13,3 +13,5 @@ main.pdf
main.toc main.toc
main.run.xml main.run.xml
main.synctex.gz main.synctex.gz
acronyms.aux
chapter_04.aux

View File

@@ -1 +1,4 @@
AFTERWARDS_US AFTERWARDS_US
MORFOLOGIK_RULE_EN_US
SENTENCE_WHITESPACE
MORFOLOGIK_RULE_EN_US

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

BIN
Bilder/fig_c_total.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 992 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 960 KiB

After

Width:  |  Height:  |  Size: 1000 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 943 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 983 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 685 KiB

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 652 KiB

After

Width:  |  Height:  |  Size: 547 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 KiB

After

Width:  |  Height:  |  Size: 590 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 956 KiB

After

Width:  |  Height:  |  Size: 812 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 KiB

View File

@@ -17,6 +17,7 @@
\newacro{ARM}[\AC@hyperlink{ARM}{ARM}]{Advanced RISC Machine} \newacro{ARM}[\AC@hyperlink{ARM}{ARM}]{Advanced RISC Machine}
\newacro{RISC}[\AC@hyperlink{RISC}{RISC}]{Reduced Instruction Set Computer} \newacro{RISC}[\AC@hyperlink{RISC}{RISC}]{Reduced Instruction Set Computer}
\newacro{SOC}[\AC@hyperlink{SOC}{SOC}]{System-on-Chip} \newacro{SOC}[\AC@hyperlink{SOC}{SOC}]{System-on-Chip}
\newacro{SNR}[\AC@hyperlink{SNR}{SNR}]{Signal-to-Noise Ratio}
\@setckpt{acronyms}{ \@setckpt{acronyms}{
\setcounter{page}{5} \setcounter{page}{5}
\setcounter{equation}{0} \setcounter{equation}{0}

View File

@@ -18,4 +18,5 @@
\acro{ARM}{Advanced RISC Machine} \acro{ARM}{Advanced RISC Machine}
\acro{RISC}{Reduced Instruction Set Computer} \acro{RISC}{Reduced Instruction Set Computer}
\acro{SOC}{System-on-Chip} \acro{SOC}{System-on-Chip}
\acro{SNR}{Signal-to-Noise Ratio}
\end{acronym} \end{acronym}

View File

@@ -132,7 +132,6 @@ To reduce the required computing power, a hybrid static/adaptive filter design c
\caption{Hybrid adaptive filter design for noise reduction with a static part and an adaptive part.} \caption{Hybrid adaptive filter design for noise reduction with a static part and an adaptive part.}
\label{fig:fig_anr_hybrid} \label{fig:fig_anr_hybrid}
\end{figure} \end{figure}
\noindent Different approaches of the hybrid static/adaptive filter design will be evaluated and compared in regard of their required computing power in a later chapter of this thesis.
\subsection{Adaptive optimization strategies} \subsection{Adaptive optimization strategies}
In the description of the concept of adaptive filtering above, the adaption of filter coefficients due to an error metric was mentioned but not further explained. The following subchapters shall cover the most important aspects of filter optimization in regard of adaptive noise reduction. In the description of the concept of adaptive filtering above, the adaption of filter coefficients due to an error metric was mentioned but not further explained. The following subchapters shall cover the most important aspects of filter optimization in regard of adaptive noise reduction.
\subsubsection{Filter optimization and error metrics} \subsubsection{Filter optimization and error metrics}
@@ -277,7 +276,7 @@ The following definitions of the involved signals shall help to better understan
\item Filter output / Cleaned signal: The output signal of the \ac{ANR} algorithm, representing the desired signal after noise reduction. This signal also equals the error signal of the adaptive filter. \item Filter output / Cleaned signal: The output signal of the \ac{ANR} algorithm, representing the desired signal after noise reduction. This signal also equals the error signal of the adaptive filter.
\end{itemize} \end{itemize}
The primary sensor receives the desired- and noise signal over their respective transfer functions and outputs the corrupted signal $d[n]$, which consists out of the recorded desired signal $s[n]$ and the 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.\\ \\ The primary sensor receives the desired- and noise signal over their respective transfer functions and outputs the corrupted signal $d[n]$, which consists out of the recorded desired signal $s[n]$ and the 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 $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 between 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 is mainly depended on the sensitivity curve of the respective sensors and therefore can be seen as time-invariant and known. This known transfer functions, which are titled $A$ and $B$, allow us to apply a hybrid static/adaptive filter design for the \ac{ANR} implementation, as described in chapter 2.5.2.\\ \\ 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 between 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 is mainly depended on the sensitivity curve of the respective sensors and therefore can be seen as time-invariant and known.\\ \\
\begin{equation} \begin{equation}
\label{equation_dn} \label{equation_dn}
d[n] = s[n] + n[n] = t[n] * (C_nA) + v[n] * (D_nA) d[n] = s[n] + n[n] = t[n] * (C_nA) + v[n] * (D_nA)

View File

@@ -44,11 +44,18 @@ The flow diagram in Figure \ref{fig:fig_anr_logic} illustrates the logical flow
\caption{High-level implementation of the \ac{ANR} algorithm in Python} \caption{High-level implementation of the \ac{ANR} algorithm in Python}
\label{fig:fig_anr_code} \label{fig:fig_anr_code}
\end{figure} \end{figure}
\noindent The algorithm implementation shall now be put under test by different use cases to demonstrate the functionality and performance under different scenarios, varying from simple to complex ones. Every use case includes graphical representations of the desired signal, the corrupted signal, the reference noise signal, the filter output, the error signal and the evolution of selected filter coefficients over time. In contrary to a realistic setup, the desired signal is available, allowing to evaluate the performance of the algorithm in a clear way. The performance of the \ac{ANR} algorithm is evaluated based on the error between the desired signal and the filter output, complemented with the normalized integrated squared error. \noindent The algorithm implementation shall now be put under test by different use cases to demonstrate the functionality and performance under different scenarios, varying from simple to complex ones. Every use case includes graphical representations of the desired signal, the corrupted signal, the reference noise signal, the filter output, the error signal and the evolution of selected filter coefficients over time. In contrary to a realistic setup, the desired signal is available, allowing to evaluate the performance of the algorithm based on the \ac{SNR}-Gain in dB and also visually by the amplitude of the error signal (difference between the desired signal and the filter output). The error signal and the \ac{SNR}-Gain are calculated as follows:
\begin{gather}
\label{equation_snr_gain_error}
P_{Error-signal} = P_{Desired-signal} - P_{Filter-output} \\
\label{equation_snr_gain}
SNR\text{-}Gain = 10 \cdot \log_{10}\frac{P_{Desired-signal}}{P_{Noise-signal}} - 10 \cdot \log_{10}\frac{P_{Desired-signal}}{P_{Error-signal}}
\end{gather}
with $P_{Desired-signal}$ being the power of the desired signal, $P_{Noise-signal}$ being the power of the noise signal and $P_{Error-signal}$ being the power of the error signal, which is the difference between the desired signal and the filter output. A positive \ac{SNR}-Gain indicates an improvement in signal quality, while a negative \ac{SNR}-Gain indicates a degradation in signal quality after applying the \ac{ANR} algorithm.
\subsection{Simple ANR use cases} \subsection{Simple ANR use cases}
To evaluate the general functionality and performance of the \ac{ANR} algorithm from Figure \ref{fig:fig_anr_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 \ac{ANR} algorithm.\\ \\ To evaluate the general functionality and performance of the \ac{ANR} algorithm from Figure \ref{fig:fig_anr_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 \ac{ANR} algorithm.\\ \\
In all three scenarios, a chirp signal with a frequency range from 100-1000 Hz is used as the desired signal, which is then corrupted with a sine wave (Use case 1 and 2) or a Gaussian white noise (Use case 3) as noise signal respectively. In this simple setup, the corruption noise signal is also available as the reference noise signal. Every approach is conducted with 16 filter coefficients and a step size of 0.01. The four graphs in the respective first plot show the desired signal, the corrupted signal, the reference 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.\\ \\ In all three scenarios, a chirp signal with a frequency range from 100-1000 Hz is used as the desired signal, which is then corrupted with a sine wave (Use case 1 and 2) or a Gaussian white noise (Use case 3) as noise signal respectively. In this simple setup, the corruption noise signal is also available as the reference noise signal. Every approach is conducted with 16 filter coefficients and a step size of 0.01. The four graphs in the respective first plot show the desired signal, the corrupted signal, the reference 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.\\ \\
\noindent This artificial setup could be solved analytically, as the signals do not pass separate, different transfer functions, meaning, that the reference noise signal is the same as the corruption noise signal. Though, this simple setup would not require an adaptive filter approach, it nevertheless allows to clearly evaluate the performance of the \ac{ANR} algorithm in different scenarios. Also, due to the fact that the desired signal is known, it is possible to graphically evaluate the performance of the algorithm in a simple way. \noindent This artificial setup could be solved analytically, as the signals do not pass separate, different transfer functions, meaning, that the reference noise signal is the same as the corruption noise signal. Though, this simple setup would not require an adaptive filter approach, it nevertheless allows to clearly evaluate the performance of the \ac{ANR} algorithm in different scenarios. Also, due to the fact that the desired signal is known, it is possible to evaluate the performance of the algorithm in a simple way.
\subsubsection{Simple use case 1: Sine noise at 2000 Hz} \subsubsection{Simple use case 1: Sine noise at 2000 Hz}
In the first use case, a sine wave with a frequency of 2000 Hz, which lies outside the frequency spectrum of the chirp, is used as noise signal to corrupt the desired signal. The shape of the initial desired signal is still clearly recognizable, even if its shape is affected in the higher frequency area. The filter output in Figure \ref{fig:fig_plot_1_sine_1.png} shows a satisfying performance of the \ac{ANR} algorithm, as the noise is almost completely removed from the corrupted signal after the filter coefficients have adapted. In the first use case, a sine wave with a frequency of 2000 Hz, which lies outside the frequency spectrum of the chirp, is used as noise signal to corrupt the desired signal. The shape of the initial desired signal is still clearly recognizable, even if its shape is affected in the higher frequency area. The filter output in Figure \ref{fig:fig_plot_1_sine_1.png} shows a satisfying performance of the \ac{ANR} algorithm, as the noise is almost completely removed from the corrupted signal after the filter coefficients have adapted.
\begin{figure}[H] \begin{figure}[H]
@@ -57,7 +64,7 @@ In the first use case, a sine wave with a frequency of 2000 Hz, which lies outsi
\caption{Desired signal, corrupted signal, reference noise signal and filter output of simple use case 1} \caption{Desired signal, corrupted signal, reference noise signal and filter output of simple use case 1}
\label{fig:fig_plot_1_sine_1.png} \label{fig:fig_plot_1_sine_1.png}
\end{figure} \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. \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 500 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] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_sine_1.png} \includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_sine_1.png}
@@ -87,7 +94,7 @@ The last on of our three simplified use cases involves the use of a Gaussian whi
\caption{Desired signal, corrupted signal, reference noise signal and filter output of simple use case 3} \caption{Desired signal, corrupted signal, reference noise signal and filter output of simple use case 3}
\label{fig:fig_plot_1_noise.png} \label{fig:fig_plot_1_noise.png}
\end{figure} \end{figure}
\noindent The error signal in Figure \ref{fig:fig_plot_2_noise.png} shows a noticeable variance compared to the previous use cases, especially at the beginning of the signal, where low frequencies dominate. The evolution of the filter coefficients show an interesting pattern, as only the coefficient in the beginning adapts significantly, while the others remain relatively stable around zero. \noindent The error signal in Figure \ref{fig:fig_plot_2_noise.png} shows a noticeable variance compared to the previous use cases, especially at the beginning of the signal, where low frequencies dominate. The evolution of the filter coefficients show an interesting pattern, as only the coefficient in the beginning adapts significantly, while the others remain relatively stable around zero. Also the \ac{SNR}-Gain of this use case is significantly lower compared to the previous use cases, which can be explained by the fact that the noise signal contains a broad spectrum of frequencies, making it more difficult for the \ac{ANR} algorithm to effectively isolate and reduce the noise from the desired signal.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_noise.png} \includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_noise.png}
@@ -109,11 +116,10 @@ After the general functionality of the \ac{ANR} algorithm has been verified with
\caption{Error signal and filter coefficient evolution of the intermediate \ac{ANR} use case} \caption{Error signal and filter coefficient evolution of the intermediate \ac{ANR} use case}
\label{fig:fig_plot_2_wav.png} \label{fig:fig_plot_2_wav.png}
\end{figure} \end{figure}
\noindent The error signal in Figure \ref{fig:fig_plot_2_wav.png} confirms the function of the algorithm and shows peaks corresponding to the spikes in the breathing noise, indicating the moments, when the \ac{ANR} algorithm is setting its coefficients again to adapt to the changing noise characteristics. It makes sense, that the adaption of the filter coefficients causes repeating spikes in the error signal, as the noise signal now is not static or periodic, but rather dynamic and changing it frequency and amplitude over time. \noindent The error signal in Figure \ref{fig:fig_plot_2_wav.png} confirms the function of the algorithm and shows maxima corresponding to the maxima in the breathing noise, indicating the moments, when the \ac{ANR} algorithm is setting its coefficients again to adapt to the changing noise characteristics. It makes sense, that the adaption of the filter coefficients causes repeating maxima in the error signal, as the noise signal now is not static or periodic, but rather dynamic and changing it frequency and amplitude over time. The \ac{SNR}-Gain of 6.51 dB also indicates a significant improvement in signal quality and can be compared againtst the complex use case in the next subchapter, where the same audio tracks are used, but now with different transfer functions applied to them.
\subsection{Complex ANR use case} \subsection{Complex ANR use case}
To close the topic of high-level simulations of the \ac{ANR} algorithm, a more complex and realistic use case is finally introduced. In this scenario, the same two audio tracks of the previous use case are used - but now they pass different transfer functions. Now, an analytical solution is not possible anymore, as the transfer functions affect the signals in different ways, making it impossible to simply subtract the noise signal from the corrupted signal. This scenario represents a more realistic application of the \ac{ANR} algorithm, as it involves complex audio signals with varying frequency components and dynamics, as well as different transfer functions affecting the signals.\\ \\ To close the topic of high-level simulations of the \ac{ANR} algorithm, a more complex and realistic use case is finally introduced. In this scenario, the same two audio tracks of the previous use case are used - but now they pass different transfer functions. Now, an analytical solution is not possible anymore, as the transfer functions affect the signals in different ways, making it impossible to simply subtract the noise signal from the corrupted signal. This scenario represents a more realistic application of the \ac{ANR} algorithm, as it involves complex audio signals with varying frequency components and dynamics, as well as different transfer functions affecting the signals.\\ \\
Different transfer functions represent the reality of different sensors recording the corrupted signal and the reference noise signal with a specific frequency response characteristic - this circumstance is especially important, as later a fixed set of filter coefficients shall take care of the predictable part of the signal to reduce the computing power of the \ac{DSP}.\\ Therefore, the audio tracks from the previous example are now convolved with different transfer functions, which mimic the case, that the sensor recording the corrupted signal, shows another frequency response characteristic as the one recording the reference noise signal. This means, that the reference noise signal is now not only differs from the noise signal corrupting the desired signal, making adaptive noise reduction the only feasible approach to reduce the noise from the corrupted signal.
Therefore, the audio tracks from the previous example are now convolved with different transfer functions, which mimic the case, that the sensor recording the corrupted signal, shows another frequency response characteristic as the one recording the reference noise signal. This means, that the reference noise signal is now different to the noise signal corrupting the desired signal, making adaptive noise reduction the only feasible approach to reduce the noise from the corrupted signal.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_3_wav_complex.png} \includegraphics[width=1.0\linewidth]{Bilder/fig_plot_3_wav_complex.png}
@@ -127,14 +133,14 @@ Therefore, the audio tracks from the previous example are now convolved with dif
\caption{The raw noise signal recorded with two different sensors, showing the effect of different transfer functions on the signal} \caption{The raw noise signal recorded with two different sensors, showing the effect of different transfer functions on the signal}
\label{fig:fig_plot_4_wav_complex.png} \label{fig:fig_plot_4_wav_complex.png}
\end{figure} \end{figure}
\noindent To evaluate the performance of the \ac{ANR} algorithm in this complex scenario, the corrupted signal is recorded with the primary sensor while the reference noise signal is recorded with secondary sensor. The filter output in Figure \ref{fig:fig_plot_1_wav_complex.png} indicates, that the \ac{ANR} algorithm is still capable of significantly reducing the noise from the corrupted signal, even with the reference noise signal being different from the corruption noise signal. \noindent To evaluate the performance of the \ac{ANR} algorithm in this complex scenario, the corrupted signal is recorded with the primary sensor while the reference noise signal is recorded with secondary sensor. The filter output and \ac{SNR}-Ratio in Figure \ref{fig:fig_plot_1_wav_complex.png} display with 6.98 dB a an even slightly better performance compared to the previous use case. This bevavior is explainable by the fact, that depending on the transfer functions of the sensors, for some signals the adaptation process might be more effective than for others.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_1_wav_complex.png} \includegraphics[width=1.0\linewidth]{Bilder/fig_plot_1_wav_complex.png}
\caption{Desired signal, corrupted signal, reference noise signal and filter output of the complex \ac{ANR} use case} \caption{Desired signal, corrupted signal, reference noise signal and filter output of the complex \ac{ANR} use case}
\label{fig:fig_plot_1_wav_complex.png} \label{fig:fig_plot_1_wav_complex.png}
\end{figure} \end{figure}
\noindent The error signal in Figure \ref{fig:fig_plot_2_wav_complex.png} shows an even better performance compared to the previous intermediate use case, indicating that the \ac{ANR} algorithm is effectively adapting its filter coefficients. The performance increase can be explained by the fact, that the transfer functions applied to the signals have attenuated certain frequency components of the noise signal, making it easier for the \ac{ANR} algorithm to isolate and reduce the noise from the corrupted signal. Also, the corruption noise signal is reduced in amplitude, whereas the reference noise signal is amplified in certain frequency areas, which helps the \ac{ANR} algorithm to better identify and cancel out the noise components from the corrupted signal. \noindent The error signal in Figure \ref{fig:fig_plot_2_wav_complex.png} shows, as expected, also a similar amplitude compared to the previous intermediate use case, indicating that the \ac{ANR} algorithm is still working fine. The \ac{SNR}-Gain of 6.98 dB indicates a quite sucessful noise reduction, even with just 16 taps in this more complex scenario.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_wav_complex.png} \includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_wav_complex.png}

View File

@@ -1,28 +1,28 @@
\relax \relax
\@writefile{toc}{\contentsline {section}{\numberline {4}Hardware implementation and optimization of the ANR Algorithm on a low-power system}{40}{}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4}Hardware implementation and performance quantization of the ANR Algorithm on a low-power system}{42}{}\protected@file@percent }
\acronymused{ANR} \acronymused{ANR}
\acronymused{CI} \acronymused{CI}
\acronymused{ANR} \acronymused{ANR}
\acronymused{ANR} \acronymused{ANR}
\acronymused{ANR} \acronymused{ANR}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Low-power system architecture and integration}{40}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Low-power system architecture and integration}{42}{}\protected@file@percent }
\AC@undonewlabel{acro:SOC} \AC@undonewlabel{acro:SOC}
\newlabel{acro:SOC}{{4.1}{40}{}{}{}} \newlabel{acro:SOC}{{4.1}{42}{}{}{}}
\acronymused{SOC} \acronymused{SOC}
\AC@undonewlabel{acro:ARM} \AC@undonewlabel{acro:ARM}
\newlabel{acro:ARM}{{4.1}{40}{}{}{}} \newlabel{acro:ARM}{{4.1}{42}{}{}{}}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.1}ARM and DSP hardware architecture overview}{40}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.1}ARM and DSP hardware architecture overview}{42}{}\protected@file@percent }
\acronymused{ARM} \acronymused{ARM}
\acronymused{ARM} \acronymused{ARM}
\acronymused{CI} \acronymused{CI}
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
\AC@undonewlabel{acro:MAC} \AC@undonewlabel{acro:MAC}
\newlabel{acro:MAC}{{4.1.1}{40}{}{}{}} \newlabel{acro:MAC}{{4.1.1}{42}{}{}{}}
\acronymused{MAC} \acronymused{MAC}
\acronymused{ARM} \acronymused{ARM}
\acronymused{ANR} \acronymused{ANR}
@@ -37,10 +37,10 @@
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\AC@undonewlabel{acro:DMA} \AC@undonewlabel{acro:DMA}
\newlabel{acro:DMA}{{4.1.1}{41}{}{}{}} \newlabel{acro:DMA}{{4.1.1}{43}{}{}{}}
\acronymused{DMA} \acronymused{DMA}
\AC@undonewlabel{acro:PCM} \AC@undonewlabel{acro:PCM}
\newlabel{acro:PCM}{{4.1.1}{41}{}{}{}} \newlabel{acro:PCM}{{4.1.1}{43}{}{}{}}
\acronymused{PCM} \acronymused{PCM}
\acronymused{DSP} \acronymused{DSP}
\acronymused{PCM} \acronymused{PCM}
@@ -51,13 +51,13 @@
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
\AC@undonewlabel{acro:ALU} \AC@undonewlabel{acro:ALU}
\newlabel{acro:ALU}{{4.1.1}{41}{}{}{}} \newlabel{acro:ALU}{{4.1.1}{43}{}{}{}}
\acronymused{ALU} \acronymused{ALU}
\acronymused{DSP} \acronymused{DSP}
\acronymused{MAC} \acronymused{MAC}
\acronymused{ALU} \acronymused{ALU}
\acronymused{MAC} \acronymused{MAC}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}Inter-core communication mechanisms}{41}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}Intercore communication mechanisms}{43}{}\protected@file@percent }
\acronymused{CI} \acronymused{CI}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
@@ -65,12 +65,12 @@
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ARM} \acronymused{ARM}
\@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces Simplified visualization of the interaction between the \ac {CI}-System, the \ac {ARM} core and the \ac {DSP} core, making use of the \ac {PCM} interface and shared memory for audio data exchange.}}{42}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces Simplified visualization of the interaction between the \ac {CI}-System, the \ac {ARM} core and the \ac {DSP} core, making use of the \ac {PCM} interface and shared memory for audio data exchange.}}{44}{}\protected@file@percent }
\acronymused{CI} \acronymused{CI}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\acronymused{PCM} \acronymused{PCM}
\newlabel{fig:fig_dsp_setup.jpg}{{32}{42}{}{}{}} \newlabel{fig:fig_dsp_setup.jpg}{{32}{44}{}{}{}}
\acronymused{ARM} \acronymused{ARM}
\acronymused{PCM} \acronymused{PCM}
\acronymused{DMA} \acronymused{DMA}
@@ -82,12 +82,12 @@
\acronymused{DSP} \acronymused{DSP}
\acronymused{DMA} \acronymused{DMA}
\acronymused{PCM} \acronymused{PCM}
\@writefile{lof}{\contentsline {figure}{\numberline {33}{\ignorespaces Simplified flowchart of the sample processing between the \ac {ARM} core and the \ac {DSP} core via interrupts and shared memory.}}{43}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {33}{\ignorespaces Simplified flowchart of the sample processing between the \ac {ARM} core and the \ac {DSP} core via interrupts and shared memory.}}{45}{}\protected@file@percent }
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\newlabel{fig:fig_dsp_comm.jpg}{{33}{43}{}{}{}} \newlabel{fig:fig_dsp_comm.jpg}{{33}{45}{}{}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Software architecture and execution flow}{43}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Software architecture and execution flow}{45}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.1}ARMDSP communication and data exchange details}{43}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.1}ARMDSP communication and data exchange details}{45}{}\protected@file@percent }
\acronymused{ANR} \acronymused{ANR}
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
@@ -117,11 +117,11 @@
\acronymused{PCM} \acronymused{PCM}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\@writefile{lof}{\contentsline {figure}{\numberline {34}{\ignorespaces Detailed visualization of the \ac {DMA} operations between the PCM interface to the shared memory section. When the memory buffer occupied, an interrupt is triggerd, either to the \ac {DSP} core or to the \ac {ARM} core, depending if triggered during a Read- or Write-operation.}}{45}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {34}{\ignorespaces Detailed visualization of the \ac {DMA} operations between the PCM interface to the shared memory section. When the memory buffer occupied, an interrupt is triggered, either to the \ac {DSP} core or to the \ac {ARM} core, depending on, if triggered during a Read- or Write-operation.}}{47}{}\protected@file@percent }
\acronymused{DMA} \acronymused{DMA}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ARM} \acronymused{ARM}
\newlabel{fig:fig_dsp_dma.jpg}{{34}{45}{}{}{}} \newlabel{fig:fig_dsp_dma.jpg}{{34}{47}{}{}{}}
\acronymused{DMA} \acronymused{DMA}
\acronymused{DMA} \acronymused{DMA}
\acronymused{PCM} \acronymused{PCM}
@@ -131,18 +131,18 @@
\acronymused{ARM} \acronymused{ARM}
\acronymused{ANR} \acronymused{ANR}
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.2}System control flow and main processing loop}{45}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.2}System control flow and main processing loop}{47}{}\protected@file@percent }
\acronymused{ANR} \acronymused{ANR}
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {paragraph}{Memory initialization and mapping}{45}{}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{Memory initialization and mapping}{47}{}\protected@file@percent }
\acronymused{DSP} \acronymused{DSP}
\acronymused{PCM} \acronymused{PCM}
\acronymused{DSP} \acronymused{DSP}
\newlabel{fig:fig_dps_code_memory}{{4.2.2}{46}{}{}{}} \newlabel{fig:fig_dps_code_memory}{{4.2.2}{48}{}{}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {35}{\ignorespaces Low-level implementation: Memory initialization and mapping}}{46}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {35}{\ignorespaces Low-level implementation: Memory initialization and mapping}}{48}{}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {36}{\ignorespaces Exemplary memory map of the 4-element input buffer array. As it is initialized as a 16 bit integer array, each element occupies 2 bytes of memory, resulting in a total size of 8 bytes for the entire array. As the DSP architecture works in 32-bit double-words, the bytewise adressing is a result of the compiler abstraction.}}{46}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {36}{\ignorespaces Exemplary memory map of the 4-element input buffer array. As it is initialized as a 16-bit integer array, each element occupies 2 bytes of memory, resulting in a total size of 8 bytes for the entire array. As the DSP architecture works in 32-bit double-words, the bytewise addressing is a result of the compiler abstraction.}}{48}{}\protected@file@percent }
\newlabel{fig:fig_compiler.jpg}{{36}{46}{}{}{}} \newlabel{fig:fig_compiler.jpg}{{36}{48}{}{}{}}
\@writefile{toc}{\contentsline {paragraph}{Main loop and interrupt handling}{46}{}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{Main loop and interrupt handling}{48}{}\protected@file@percent }
\acronymused{DSP} \acronymused{DSP}
\acronymused{ANR} \acronymused{ANR}
\acronymused{ARM} \acronymused{ARM}
@@ -150,40 +150,79 @@
\acronymused{DSP} \acronymused{DSP}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\@writefile{lof}{\contentsline {figure}{\numberline {37}{\ignorespaces Low-level implementation: Main loop and interrupt handling}}{47}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {37}{\ignorespaces Low-level implementation: Main loop and interrupt handling}}{49}{}\protected@file@percent }
\newlabel{fig:fig_dps_code_mainloop}{{37}{47}{}{}{}} \newlabel{fig:fig_dps_code_mainloop}{{37}{49}{}{}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {38}{\ignorespaces Flow diagram of the code implementation of the main loop and interrupt handling on the \ac {DSP} core.}}{48}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {38}{\ignorespaces Flow diagram of the code implementation of the main loop and interrupt handling on the \ac {DSP} core.}}{50}{}\protected@file@percent }
\acronymused{DSP} \acronymused{DSP}
\newlabel{fig:fig_dsp_logic.jpg}{{38}{48}{}{}{}} \newlabel{fig:fig_dsp_logic.jpg}{{38}{50}{}{}{}}
\@writefile{toc}{\contentsline {paragraph}{Calc()-function}{48}{}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{calculate\_output()-function}{50}{}\protected@file@percent }
\acronymused{DSP} \acronymused{DSP}
\acronymused{ANR} \acronymused{ANR}
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}DSP-level implementation of the ANR algorithm}{49}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.3}DSP-level implementation of the ANR algorithm}{51}{}\protected@file@percent }
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.1}DSP-specific optimizations for real-time processing}{49}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.1}DSP-specific optimizations for real-time processing}{51}{}\protected@file@percent }
\acronymused{ANR} \acronymused{ANR}
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {paragraph}{Logic operations}{49}{}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{Logic operations}{51}{}\protected@file@percent }
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
\@writefile{lof}{\contentsline {figure}{\numberline {39}{\ignorespaces Manual implementation of function, returning the maximum of two integer values, taking 12 cycles to execute. The intrinsic functions of the DSP compiler allows a 4-cycle implementation of such an operations.}}{49}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {39}{\ignorespaces Manual implementation of a max-function, returning the maximum of two integer values, taking 12 cycles to execute. The intrinsic functions of the DSP compiler allows a 4-cycle implementation of such an operation.}}{51}{}\protected@file@percent }
\newlabel{fig:fig_dsp_code_find_max}{{39}{49}{}{}{}} \newlabel{fig:fig_dsp_code_find_max}{{39}{51}{}{}{}}
\@writefile{toc}{\contentsline {paragraph}{Cyclic array iteration}{49}{}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{Cyclic array iteration}{51}{}\protected@file@percent }
\acronymused{ANR} \acronymused{ANR}
\@writefile{lof}{\contentsline {figure}{\numberline {40}{\ignorespaces Manual implementation of a cyclic array iteration function in C, taking the core 20 cycles to execute an pointer inremen of 1. The intrinsic functions of the DSP compiler allows a single-cycle implementation of such cyclic additions.}}{50}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {40}{\ignorespaces Manual implementation of a cyclic array iteration function in C, taking the core 20 cycles to execute a pointer inremen of 1. The intrinsic functions of the DSP compiler allows a single-cycle implementation of such cyclic additions.}}{52}{}\protected@file@percent }
\newlabel{fig:fig_dsp_code_cyclic_add}{{40}{50}{}{}{}} \newlabel{fig:fig_dsp_code_cyclic_add}{{40}{52}{}{}{}}
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {paragraph}{Fractional fixed-point arithmetic}{50}{}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{Fractional fixed-point arithmetic}{52}{}\protected@file@percent }
\acronymused{DSP} \acronymused{DSP}
\acronymused{MAC} \acronymused{MAC}
\acronymused{ALU} \acronymused{ALU}
\acronymused{DSP} \acronymused{DSP}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.2}Performance evaluation and quantization of the DSP implementation}{50}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.2}Performance quantization of the ANR calculation}{52}{}\protected@file@percent }
\acronymused{ANR}
\acronymused{DSP}
\acronymused{FIR}
\acronymused{FIR}
\acronymused{DSP}
\@writefile{toc}{\contentsline {paragraph}{write\_buffer}{53}{}\protected@file@percent }
\acronymused{DSP}
\@writefile{toc}{\contentsline {paragraph}{apply\_fir\_filter}{53}{}\protected@file@percent }
\acronymused{FIR}
\acronymused{MAC}
\acronymused{DSP}
\acronymused{DSP}
\@writefile{lof}{\contentsline {figure}{\numberline {41}{\ignorespaces Code snippet of the $apply\_fir\_filter$-function, showing the use of the dual \ac {MAC} architecture of the \ac {DSP} and the fractional multiplication function. The loop iterates through the filter coefficients and reference noise signal samples, performing two multiplications and two additions in each cycle.}}{54}{}\protected@file@percent }
\acronymused{MAC}
\acronymused{DSP}
\newlabel{fig:fig_dsp_code_apply_fir_filter}{{41}{54}{}{}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {42}{\ignorespaces Visualization of the FIR filter calculation in the $apply\_fir\_filter$-function during the 2nd cyclce of a calculation loop. The reference noise signal samples are stored in the sample line, while the filter coefficients are stored in a separate memory section (filter line).}}{54}{}\protected@file@percent }
\newlabel{fig:fig_dsp_fir_cycle.jpg}{{42}{54}{}{}{}}
\@writefile{toc}{\contentsline {paragraph}{update\_output}{55}{}\protected@file@percent }
\@writefile{toc}{\contentsline {paragraph}{update\_filter\_coefficient}{55}{}\protected@file@percent }
\acronymused{DSP}
\acronymused{MAC}
\@writefile{lof}{\contentsline {figure}{\numberline {43}{\ignorespaces Code snippet of the $update\_filter\_coefficient$-function, again making use of the dual \ac {MAC} architecture of the \ac {DSP} and the fractional multiplication function. Additionaly, 32-bit values are loaded and stored as 64-bit values, using two also intrinisc functions, allowing to update two filter coefficients in a single cycle.}}{55}{}\protected@file@percent }
\acronymused{MAC}
\acronymused{DSP}
\newlabel{fig:fig_dsp_code_update_filter_coefficients}{{43}{55}{}{}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {44}{\ignorespaces Visualization of the coefficient calculation in the $update\_filter\_coefficient$-function during the 2nd cyclce of a calculation loop. The output is multiplied with the step size and the corresponding sample from the sample line, before being added to the current filter coefficient.}}{56}{}\protected@file@percent }
\newlabel{fig:fig_dsp_coefficient_cycle.jpg}{{44}{56}{}{}{}}
\@writefile{toc}{\contentsline {paragraph}{write\_output}{56}{}\protected@file@percent }
\newlabel{equation_computing}{{24}{56}{}{}{}}
\newlabel{equation_c_1}{{25}{56}{}{}{}}
\newlabel{equation_c_2}{{26}{56}{}{}{}}
\newlabel{equation_c_3}{{27}{56}{}{}{}}
\newlabel{equation_c_4}{{28}{56}{}{}{}}
\newlabel{equation_c_5}{{29}{56}{}{}{}}
\newlabel{equation_computing_final}{{31}{57}{}{}{}}
\acronymused{DSP}
\@writefile{lof}{\contentsline {figure}{\numberline {45}{\ignorespaces Dependence of the total computing effort on the filter length $N$ and update rate $1/U$.}}{57}{}\protected@file@percent }
\newlabel{fig:fig_c_total.png}{{45}{57}{}{}{}}
\@setckpt{chapter_04}{ \@setckpt{chapter_04}{
\setcounter{page}{51} \setcounter{page}{58}
\setcounter{equation}{21} \setcounter{equation}{31}
\setcounter{enumi}{0} \setcounter{enumi}{0}
\setcounter{enumii}{0} \setcounter{enumii}{0}
\setcounter{enumiii}{0} \setcounter{enumiii}{0}
@@ -196,7 +235,7 @@
\setcounter{subsubsection}{2} \setcounter{subsubsection}{2}
\setcounter{paragraph}{0} \setcounter{paragraph}{0}
\setcounter{subparagraph}{0} \setcounter{subparagraph}{0}
\setcounter{figure}{40} \setcounter{figure}{45}
\setcounter{table}{0} \setcounter{table}{0}
\setcounter{float@type}{16} \setcounter{float@type}{16}
\setcounter{tabx@nest}{0} \setcounter{tabx@nest}{0}
@@ -314,10 +353,10 @@
\setcounter{bbx:relatedcount}{0} \setcounter{bbx:relatedcount}{0}
\setcounter{bbx:relatedtotal}{0} \setcounter{bbx:relatedtotal}{0}
\setcounter{parentequation}{0} \setcounter{parentequation}{0}
\setcounter{lstnumber}{11} \setcounter{lstnumber}{15}
\setcounter{FancyVerbLine}{0} \setcounter{FancyVerbLine}{0}
\setcounter{linenumber}{1} \setcounter{linenumber}{1}
\setcounter{LN@truepage}{50} \setcounter{LN@truepage}{57}
\setcounter{FancyVerbWriteLine}{0} \setcounter{FancyVerbWriteLine}{0}
\setcounter{FancyVerbBufferLine}{0} \setcounter{FancyVerbBufferLine}{0}
\setcounter{FV@TrueTabGroupLevel}{0} \setcounter{FV@TrueTabGroupLevel}{0}

View File

@@ -1,12 +1,12 @@
\section{Hardware implementation and optimization of the ANR Algorithm on a low-power system} \section{Hardware implementation and performance quantization of the ANR Algorithm on a low-power system}
This section can be considered as the heart of this thesis. The first subchapter describes the hardware, on which the \ac{ANR} algorithm is implemented, including its environment, which serves as a link to the \ac{CI} system itself. The following subchapter continues with the basic implementation of the \ac{ANR} algorithm on the hardware itself and shall provide the reader with a basic understanding of its challenges, possibilities and limitations. This basic implementation is then low-level simulated with some of the previuous use cases to get some idea of the general performance.\\ This section can be considered as the heart of this thesis. The first subchapter describes the hardware, on which the \ac{ANR} algorithm is implemented, including its environment, which serves as a link to the \ac{CI} system itself. The following subchapter continues with the basic implementation of the \ac{ANR} algorithm on the hardware itself and shall provide the reader with a basic understanding of its challenges, possibilities and limitations. This basic implementation is then low-level simulated with some of the previous use cases to get some idea of the general performance.\\
The last subchapter picks the final optimizations of the \ac{ANR} algorithm itself as a central theme, especially with respect to the capabilities of a hybrid \ac{ANR} approach. The last subchapter picks the final optimizations of the \ac{ANR} algorithm itself as a central theme, especially with respect to the capabilities of a hybrid \ac{ANR} approach.
\subsection{Low-power system architecture and integration} \subsection{Low-power system architecture and integration}
This thesis considers a low-power \ac{SOC} architecture that integrates a general-purpose \ac{ARM} core with a dedicated \ac{DSP} core. The system combines the flexibility of an \ac{ARM}-based control processor with the computational efficiency of a specialized \ac{DSP}, splitting general computing tasks from real-time signal processing workloads. This thesis considers a low-power \ac{SOC} architecture that integrates a general-purpose \ac{ARM} core with a dedicated \ac{DSP} core. The system combines the flexibility of an \ac{ARM}-based control processor with the computational efficiency of a specialized \ac{DSP}, splitting general computing tasks from real-time signal processing workloads.
\subsubsection{ARM and DSP hardware architecture overview} \subsubsection{ARM and DSP hardware architecture overview}
A 32-bit \ac{ARM} core serves as the primary control unit of the system. It is responsible for high-level application logic, system configuration, peripheral management as also scheduling and serves as a general-purpose processing unit. Due to its universal instruction set and extensive input/output interface, the \ac{ARM} core is well suited for handling general tasks and the interaction with the \ac{CI} system. Time-critical numerical processing is intentionally offloaded to the \ac{DSP} core in order to reduce computational load and power consumption on the control processor.\\ \\ A 32-bit \ac{ARM} core serves as the primary control unit of the system. It is responsible for high-level application logic, system configuration, peripheral management as also scheduling and serves as a general-purpose processing unit. Due to its universal instruction set and extensive input/output interface, the \ac{ARM} core is well suited for handling general tasks and the interaction with the \ac{CI} system. Time-critical numerical processing is intentionally offloaded to the \ac{DSP} core in order to reduce computational load and power consumption on the control processor.\\ \\
The \ac{DSP} used for the implementation features a 32-bit dual Harvard, dual \ac{MAC} architecture primarily designed for audio signal-processing applications in low-power embedded systems. It doesn´t feature a designated boot ROM, as it is initialized and managed by the \ac{ARM} core. The firmware executing the \ac{ANR} algorithm is developed and programmed in the C programming language. The used propretiery compiler is highly efficient and generates optimized assembler code, which is then translated in machine code to execute the \ac{ANR} algorithm on incoming samples.\\ \\ The \ac{DSP} used for the implementation features a 32-bit dual Harvard, dual \ac{MAC} architecture primarily designed for audio signal-processing applications in low-power embedded systems. It doesn't feature a designated boot ROM, as it is initialized and managed by the \ac{ARM} core. The firmware executing the \ac{ANR} algorithm is developed and programmed in the C programming language. The used proprietary compiler is highly efficient and generates optimized assembler code, which is then translated in machine code to execute the \ac{ANR} algorithm on incoming samples.\\ \\
All memory instances and registers of the \ac{SOC} are directly addressable by the \ac{ARM} through the standard busses, also enabling a simplified control of the \ac{DSP} through a shared memory section. The memory consists mainly out of the two followng parts: All memory instances and registers of the \ac{SOC} are directly addressable by the \ac{ARM} through the standard buses, also enabling a simplified control of the \ac{DSP} through a shared memory section. The memory consists mainly out of the two following parts:
\begin{itemize} \begin{itemize}
\item \textbf{Program Memory:} This memory section stores the executable code for both the \ac{ARM} core and the \ac{DSP} core. It contains the compiled instructions that define the behavior of the system, including the \ac{ANR} algorithm implemented on the \ac{DSP}. \item \textbf{Program Memory:} This memory section stores the executable code for both the \ac{ARM} core and the \ac{DSP} core. It contains the compiled instructions that define the behavior of the system, including the \ac{ANR} algorithm implemented on the \ac{DSP}.
\item \textbf{Data Memory:} This memory section is used for storing runtime data and variables, required during the execution of the program. This also includes the memory section for input/output audio samples and intermediate processing results. The shared memory section between the \ac{ARM} core and the \ac{DSP} core is also part of the data memory, featuring a total size of 64 KB. \item \textbf{Data Memory:} This memory section is used for storing runtime data and variables, required during the execution of the program. This also includes the memory section for input/output audio samples and intermediate processing results. The shared memory section between the \ac{ARM} core and the \ac{DSP} core is also part of the data memory, featuring a total size of 64 KB.
@@ -15,15 +15,15 @@ The data memory is supported by an integrated \ac{DMA} controller, which allows
When the \ac{DSP} is not required to process audio data, it can be paused by pausing the clock provided to the \ac{DSP} core. When paused, the \ac{DSP} core enters a low-power state, still allowing the \ac{ARM} core to access its shared memory and wake up the \ac{DSP} core when needed. This mechanism helps to reduce overall power consumption, which is crucial for battery-operated devices like cochlear implants.\\ \\ When the \ac{DSP} is not required to process audio data, it can be paused by pausing the clock provided to the \ac{DSP} core. When paused, the \ac{DSP} core enters a low-power state, still allowing the \ac{ARM} core to access its shared memory and wake up the \ac{DSP} core when needed. This mechanism helps to reduce overall power consumption, which is crucial for battery-operated devices like cochlear implants.\\ \\
The processing unit of the \ac{DSP} is equipped with load/store architecture, meaning that, initially all operands need to be moved from the memory to the registers, before any operation can be performed. After this task is performed, the execution units (\ac{ALU} and multiplier) can perform their operations on the data and write back the results into the registers. Finally, the results need to be explicitly moved back to the memory.\\ \\ The processing unit of the \ac{DSP} is equipped with load/store architecture, meaning that, initially all operands need to be moved from the memory to the registers, before any operation can be performed. After this task is performed, the execution units (\ac{ALU} and multiplier) can perform their operations on the data and write back the results into the registers. Finally, the results need to be explicitly moved back to the memory.\\ \\
Processor-wise, the \ac{DSP} includes a three stage pipeline consisting of fetch, decode, and execute stages, allowing for overlapping instruction execution and improved throughput. The architecture is optimized for high cycle efficiency when executing computationally intensive signal-processing workloads. The featured dual Harvard, dual \ac{MAC} architecture (two separate \ac{ALU}s) enables the execution of two \ac{MAC} operations, two memory operations (load/store) and two pointer updates in a single processor cycle. Processor-wise, the \ac{DSP} includes a three stage pipeline consisting of fetch, decode, and execute stages, allowing for overlapping instruction execution and improved throughput. The architecture is optimized for high cycle efficiency when executing computationally intensive signal-processing workloads. The featured dual Harvard, dual \ac{MAC} architecture (two separate \ac{ALU}s) enables the execution of two \ac{MAC} operations, two memory operations (load/store) and two pointer updates in a single processor cycle.
\subsubsection{Inter-core communication mechanisms} \subsubsection{Intercore communication mechanisms}
In order to ensure a smooth, but power-efficient, operation together with the \ac{CI} system, a interrupt-driven communication between the \ac{ARM} core and the \ac{DSP} core is crucial. Center of communication between the the cores is the already mentioned shared memory region accessible by both processing units. This shared memory enables the exchange of data without the need for separate communication protocols or input/output interfaces (refer to Figure \ref{fig:fig_dsp_setup.jpg}). Synchronization between the cores is achieved using interrupt-based signaling: the \ac{ARM} core initiates processing requests by waking up the \ac{DSP} and triggering an interrupt which sets an action flag, while the \ac{DSP} notifies the \ac{ARM} core upon completion of a task also by changing an interrupt register (for simplicity reasons, this behaviour will be just called ``interrupts'' in the remaining thesis). This approach ensures efficient coordination while minimizing active waiting (polling) and therefore unnecessary power consumption. In order to ensure a smooth, but power-efficient, operation together with the \ac{CI} system, an interrupt-driven communication between the \ac{ARM} core and the \ac{DSP} core is crucial. Center of communication between the cores is the already mentioned shared memory region accessible by both processing units. This shared memory enables the exchange of data without the need for separate communication protocols or input/output interfaces (refer to Figure \ref{fig:fig_dsp_setup.jpg}). Synchronization between the cores is achieved using interrupt-based signaling: the \ac{ARM} core initiates processing requests by waking up the \ac{DSP} and triggering an interrupt which sets an action flag, while the \ac{DSP} notifies the \ac{ARM} core upon completion of a task also by changing an interrupt register (for simplicity reasons, this behavior will be just called ``interrupts'' in the remaining thesis). This approach ensures efficient coordination while minimizing active waiting (polling) and therefore unnecessary power consumption.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_setup.jpg} \includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_setup.jpg}
\caption{Simplified visualization of the interaction between the \ac{CI}-System, the \ac{ARM} core and the \ac{DSP} core, making use of the \ac{PCM} interface and shared memory for audio data exchange.} \caption{Simplified visualization of the interaction between the \ac{CI}-System, the \ac{ARM} core and the \ac{DSP} core, making use of the \ac{PCM} interface and shared memory for audio data exchange.}
\label{fig:fig_dsp_setup.jpg} \label{fig:fig_dsp_setup.jpg}
\end{figure} \end{figure}
\noindent The \ac{ARM} Core receives the 16-bit audio data (the corrupted signal and the reference noise signal via two channels) from the CI system via a \ac{PCM} interface, which offers one 32-bit input and one 32-bit output register. An interrupt triggers the integrated \ac{DMA} controller when the input register is occupied, which transfers the audio data from the \ac{PCM} interface to the input buffer in a predefined memory location (now in two 16-bit samples again). Once completed, the \ac{DSP} core is requested to start processing the audio data. The \ac{DSP} core then reads the audio samples from the shared memory, processes them using the implemented \ac{ANR} algorithm, and writes the a 16-bit processed sample back to an output buffer, also located in the shared memory. Finally, the \ac{ARM} core is notified via an interrupt from the \ac{DSP} core, that the processing is complete - the \ac{DMA} controller then transfers the processed audio samples from the output buffer back to the \ac{PCM} interface for playback (refer to Figure \ref{fig:fig_dsp_comm.jpg}).\\ \\ \noindent The \ac{ARM} Core receives the 16-bit audio data (the corrupted signal and the reference noise signal via two channels) from the CI system via a \ac{PCM} interface, which offers one 32-bit input and one 32-bit output register. An interrupt triggers the integrated \ac{DMA} controller when the input register is occupied, which transfers the audio data from the \ac{PCM} interface to the input buffer in a predefined memory location (now in two 16-bit samples again). Once completed, the \ac{DSP} core is requested to start processing the audio data. The \ac{DSP} core then reads the audio samples from the shared memory, processes them using the implemented \ac{ANR} algorithm, and writes the 16-bit processed sample back to an output buffer, also located in the shared memory. Finally, the \ac{ARM} core is notified via an interrupt from the \ac{DSP} core, that the processing is complete - the \ac{DMA} controller then transfers the processed audio samples from the output buffer back to the \ac{PCM} interface for playback (refer to Figure \ref{fig:fig_dsp_comm.jpg}).\\ \\
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=0.9\linewidth]{Bilder/fig_dsp_comm.jpg} \includegraphics[width=0.9\linewidth]{Bilder/fig_dsp_comm.jpg}
@@ -34,11 +34,11 @@ In order to ensure a smooth, but power-efficient, operation together with the \a
\subsection{Software architecture and execution flow} \subsection{Software architecture and execution flow}
\subsubsection{ARMDSP communication and data exchange details} \subsubsection{ARMDSP communication and data exchange details}
In contrary, to the high-level simulation environment written in Python from the previous chapter, the implementation of the \ac{ANR} algorithm on the \ac{DSP} requires a low-level programming approach, as which takes into account the specific architecture and capabilities of the processor and its environment. This includes considerations such as memory management, data types, and optimization techniques specific to the \ac{DSP} architecture. The implementation is required to be done in the C programming language, which is a standard for embedded systems, as it allows low-level hardware implementation.\\ \\ In contrary, to the high-level simulation environment written in Python from the previous chapter, the implementation of the \ac{ANR} algorithm on the \ac{DSP} requires a low-level programming approach, as which takes into account the specific architecture and capabilities of the processor and its environment. This includes considerations such as memory management, data types, and optimization techniques specific to the \ac{DSP} architecture. The implementation is required to be done in the C programming language, which is a standard for embedded systems, as it allows low-level hardware implementation.\\ \\
The implementation of the \ac{ANR} algorithm on the \ac{DSP} follows the same overall structure as the high-level variant, but now the focus lies on memory management, interrupt-handling and communication between the two cores. The \ac{ARM} operates in a continious loop, structured into several states: The implementation of the \ac{ANR} algorithm on the \ac{DSP} follows the same overall structure as the high-level variant, but now the focus lies on memory management, interrupt-handling and communication between the two cores. The \ac{ARM} operates in a continuous loop, structured into several states:
\begin{itemize} \begin{itemize}
\item \textbf{Idle:} The \ac{ARM} core waits for an interrupt from the \ac{DMA} controller, indicating that new audio samples are available in the input buffer. \item \textbf{Idle:} The \ac{ARM} core waits for an interrupt from the \ac{DMA} controller, indicating that new audio samples are available in the input buffer.
\item \textbf{Work:} After receiving the interrupt, the \ac{ARM} core triggers an interrupt on the \ac{DSP} core to start processing the audio samples. \item \textbf{Work:} After receiving the interrupt, the \ac{ARM} core triggers an interrupt on the \ac{DSP} core to start processing the audio samples.
\item \textbf{Wait:} After recieving the first interrupt, which signals that the \ac{DSP} startedprocessing the sample, the \ac{ARM} core waits for the second interrupt, indicating that the processing is complete. \item \textbf{Wait:} After receiving the first interrupt, which signals that the \ac{DSP} started processing the sample, the \ac{ARM} core waits for the second interrupt, indicating that the processing is complete.
\item \textbf{Done/Idle:} Once the processing is complete, the \ac{ARM} core triggers the \ac{DMA} controller to transfer the processed audio samples from the output buffer back to the \ac{PCM} interface for playback. The \ac{ARM} core then returns to the idle state, waiting for the next batch of audio samples. \item \textbf{Done/Idle:} Once the processing is complete, the \ac{ARM} core triggers the \ac{DMA} controller to transfer the processed audio samples from the output buffer back to the \ac{PCM} interface for playback. The \ac{ARM} core then returns to the idle state, waiting for the next batch of audio samples.
\end{itemize} \end{itemize}
On the contrary, the \ac{DSP} core operates in an interrupt-driven manner: On the contrary, the \ac{DSP} core operates in an interrupt-driven manner:
@@ -51,15 +51,15 @@ On the contrary, the \ac{DSP} core operates in an interrupt-driven manner:
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_dma.jpg} \includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_dma.jpg}
\caption{Detailed visualization of the \ac{DMA} operations between the PCM interface to the shared memory section. When the memory buffer occupied, an interrupt is triggerd, either to the \ac{DSP} core or to the \ac{ARM} core, depending if triggered during a Read- or Write-operation.} \caption{Detailed visualization of the \ac{DMA} operations between the PCM interface to the shared memory section. When the memory buffer occupied, an interrupt is triggered, either to the \ac{DSP} core or to the \ac{ARM} core, depending on, if triggered during a Read- or Write-operation.}
\label{fig:fig_dsp_dma.jpg} \label{fig:fig_dsp_dma.jpg}
\end{figure} \end{figure}
\noindent Figure \ref{fig:fig_dsp_dma.jpg} visualizes the concrete operation of the \ac{DMA} controller during the audio sample processing. The \ac{DMA} controller is configured to samplewise transfer the audio samples from the \ac{PCM} interface to the input buffer of the shared memory. When the input buffer is filled with one sample of both channels, an interrupt is triggered to the \ac{DSP} core, notifying it to start processing the available samples. After processing, the results are written into the output buffer in the shared memory. Once the output buffer is occupied, another interrupt is triggered to the \ac{DMA} controller, indicating that the processed samples are ready to be transferred back to the \ac{PCM} interface for playback. \\ \\ \noindent Figure \ref{fig:fig_dsp_dma.jpg} visualizes the concrete operation of the \ac{DMA} controller during the audio sample processing. The \ac{DMA} controller is configured to samplewise transfer the audio samples from the \ac{PCM} interface to the input buffer of the shared memory. When the input buffer is filled with one sample of both channels, an interrupt is triggered to the \ac{DSP} core, notifying it to start processing the available samples. After processing, the results are written into the output buffer in the shared memory. Once the output buffer is occupied, another interrupt is triggered to the \ac{DMA} controller, indicating that the processed samples are ready to be transferred back to the \ac{PCM} interface for playback. \\ \\
As the \ac{ARM} operation is not the main focus of this thesis and its behavior is already sufficiently described, further implementaion details will be omitted in the following while the focus will be put on implementation of the \ac{ANR} algorithm on the \ac{DSP} core itself. As the \ac{ARM} operation is not the main focus of this thesis and its behavior is already sufficiently described, further implementation details will be omitted in the following while the focus will be put on implementation of the \ac{ANR} algorithm on the \ac{DSP} core itself.
\subsubsection{System control flow and main processing loop} \subsubsection{System control flow and main processing loop}
The implementation of the \ac{ANR} algorithm on the \ac{DSP} core is structured into several key sections, each responsible for specific aspects of the algorithm's functionality. The following paragraphs outline the main components: The implementation of the \ac{ANR} algorithm on the \ac{DSP} core is structured into several key sections, each responsible for specific aspects of the algorithm's functionality. The following paragraphs outline the main components:
\paragraph{Memory initialization and mapping} \paragraph{Memory initialization and mapping}
The memory initialization section starts with the definition of the interrupt register (0xC00004) and the corresponding bit masks used to control the interrupt behavior of the \ac{DSP} core. Afterwards, a section in the shared memory is defined for the storage of input and output audio samples after/before the transport to/from the \ac{PCM} interface. The output section is initialized with an offset of 16 bytes from the input section (0x800000), resulting in a storage capability of 4 32-bit double-words for each of the two memory sections - this is more than needed, but prevents future memory relocation, if the necessety for more space would arise. After this initialization, the interrupt register and the memory sections are declared as volatile variables, telling the compiler, that these variables can be changed outside the normal program flow (e.g., by hardware interrupts), preventing certain optimizations. The final input/output buffers are then declared in form of two 16-bit arrays, consisting of 4 elements each. Finally, a variable is declared to signal the \ac{DSP} core, an interrupt has occured, which changes the state of the interrupt register and signals a processing request. The memory initialization section starts with the definition of the interrupt register (0xC00004) and the corresponding bit masks used to control the interrupt behavior of the \ac{DSP} core. Afterwards, a section in the shared memory is defined for the storage of input and output audio samples after/before the transport to/from the \ac{PCM} interface. The output section is initialized with an offset of 16 bytes from the input section (0x800000), resulting in a storage capability of 4 32-bit double-words for each of the two memory sections - this is more than needed, but prevents future memory relocation, if the necessity for more space would arise. After this initialization, the interrupt register and the memory sections are declared as volatile variables, telling the compiler, that these variables can be changed outside the normal program flow (e.g., by hardware interrupts), preventing certain optimizations. The final input/output buffers are then declared in form of two 16-bit arrays, consisting of 4 elements each. Finally, a variable is declared to signal the \ac{DSP} core, an interrupt has occurred, which changes the state of the interrupt register and signals a processing request.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\begin{lstlisting}[language=C] \begin{lstlisting}[language=C]
@@ -80,16 +80,16 @@ The memory initialization section starts with the definition of the interrupt re
\label{fig:fig_dps_code_memory} \label{fig:fig_dps_code_memory}
\caption{Low-level implementation: Memory initialization and mapping} \caption{Low-level implementation: Memory initialization and mapping}
\end{figure} \end{figure}
\noindent Figure \ref{fig:fig_compiler.jpg} shows an exemplary memory map of the input buffer array, taken from the compiler debugger. As the array is initialized as a 16 bit integer array, each element occupies 2 bytes of memory. \noindent Figure \ref{fig:fig_compiler.jpg} shows an exemplary memory map of the input buffer array, taken from the compiler debugger. As the array is initialized as a 16-bit integer array, each element occupies 2 bytes of memory.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_compiler.jpg} \includegraphics[width=1.0\linewidth]{Bilder/fig_compiler.jpg}
\caption{Exemplary memory map of the 4-element input buffer array. As it is initialized as a 16 bit integer array, each element occupies 2 bytes of memory, resulting in a total size of 8 bytes for the entire array. As the DSP architecture works in 32-bit double-words, the bytewise adressing is a result of the compiler abstraction.} \caption{Exemplary memory map of the 4-element input buffer array. As it is initialized as a 16-bit integer array, each element occupies 2 bytes of memory, resulting in a total size of 8 bytes for the entire array. As the DSP architecture works in 32-bit double-words, the bytewise addressing is a result of the compiler abstraction.}
\label{fig:fig_compiler.jpg} \label{fig:fig_compiler.jpg}
\end{figure} \end{figure}
\paragraph{Main loop and interrupt handling} \paragraph{Main loop and interrupt handling}
The main loop of the \ac{DSP} core is quite compact, as it mainly focuses on handling interrupts and delegating the sample processing to the \ac{ANR} function. The loop starts by enabling interrupts with a compiler-specific function and setting up pointers for the output buffer and the sample variable. After setting the action flag to zero, the main function enters an infinite loop, signaling the \ac{ARM} core it´s halted state by setting the interrupt register to 1 and halting the core.\\ \\ The main loop of the \ac{DSP} core is quite compact, as it mainly focuses on handling interrupts and delegating the sample processing to the \ac{ANR} function. The loop starts by enabling interrupts with a compiler-specific function and setting up pointers for the output buffer and the sample variable. After setting the action flag to zero, the main function enters an infinite loop, signaling the \ac{ARM} core it's halted state by setting the interrupt register to 1 and halting the core.\\ \\
If the \ac{ARM} core requests a sample to be processed, it activates the \ac{DSP} core and triggers an interrupt, which sets the action flag to 1. The main loop then checks the action flag, and sets the interrupt register back to 0, indicating the \ac{ARM} core it is now processing the sample. After resetting the action flag, the output pointer is updated to point to the next position in the output buffer using a cyclic addition function. Before triggering the calc()-function, the calculated sample from the previous cycle is moved from its temporary memory location to the current position in the output buffer. Afterwards, the calc()-function is triggered for the current cycle and the loop restarts. The flow diagram in Figure \ref{fig:fig_dsp_logic.jpg} visualizes the described behavior of the main loop and interrupt handling on the \ac{DSP} core. If the \ac{ARM} core requests a sample to be processed, it activates the \ac{DSP} core and triggers an interrupt, which sets the action flag to 1. The main loop then checks the action flag, and sets the interrupt register back to 0, indicating the \ac{ARM} core it is now processing the sample. After resetting the action flag, the output pointer is updated to point to the next position in the output buffer using a cyclic addition function. Before triggering the calculate\_output()-function, the calculated sample from the previous cycle is moved from its temporary memory location to the current position in the output buffer. Afterwards, the calculate\_output()-function is triggered for the current cycle and the loop restarts. The flow diagram in Figure \ref{fig:fig_dsp_logic.jpg} visualizes the described behavior of the main loop and interrupt handling on the \ac{DSP} core.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\begin{lstlisting}[language=C] \begin{lstlisting}[language=C]
@@ -106,7 +106,7 @@ If the \ac{ARM} core requests a sample to be processed, it activates the \ac{DSP
action_required = 0; action_required = 0;
out_pointer = cyclic_add(output_pointer, 2, output_port, 4); out_pointer = cyclic_add(output_pointer, 2, output_port, 4);
*output_pointer = *sample_pointer; *output_pointer = *sample_pointer;
calc(&corrupted_signal, &reference_noise_signal, mode, &input_port[1], &input_port[0], sample_pointer); calculate_output(&corrupted_signal, &reference_noise_signal, mode, &input_port[1], &input_port[0], sample_pointer);
} }
} }
} }
@@ -120,8 +120,8 @@ If the \ac{ARM} core requests a sample to be processed, it activates the \ac{DSP
\caption{Flow diagram of the code implementation of the main loop and interrupt handling on the \ac{DSP} core.} \caption{Flow diagram of the code implementation of the main loop and interrupt handling on the \ac{DSP} core.}
\label{fig:fig_dsp_logic.jpg} \label{fig:fig_dsp_logic.jpg}
\end{figure} \end{figure}
\paragraph{Calc()-function} \paragraph{calculate\_output()-function}
The calc()-function at the very end of the main process loop represents the heart of the \ac{DSP}code, as it is responsible for applying the \ac{ANR} algorithm on the two input samples. As it follows the same structure as the high-level implementation described in the previous chapter, the general functionality will not be described in detail again. The technical implementation on the \ac{DSP} however will be outlined in detail in the following subchapter, as the hardware-specific optimizations, responsible for a real-time capable implementation, are a key element for the estimation of the expectable power consumption of the system.\\ \\ The calculate\_output()-function at the very end of the main process loop represents the heart of the \ac{DSP} code, as it is responsible for applying the \ac{ANR} algorithm on the two input samples. As it follows the same structure as the high-level implementation described in the previous chapter, the general functionality will not be described in detail again. Yet, the technical implementation on the \ac{DSP} however will be outlined in detail in the following subchapter, as the hardware-specific optimizations are key elements for the estimation of the expectable power consumption of the system.\\ \\
\subsection{DSP-level implementation of the ANR algorithm} \subsection{DSP-level implementation of the ANR algorithm}
The ability to process audio samples in real-time on the \ac{DSP} core is strongly dependent on compiler-specific optimizations and hardware-specific implementation techniques, which allow a far more efficient execution of the algorithm compared to a native C implementation. The ability to process audio samples in real-time on the \ac{DSP} core is strongly dependent on compiler-specific optimizations and hardware-specific implementation techniques, which allow a far more efficient execution of the algorithm compared to a native C implementation.
@@ -137,7 +137,7 @@ The simple function shown in Figure \ref{fig:fig_dsp_code_find_max} returns the
return (a > b) ? a : b; return (a > b) ? a : b;
} }
\end{lstlisting} \end{lstlisting}
\caption{Manual implementation of function, returning the maximum of two integer values, taking 12 cycles to execute. The intrinsic functions of the DSP compiler allows a 4-cycle implementation of such an operations.} \caption{Manual implementation of a max-function, returning the maximum of two integer values, taking 12 cycles to execute. The intrinsic functions of the DSP compiler allows a 4-cycle implementation of such an operation.}
\label{fig:fig_dsp_code_find_max} \label{fig:fig_dsp_code_find_max}
\end{figure} \end{figure}
\paragraph{Cyclic array iteration} \paragraph{Cyclic array iteration}
@@ -156,17 +156,117 @@ Basically every part of the \ac{ANR} algorithm relies on iterating through memor
return new_pointer; return new_pointer;
} }
\end{lstlisting} \end{lstlisting}
\caption{Manual implementation of a cyclic array iteration function in C, taking the core 20 cycles to execute an pointer inremen of 1. The intrinsic functions of the DSP compiler allows a single-cycle implementation of such cyclic additions.} \caption{Manual implementation of a cyclic array iteration function in C, taking the core 20 cycles to execute a pointer inremen of 1. The intrinsic functions of the DSP compiler allows a single-cycle implementation of such cyclic additions.}
\label{fig:fig_dsp_code_cyclic_add} \label{fig:fig_dsp_code_cyclic_add}
\end{figure} \end{figure}
\noindent Figure \ref{fig:fig_dsp_code_cyclic_add} shows a manual implementation of such a cyclic array iteration function in C, which updates the pointer to a new address. This implementation takes the \ac{DSP} 20 cycles to execute, while the already implemented compiler-optimized version only takes one cycle, making use of the specific architecture of the \ac{DSP} allowing such a single-cycle operation. \noindent Figure \ref{fig:fig_dsp_code_cyclic_add} shows a manual implementation of such a cyclic array iteration function in C, which updates the pointer to a new address. This implementation takes the \ac{DSP} 20 cycles to execute, while the already implemented compiler-optimized version only takes one cycle, making use of the specific architecture of the \ac{DSP} allowing such a single-cycle operation.
\paragraph{Fractional fixed-point arithmetic} \paragraph{Fractional fixed-point arithmetic}
As already mentioned during the beginning of the current chapter, the used \ac{DSP} is a fixed point processor, meaning, that it does not support floating-point arithmetic natively. Instead, it relies on fixed-point arithmetic, which represents numbers as integers scaled by a fixed factor. This is a key requirement, as it allows the use of the implemented dual \ac{MAC} \ac{ALU}s. This approach is also faster and more energy efficient, and therefore more suitable for embedded systems. However, it also introduces challenges in terms of precision and range, which need to taken into account when conducting certain calculations.\\ \\ As already mentioned during the beginning of the current chapter, the used \ac{DSP} is a fixed point processor, meaning, that it does not support floating-point arithmetic natively. Instead, it relies on fixed-point arithmetic, which represents numbers as integers scaled by a fixed factor. This is a key requirement, as it allows the use of the implemented dual \ac{MAC} \ac{ALU}s. This approach is also faster and more energy efficient, and therefore more suitable for embedded systems. However, it also introduces challenges in terms of precision and range, which need to be taken into account when conducting certain calculations.\\ \\
To tackle this issues, the \ac{DSP} compiler provides intrinsic functions for fractional fixed-point arithmetic, such as a fractional multiplication function, which takes two 32-bit integers as input and return an already bit-shifted 64-bit output, representing the fractional multiplication result. This approach prevents the need for manual bit-shifting operations after each multiplication.\\ \\ To tackle this issues, the \ac{DSP} compiler provides intrinsic functions for fractional fixed-point arithmetic, such as a fractional multiplication function, which takes two 32-bit integers as input and return an already bit-shifted 64-bit output, representing the fractional multiplication result. This approach prevents the need for manual bit-shifting operations after each multiplication.\\ \\
To support such operations, a 72-bit accumulator is provided, allowing to store intermediate 64-bit results of 32-bit multiplications without losing precision - the remaining 8 bit serve as an overflow space. If needed, a saturation function is also provided, to round the 64-bit result back to a 32-bit value. To support such operations, a 72-bit accumulator is provided, allowing to store intermediate 64-bit results of 32-bit multiplications without losing precision - the remaining 8 bit serve as an overflow space. If needed, a saturation function is also provided, to round the 64-bit result back to a 32-bit value.
\subsubsection{Performance evaluation and quantization of the DSP implementation} \subsubsection{Performance quantization of the ANR calculation}
The $calculate\_output()$-function, forms the center of the \ac{ANR} algorithm on the \ac{DSP} core and is responsbile for the actual processing of the audio samples. The general functionality of the function in C is the same as in the high-level implementation (refer to Figure \ref{fig:fig_anr_logic}), and will therefore not be described in detail again. The main focus lies now on the computational efficiency of the different parts of the function, with the goal of generating a formula by quantizizing the computational effort of the different sub-parts in relation to changeable parameters like the filter length.\\ \\
The $calculate\_output()$ functions consists out of the following five main parts:
\begin{itemize}
\item $write\_buffer$: Pointer handling and buffer management
\item $apply\_fir\_filter$: Application of the \ac{FIR} filter on the reference noise signal
\item $update\_output$: Calculation of the output sample (=error signal)
\item $update\_filter\_coefficients$: Update of the \ac{FIR} filter coefficients based on the error signal
\item $write\_output$: Writing the output sample back to the output port in the shared memory section
\end{itemize}
These sub-functions feature \ac{DSP}-spefic optimizations and are partly depenend on the setable parameters like the filter length in regard of their computational cost. The following paragraphs will analyze the computational efficiency of these sub-functions in detail.
\paragraph{write\_buffer}The $write\_buffer$-function is responsible for managing the input line, where the samples of the reference noise signal are stored for further processing. The buffer management mainly consits out of a cyclic pointer increase operation and a pointer dereference operation to write the new sample into the buffer. The cyclic pointer increase operation is implemented using the already mentioned intrinsic function of the \ac{DSP} compiler, while the pointer dereference operation takes 15 cycles to execute. This results in a total duration of 16 cycles for the $write\_buffer$-function to process, indipentent of the filter length or other parameters.
\paragraph{apply\_fir\_filter} The $apply\_fir\_filter$-function is responsible for applying the coefficients of the \ac{FIR} filter on the reference noise signal samples stored in the input line. The needed cycles for this function are mainly depenendent on the lenght of the filter, as the number of multiplications and additions increase with the filter length. To increase the performance, the dual \ac{MAC} architecture of the \ac{DSP} is utilized, allowing two multiplications and two additions to be performed in a single cycle. Another \ac{DSP}-specific optimization is the use of the already introduced 72-bit accumulators and the fractional multiplication function, which allows performing multiplications on two 32-bit integers without losing precision or the need for manual bit-shifting operations.
\begin{figure}[H]
\centering
\begin{lstlisting}[language=C]
for (int i=0; i < n_coeff; i+=2) chess_loop_range(1,){
x0 = *p_x0;
w0 = *p_w;
p_w++;
p_x0 = cyclic_add(p_x0, -1, p_xstart, sample_line_len);
x1 = *p_x0;
w1 = *p_w; y
p_w++;
p_x0 = cyclic_add(p_x0, -1, p_xstart, sample_line_len);
acc_fir_1+=fract_mult(x0, w0);
acc_fir_2+=fract_mult(x1, w1);
}
\end{lstlisting}
\caption{Code snippet of the $apply\_fir\_filter$-function, showing the use of the dual \ac{MAC} architecture of the \ac{DSP} and the fractional multiplication function. The loop iterates through the filter coefficients and reference noise signal samples, performing two multiplications and two additions in each cycle.}
\label{fig:fig_dsp_code_apply_fir_filter}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_fir_cycle.jpg}
\caption{Visualization of the FIR filter calculation in the $apply\_fir\_filter$-function during the 2nd cyclce of a calculation loop. The reference noise signal samples are stored in the sample line, while the filter coefficients are stored in a separate memory section (filter line).}
\label{fig:fig_dsp_fir_cycle.jpg}
\end{figure}
\noindent The final result is represented in a computing effort of 1 cycle per item in the sample line buffer (which equals the filter length) plus 12 cycles for general function overhead, resulting in a total of $N+12$ cycles for the $apply\_fir\_filter$-function, with $N$ being the filter length.
\paragraph{update\_output} The $update\_output$-function is responsible for calculating the output sample based on the error signal and the accumulated filter output. The calculation is a simple subtraction and only takes 1 cycle to execute, independent of the filter length or other parameters.
\paragraph{update\_filter\_coefficient} The $update\_filter\_coefficient$-function represents the second computationally expensive part of the $calculate\_output()$-function. The calculated output from the previous function is now multiplied with the step size and the corresponding sample from the reference noise signal, which is stored in the sample line buffer. The result is then added to the current filter coefficient to update it for the next cycle. Again, \ac{DSP}-specific optimizations, like the dual \ac{MAC} architecture, are used, resulting in a computing effort of 6 cycles per filter coeffcient. Per function call, an overhead of 8 cycles is added, resulting in a total of $6*N+8$ cycles for the $update\_filter\_coefficient$-function, with $N$ again being the filter length.
\begin{figure}[H]
\centering
\begin{lstlisting}[language=C]
for (int i=0; i< n_coeff; i+=2) chess_loop_range(1,){
lldecompose(*((long long *)p_w0), w0, w1);
acc_w0 = to_accum(w0);
acc_w1 = to_accum(w1);
acc_w0 += fract_mult(correction, *p_x0);
acc_w1 += fract_mult(correction, *p_x1);
p_x0 = cyclic_add(p_x0, -2, p_xstart, sample_line_len);
p_x1 = cyclic_add(p_x1, -2, p_xstart, sample_line_len);
*((long long *)p_w0) = llcompose(rnd_saturate(acc_w0), rnd_saturate(acc_w1));
p_w0+=2;
}
\end{lstlisting}
\caption{Code snippet of the $update\_filter\_coefficient$-function, again making use of the dual \ac{MAC} architecture of the \ac{DSP} and the fractional multiplication function. Additionaly, 32-bit values are loaded and stored as 64-bit values, using two also intrinisc functions, allowing to update two filter coefficients in a single cycle.}
\label{fig:fig_dsp_code_update_filter_coefficients}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_coefficient_cycle.jpg}
\caption{Visualization of the coefficient calculation in the $update\_filter\_coefficient$-function during the 2nd cyclce of a calculation loop. The output is multiplied with the step size and the corresponding sample from the sample line, before being added to the current filter coefficient.}
\label{fig:fig_dsp_coefficient_cycle.jpg}
\end{figure}
\paragraph{write\_output} The $update\_output$-function is responsible for writing the calculated output sample back into the shared memory section. The operation takes 5 cycles to execute, independent of the filter length or other parameters.
\noindent The total computing effort of the $calculate\_output()$-function in dependency of the filter length $N$ can now be calculated by summing up the computing efforts of the different sub-functions:
\begin{equation}
\label{equation_computing}
\begin{aligned}
C_{total} = C_{write\_buffer} + C_{apply\_fir\_filter} + C_{update\_output} + \\
C_{update\_filter\_coefficient} + C_{write\_output}
\end{aligned}
\end{equation}
The sub-functions can seperatly be expressed in dependency of the filter length $N$ and also in dependency of the update rate of the filter coefficients, which is represented by the parameter $1/U$ (e.g., if the coefficients are updated every 2 cycles, $1/U$ would result in a vaule of 0.5):
\begin{gather}
\label{equation_c_1}
C_{write\_buffer} = 16 \\
\label{equation_c_2}
C_{apply\_fir\_filter} = N + 12 \\
\label{equation_c_3}
C_{update\_output} = 1 \\
\label{equation_c_4}
C_{update\_filter\_coefficient} = \frac{1}{U}(6*N + 8)\\
\label{equation_c_5}
C_{write\_output} = 5 \\
\end{gather}
\noindent By inserting the sub-function costs into the total computing effort formula, Equation \ref{equation_computing} can now be expressed as:
\begin{equation}
\label{equation_computing_final}
C_{total} = N + \frac{6*N+8}{U} + 34
\end{equation}
Equation \ref{equation_computing_final} now provides an estimation of the necessary computing effort for one output sample in relation to the filter length $N$ and the update rate of the filter coefficients $1/U$. This formula can now be used to estimate the needed computing power (and therefore the power consumption) of the \ac{DSP} core for different parameter settings, alowing to find an optimal parameter configuration in regard of the quality of the noise reduction and the power consumption of the system.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_c_total.png}
\caption{Dependence of the total computing effort on the filter length $N$ and update rate $1/U$.}
\label{fig:fig_c_total.png}
\end{figure}

228
chapter_05.aux Normal file
View File

@@ -0,0 +1,228 @@
\relax
\@writefile{toc}{\contentsline {section}{\numberline {5}Performance evaluation of different implementation variants}{58}{}\protected@file@percent }
\acronymused{DSP}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Verification of the \ac {DSP} implementation}{58}{}\protected@file@percent }
\acronymused{DSP}
\acronymused{ANR}
\acronymused{FIR}
\acronymused{ANR}
\acronymused{SNR}
\@writefile{lof}{\contentsline {figure}{\numberline {46}{\ignorespaces Desired signal, corrupted signal, reference noise signal and filter output of the complex \ac {ANR} use case, simulated on the \ac {DSP}}}{58}{}\protected@file@percent }
\acronymused{ANR}
\acronymused{DSP}
\newlabel{fig:fig_plot_1_dsp_complex.png}{{46}{58}{}{}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {47}{\ignorespaces Error signal of the complex \ac {ANR} use case, simulated on the \ac {DSP}}}{59}{}\protected@file@percent }
\acronymused{ANR}
\acronymused{DSP}
\newlabel{fig:fig_plot_2_dsp_complex.png}{{47}{59}{}{}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {48}{\ignorespaces Comparison of the high- and low-level simulation output. The Pearson coefficient shows a correlation of above 99\% between the two graphs.}}{59}{}\protected@file@percent }
\newlabel{fig:fig_high_low_comparison.png}{{48}{59}{}{}{}}
\acronymused{ANR}
\acronymused{DSP}
\acronymused{SNR}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{ANR}
\acronymused{ANR}
\acronymused{DSP}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Computational efficiency evaluation}{60}{}\protected@file@percent }
\acronymused{CI}
\acronymused{ANR}
\acronymused{CI}
\@writefile{lof}{\contentsline {figure}{\numberline {49}{\ignorespaces Noise signals used to corrupt the desired signal in the computational efficiency evaluation}}{61}{}\protected@file@percent }
\newlabel{fig:fig_noise_signals.png}{{49}{61}{}{}{}}
\acronymused{ANR}
\acronymused{SNR}
\@writefile{lof}{\contentsline {figure}{\numberline {50}{\ignorespaces Simulation of the to be expected \ac {SNR}-Gain for different noise signals and filter lengths applied to the desired signal of a male speaker. The applied delay between the signals amounts 2ms. The graphs are smoothed by a third order savigol filter.}}{62}{}\protected@file@percent }
\acronymused{SNR}
\newlabel{fig:fig_snr_comparison.png}{{50}{62}{}{}{}}
\acronymused{SNR}
\acronymused{SNR}
\acronymused{SNR}
\acronymused{SNR}
\acronymused{SNR}
\acronymused{SNR}
\acronymused{ANR}
\acronymused{SNR}
\acronymused{ANR}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.3}Evaluation of the computational load for fixed implementation}{62}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.3.1}Full-Update implementation}{62}{}\protected@file@percent }
\newlabel{equation_computing_calculation}{{32}{63}{}{}{}}
\acronymused{PCM}
\acronymused{DSP}
\acronymused{DSP}
\newlabel{equation_cycle_budget}{{33}{63}{}{}{}}
\acronymused{DSP}
\newlabel{equation_load_calculation}{{34}{63}{}{}{}}
\acronymused{ANR}
\acronymused{SNR}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{SNR}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.3.2}Reduced-update implementation}{63}{}\protected@file@percent }
\acronymused{DSP}
\acronymused{SNR}
\@writefile{lof}{\contentsline {figure}{\numberline {51}{\ignorespaces Relative performance of the SNR-Gain, the cycles per samples and the DSP load in regard of the update rate of the ANR algorithm. The baseline is the full update variant the complex usecase. The marked dots represent the results of the simulation for an explicit setup.}}{64}{}\protected@file@percent }
\newlabel{fig:fig_snr_reduced_update.png}{{51}{64}{}{}{}}
\acronymused{SNR}
\acronymused{DSP}
\acronymused{SNR}
\acronymused{SNR}
\acronymused{DSP}
\newlabel{equation_computing_calculation}{{35}{64}{}{}{}}
\newlabel{equation_load_calculation}{{36}{64}{}{}{}}
\acronymused{DSP}
\acronymused{SNR}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.4}Evaluation of the computational load for error driven implementation}{64}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.5}Summary of the performance evaluation}{65}{}\protected@file@percent }
\@setckpt{chapter_05}{
\setcounter{page}{66}
\setcounter{equation}{36}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{section}{5}
\setcounter{subsection}{5}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{51}
\setcounter{table}{0}
\setcounter{float@type}{16}
\setcounter{tabx@nest}{0}
\setcounter{listtotal}{0}
\setcounter{listcount}{0}
\setcounter{liststart}{0}
\setcounter{liststop}{0}
\setcounter{citecount}{0}
\setcounter{citetotal}{0}
\setcounter{multicitecount}{0}
\setcounter{multicitetotal}{0}
\setcounter{instcount}{18}
\setcounter{maxnames}{3}
\setcounter{minnames}{1}
\setcounter{maxitems}{3}
\setcounter{minitems}{1}
\setcounter{citecounter}{0}
\setcounter{maxcitecounter}{0}
\setcounter{savedcitecounter}{0}
\setcounter{uniquelist}{0}
\setcounter{uniquename}{0}
\setcounter{refsection}{0}
\setcounter{refsegment}{0}
\setcounter{maxextratitle}{0}
\setcounter{maxextratitleyear}{0}
\setcounter{maxextraname}{3}
\setcounter{maxextradate}{0}
\setcounter{maxextraalpha}{0}
\setcounter{abbrvpenalty}{50}
\setcounter{highnamepenalty}{50}
\setcounter{lownamepenalty}{25}
\setcounter{maxparens}{3}
\setcounter{parenlevel}{0}
\setcounter{blx@maxsection}{0}
\setcounter{mincomprange}{10}
\setcounter{maxcomprange}{100000}
\setcounter{mincompwidth}{1}
\setcounter{afterword}{0}
\setcounter{savedafterword}{0}
\setcounter{annotator}{0}
\setcounter{savedannotator}{0}
\setcounter{author}{0}
\setcounter{savedauthor}{0}
\setcounter{bookauthor}{0}
\setcounter{savedbookauthor}{0}
\setcounter{commentator}{0}
\setcounter{savedcommentator}{0}
\setcounter{editor}{0}
\setcounter{savededitor}{0}
\setcounter{editora}{0}
\setcounter{savededitora}{0}
\setcounter{editorb}{0}
\setcounter{savededitorb}{0}
\setcounter{editorc}{0}
\setcounter{savededitorc}{0}
\setcounter{foreword}{0}
\setcounter{savedforeword}{0}
\setcounter{holder}{0}
\setcounter{savedholder}{0}
\setcounter{introduction}{0}
\setcounter{savedintroduction}{0}
\setcounter{namea}{0}
\setcounter{savednamea}{0}
\setcounter{nameb}{0}
\setcounter{savednameb}{0}
\setcounter{namec}{0}
\setcounter{savednamec}{0}
\setcounter{translator}{0}
\setcounter{savedtranslator}{0}
\setcounter{shortauthor}{0}
\setcounter{savedshortauthor}{0}
\setcounter{shorteditor}{0}
\setcounter{savedshorteditor}{0}
\setcounter{labelname}{0}
\setcounter{savedlabelname}{0}
\setcounter{institution}{0}
\setcounter{savedinstitution}{0}
\setcounter{lista}{0}
\setcounter{savedlista}{0}
\setcounter{listb}{0}
\setcounter{savedlistb}{0}
\setcounter{listc}{0}
\setcounter{savedlistc}{0}
\setcounter{listd}{0}
\setcounter{savedlistd}{0}
\setcounter{liste}{0}
\setcounter{savedliste}{0}
\setcounter{listf}{0}
\setcounter{savedlistf}{0}
\setcounter{location}{0}
\setcounter{savedlocation}{0}
\setcounter{organization}{0}
\setcounter{savedorganization}{0}
\setcounter{origlocation}{0}
\setcounter{savedoriglocation}{0}
\setcounter{origpublisher}{0}
\setcounter{savedorigpublisher}{0}
\setcounter{publisher}{0}
\setcounter{savedpublisher}{0}
\setcounter{language}{0}
\setcounter{savedlanguage}{0}
\setcounter{origlanguage}{0}
\setcounter{savedoriglanguage}{0}
\setcounter{pageref}{0}
\setcounter{savedpageref}{0}
\setcounter{textcitecount}{0}
\setcounter{textcitetotal}{0}
\setcounter{textcitemaxnames}{0}
\setcounter{biburlbigbreakpenalty}{100}
\setcounter{biburlbreakpenalty}{200}
\setcounter{biburlnumpenalty}{0}
\setcounter{biburlucpenalty}{0}
\setcounter{biburllcpenalty}{0}
\setcounter{smartand}{1}
\setcounter{bbx:relatedcount}{0}
\setcounter{bbx:relatedtotal}{0}
\setcounter{parentequation}{0}
\setcounter{lstnumber}{15}
\setcounter{FancyVerbLine}{0}
\setcounter{linenumber}{1}
\setcounter{LN@truepage}{65}
\setcounter{FancyVerbWriteLine}{0}
\setcounter{FancyVerbBufferLine}{0}
\setcounter{FV@TrueTabGroupLevel}{0}
\setcounter{FV@TrueTabCounter}{0}
\setcounter{FV@HighlightLinesStart}{0}
\setcounter{FV@HighlightLinesStop}{0}
\setcounter{FancyVerbLineBreakLast}{0}
\setcounter{FV@BreakBufferDepth}{0}
\setcounter{minted@FancyVerbLineTemp}{0}
\setcounter{listing}{0}
\setcounter{lstlisting}{0}
}

90
chapter_05.tex Normal file
View File

@@ -0,0 +1,90 @@
\section{Performance evaluation of different implementation variants}
\subsection{Verification of the \ac{DSP} implementation}
To verify the general performance of the \ac{DSP}-implemented \ac{ANR} algorithm, the complex usecase of the high-level implemenation is utilized, which includes, again, a 16-tap \ac{FIR} filter and an update of the filter coefficients every cycle. In contary to the high-level implementation, the coeffcient convergence is now not included in the evaluation anymore, but the metric for the \ac{ANR} performance stays the same as the \ac{SNR}-improvement.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_1_dsp_complex.png}
\caption{Desired signal, corrupted signal, reference noise signal and filter output of the complex \ac{ANR} use case, simulated on the \ac{DSP}}
\label{fig:fig_plot_1_dsp_complex.png}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_plot_2_dsp_complex.png}
\caption{Error signal of the complex \ac{ANR} use case, simulated on the \ac{DSP}}
\label{fig:fig_plot_2_dsp_complex.png}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_high_low_comparison.png}
\caption{Comparison of the high- and low-level simulation output. The Pearson coefficient shows a correlation of above 99\% between the two graphs.}
\label{fig:fig_high_low_comparison.png}
\end{figure}
\noindent Figure \ref{fig:fig_plot_1_dsp_complex.png} and \ref{fig:fig_plot_2_dsp_complex.png} show the results of the complex \ac{ANR} use case, simulated on the \ac{DSP} - with a \ac{SNR}-Gain of 6.98 dB it performs equivalent as the one of the high-level implementation. Figure \ref{fig:fig_high_low_comparison.png} shows both outputs seperately and then together in one sub figure. The \ac{DSP} output which features a Perason correlation of 99.3\% against the high-level output, again indicating the correct functionality of the \ac{DSP} implementation. The small difference can be explained by the fact that the \ac{DSP} implementation is based on fixed-point arithmetic, which leads to a slightly different convergence behavior. Nevertheless, the results show that the \ac{DSP} implementation of the \ac{ANR} algorithm is able to achieve the same performance as the high-level implementation, again indicating the fact, that 16 filter coefficients are sufficent to filter out a complex but synchrone noise signal. In reality, the \ac{ANR} algorithm is confronted with delayed signals, as the sensors are located im different positions. The next step is of evaluate the performance of the \ac{DSP} implementation in terms of computational efficiency under different scenarios and non-synchrone signals.
\subsection{Computational efficiency evaluation}
\noindent The main focus for evaluating the computational efficiency is the determination of the optimal filter length. To achieve this goal, different signal combinations, which are to be expected everyday situiations for a \ac{CI} patient, are considered. Now, also, a delay of 2ms bewteen the corrupted signal an the reference noise signal is applied, increasing the need for a longer filter. The desired signal of a male voice over speaker is now corrupted with 5 different noise signals, ruling out, that a certain combination of signals is not representative for the overall performance of the \ac{ANR} algorithm:
\begin{itemize}
\item Breathing noise: Already used in the high-level implementation, this noise signal is a typical noise source for \ac{CI} patients, especially in quiet environments. It consists out of slowly rising and falling maxima.
\item Coughing noise: This noise signal is generated by coughing and consists out few, but long lasting maxima, showing similarities to a rectangular function.
\item Scratching noise: This noise signal is generated by scratching some material with finger nails, like the hair or clothes. It consists out of a high number of sharp peaks.
\item Drinking Noise: This noise signal is generated by swallowing a liquid and consists out of a low number of sharp peaks, featuring long pauses between them.
\item Chewing Noise: This noise signal is generated by consuming food and consists out of a high number of peaks of different amplitude.
\end{itemize}
The vizualization of the noise signals is shown in Figure \ref{fig:fig_noise_signals.png}.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_noise_signals.png}
\caption{Noise signals used to corrupt the desired signal in the computational efficiency evaluation}
\label{fig:fig_noise_signals.png}
\end{figure}
\noindent The combination of stated sets delivers five different scenarious, everyone different in regard of it's challenges for the \ac{ANR} algorithm. For every scenario, the \ac{SNR}-Gain is calculated with an increasing set of filter coeffcients, ranging from 16 to 64.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_snr_comparison.png}
\caption{Simulation of the to be expected \ac{SNR}-Gain for different noise signals and filter lengths applied to the desired signal of a male speaker. The applied delay between the signals amounts 2ms. The graphs are smoothed by a third order savigol filter.}
\label{fig:fig_snr_comparison.png}
\end{figure}
\noindent Figure \ref{fig:fig_snr_comparison.png} shows the expected \ac{SNR}-Gain for the different noise signals and filter lengths. The results shows, that a minimum filter length of about 32 taps is required, before (in any case) a significant rise in the \ac{SNR}-Gain can be observed - this is highly contrary to the sinchronous high-level simulation, where a filter length of only 16 taps provided sufficent noise reduction. This circustance can be explained by the fact, that the reference noise signal is now delayed, meaning, that the filter needs a certain length before it can react. The results also show, that the \ac{SNR}-Gain is different for the different noise signals, indicating, that the noise signals have different characteristics, like the number of peaks, their frequency spectrum an their amplitude.\\ \\
The mean \ac{SNR}-Gain of the different noise signals, also shown in Figure \ref{fig:fig_snr_comparison.png}, signals, that after reaching 95\% of the maximum \ac{SNR}-Gain, the \ac{SNR}-Gain increase is slowing down. This threshold is reached at a filter length of 45 taps. This means, that a filter length of 45 taps represents an optimal solution for a statisfying performance of the \ac{ANR} algorithm, while a further increase of the filter length does not lead to a significant increase of the \ac{SNR}-Gain. This is an important finding, as it allows to optimize the computational efficiency of the \ac{ANR} algorithm by choosing an appropriate filter length.
\subsection{Evaluation of the computational load for fixed implementation}
\subsubsection{Full-Update implementation}
\noindent Equation \ref{equation_computing_final} can now be utilized to calculate the needed cycles for the calculation of one sample of the filter output, using a filter length of 45 taps and an update of the filter coefficients every cycle. The needed cycles are calculated as follows:
\begin{equation}
\label{equation_computing_calculation}
C_{total} = 45 + \frac{6*45+8}{1} + 34 = 357 \text{ cycles}
\end{equation}
As already mentioned in the previous chapters, the sampling rate of the audio data provided to the \ac{PCM} interface amounts 20 kHz. The prefered clock frequency of the \ac{DSP} is chosen as 16 MHz, which means, that the \ac{DSP} core has cycle budget of
\begin{equation}
\label{equation_cycle_budget}
C_{budget} = \frac{16 MHz}{20 kHz} = 800 \text{ cycles}
\end{equation}
\noindent for one sample. With these two values, the load of the \ac{DSP} core can be calculated as follows:
\begin{equation}
\label{equation_load_calculation}
Load_{DSP} = \frac{C_{total}}{C_{budget}} = \frac{357 \text{ cycles}}{800 \text{ cycles}} = 44.6 \%
\end{equation}
\noindent The results, calculated in Equation \ref{equation_computing_calculation} to \ref{equation_load_calculation} can be summarized as follows:\\ \\
With the optimal filter length of 45 taps and an update rate of the filter coefficients every cycle, the \ac{ANR} algorithm is able to achieve a \ac{SNR}-Gain of about 11.54 dB, averaged over different signal/noise combinatons. Under this circumstances, the computational load of the \ac{DSP} core amounts about 45\%, which means that 55\% of the time, which a new sample takes to arrive, it can be halted, and therefore, the overall power consumption can be reduced.\\ \\
The initial signal/noise combination of a male speaker disturbed by a breathing noise, which is used for the verification of the \ac{DSP} implementation, delivers with 45 filter coefficients an \ac{SNR}-Gain of about 9.44 dB, which will be again used as a benchmark for the coming evaluations.
\subsubsection{Reduced-update implementation}
The most straight-forward method to further reduce the computing effort for the \ac{DSP} core is to reduce the update frequency of the filter coeffcients. This means, that for every sample, the new filter coefficients are calculated, but not written to the into the Filter Line, meaning that the filter, calculated for the previous sample, is applied to the actual sample. Depending on the acoustic situation, the savings in computing power will most likely lead to a degredation of the noise reduction quality, depending if the current situation is highly dynamic (and therefore would require a frequent update of the filter coefficients) or is rather static. Changing the update frequency, changes the denominator in Equation \ref{equation_c_5} and therefore in Equation \ref{equation_computing_final}.\\ \\
As already mentioned, the reduction of the update rate is evaluated for the signal/noise combination of a male speaker disturbed by a breathing noise. Therefore the \ac{SNR}-Gain of 9.44 dB represents 100\% achievable noise reduction with a maximum of 357 cycles.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_snr_reduced_update.png}
\caption{Relative performance of the SNR-Gain, the cycles per samples and the DSP load in regard of the update rate of the ANR algorithm. The baseline is the full update variant the complex usecase. The marked dots represent the results of the simulation for an explicit setup.}
\label{fig:fig_snr_reduced_update.png}
\end{figure}
\noindent Figure \ref{fig:fig_snr_reduced_update.png} descriptively illustrates the trend of the \ac{SNR}-Gain, the executed cycles per sample and the \ac{DSP} load compared to the full-update algorithm. Contrary to the executed cycles per sample and the load of the processor, the \ac{SNR}-Gain does not behave linear over the course of reducing the update frequency. This behavior allows us, to determinte the update rate, where the benevolent ratio of \ac{SNR}-Gain in regard to \ac{DSP} load can be expected.\\ \\
The maximum offset bewteen the two graphs can be cound found at an updat rate of 0.33, meaning, that an update of the filter coefficients is only conducted every third sample. Updating Equation \ref{equation_computing_calculation} and \ref{equation_load_calculation} therefore delivers:
\begin{equation}
\label{equation_computing_calculation}
C_{total} = 45 + \frac{6*45+8}{0.33} + 34 = 171 \text{ cycles}
\end{equation}
\begin{equation}
\label{equation_load_calculation}
Load_{DSP} = \frac{C_{total}}{C_{budget}} = \frac{171 \text{ cycles}}{800 \text{ cycles}} = 21.4 \%
\end{equation}
The interpreation of this results leads to the coclusion, that the most cost-effective way to reduce the load of the \ac{DSP} would be to reduce the update rate of the filter coefficients to 0.33. This action nearly halfs the processor load, while only reducing the \ac{SNR}-Gain by rougly a third to 6.06 dB. The next step will be to determine the possibilites of a dynamic reduction of the update frequency to further improve the cost-value ratio of our implemenation.
\subsection{Evaluation of the computational load for error driven implementation}
The error-driven implemenation approach focuses on an error metric, over which the decision for an coefficient update is made.
\subsection{Summary of the performance evaluation}

151
chapter_06.aux Normal file
View File

@@ -0,0 +1,151 @@
\relax
\@writefile{toc}{\contentsline {section}{\numberline {6}Conclusion and outlook}{66}{}\protected@file@percent }
\@setckpt{chapter_06}{
\setcounter{page}{67}
\setcounter{equation}{36}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{section}{6}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{51}
\setcounter{table}{0}
\setcounter{float@type}{16}
\setcounter{tabx@nest}{0}
\setcounter{listtotal}{0}
\setcounter{listcount}{0}
\setcounter{liststart}{0}
\setcounter{liststop}{0}
\setcounter{citecount}{0}
\setcounter{citetotal}{0}
\setcounter{multicitecount}{0}
\setcounter{multicitetotal}{0}
\setcounter{instcount}{18}
\setcounter{maxnames}{3}
\setcounter{minnames}{1}
\setcounter{maxitems}{3}
\setcounter{minitems}{1}
\setcounter{citecounter}{0}
\setcounter{maxcitecounter}{0}
\setcounter{savedcitecounter}{0}
\setcounter{uniquelist}{0}
\setcounter{uniquename}{0}
\setcounter{refsection}{0}
\setcounter{refsegment}{0}
\setcounter{maxextratitle}{0}
\setcounter{maxextratitleyear}{0}
\setcounter{maxextraname}{3}
\setcounter{maxextradate}{0}
\setcounter{maxextraalpha}{0}
\setcounter{abbrvpenalty}{50}
\setcounter{highnamepenalty}{50}
\setcounter{lownamepenalty}{25}
\setcounter{maxparens}{3}
\setcounter{parenlevel}{0}
\setcounter{blx@maxsection}{0}
\setcounter{mincomprange}{10}
\setcounter{maxcomprange}{100000}
\setcounter{mincompwidth}{1}
\setcounter{afterword}{0}
\setcounter{savedafterword}{0}
\setcounter{annotator}{0}
\setcounter{savedannotator}{0}
\setcounter{author}{0}
\setcounter{savedauthor}{0}
\setcounter{bookauthor}{0}
\setcounter{savedbookauthor}{0}
\setcounter{commentator}{0}
\setcounter{savedcommentator}{0}
\setcounter{editor}{0}
\setcounter{savededitor}{0}
\setcounter{editora}{0}
\setcounter{savededitora}{0}
\setcounter{editorb}{0}
\setcounter{savededitorb}{0}
\setcounter{editorc}{0}
\setcounter{savededitorc}{0}
\setcounter{foreword}{0}
\setcounter{savedforeword}{0}
\setcounter{holder}{0}
\setcounter{savedholder}{0}
\setcounter{introduction}{0}
\setcounter{savedintroduction}{0}
\setcounter{namea}{0}
\setcounter{savednamea}{0}
\setcounter{nameb}{0}
\setcounter{savednameb}{0}
\setcounter{namec}{0}
\setcounter{savednamec}{0}
\setcounter{translator}{0}
\setcounter{savedtranslator}{0}
\setcounter{shortauthor}{0}
\setcounter{savedshortauthor}{0}
\setcounter{shorteditor}{0}
\setcounter{savedshorteditor}{0}
\setcounter{labelname}{0}
\setcounter{savedlabelname}{0}
\setcounter{institution}{0}
\setcounter{savedinstitution}{0}
\setcounter{lista}{0}
\setcounter{savedlista}{0}
\setcounter{listb}{0}
\setcounter{savedlistb}{0}
\setcounter{listc}{0}
\setcounter{savedlistc}{0}
\setcounter{listd}{0}
\setcounter{savedlistd}{0}
\setcounter{liste}{0}
\setcounter{savedliste}{0}
\setcounter{listf}{0}
\setcounter{savedlistf}{0}
\setcounter{location}{0}
\setcounter{savedlocation}{0}
\setcounter{organization}{0}
\setcounter{savedorganization}{0}
\setcounter{origlocation}{0}
\setcounter{savedoriglocation}{0}
\setcounter{origpublisher}{0}
\setcounter{savedorigpublisher}{0}
\setcounter{publisher}{0}
\setcounter{savedpublisher}{0}
\setcounter{language}{0}
\setcounter{savedlanguage}{0}
\setcounter{origlanguage}{0}
\setcounter{savedoriglanguage}{0}
\setcounter{pageref}{0}
\setcounter{savedpageref}{0}
\setcounter{textcitecount}{0}
\setcounter{textcitetotal}{0}
\setcounter{textcitemaxnames}{0}
\setcounter{biburlbigbreakpenalty}{100}
\setcounter{biburlbreakpenalty}{200}
\setcounter{biburlnumpenalty}{0}
\setcounter{biburlucpenalty}{0}
\setcounter{biburllcpenalty}{0}
\setcounter{smartand}{1}
\setcounter{bbx:relatedcount}{0}
\setcounter{bbx:relatedtotal}{0}
\setcounter{parentequation}{0}
\setcounter{lstnumber}{15}
\setcounter{FancyVerbLine}{0}
\setcounter{linenumber}{1}
\setcounter{LN@truepage}{66}
\setcounter{FancyVerbWriteLine}{0}
\setcounter{FancyVerbBufferLine}{0}
\setcounter{FV@TrueTabGroupLevel}{0}
\setcounter{FV@TrueTabCounter}{0}
\setcounter{FV@HighlightLinesStart}{0}
\setcounter{FV@HighlightLinesStop}{0}
\setcounter{FancyVerbLineBreakLast}{0}
\setcounter{FV@BreakBufferDepth}{0}
\setcounter{minted@FancyVerbLineTemp}{0}
\setcounter{listing}{0}
\setcounter{lstlisting}{0}
}

1
chapter_06.tex Normal file
View File

@@ -0,0 +1 @@
\section{Conclusion and outlook}

View File

@@ -1,23 +1,23 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36" version="29.3.4"> <mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36" version="29.3.8">
<diagram name="Seite-1" id="BWOSVWQKrhK0Pcg9Olm2"> <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="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">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
<mxCell id="qO-CM7M714h87kHfMT8G-5" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#36393d;" value="" vertex="1"> <mxCell id="qO-CM7M714h87kHfMT8G-5" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#36393d;" value="" vertex="1">
<mxGeometry height="480" width="520" x="510" y="200" as="geometry" /> <mxGeometry height="460" width="520" x="510" y="200" as="geometry" />
</mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-12" edge="1" parent="1" source="ngw2JN3qWJ9t0b-mEEB_-9" style="endArrow=classic;html=1;rounded=0;exitX=0.13;exitY=-0.031;exitDx=0;exitDy=0;exitPerimeter=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="650" y="460" as="sourcePoint" />
<mxPoint x="770" y="460" as="targetPoint" />
</mxGeometry>
</mxCell> </mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-1" parent="1" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;strokeWidth=2;" value="" vertex="1"> <mxCell id="8LSkbo7Ni411-_OUStLd-1" parent="1" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;strokeWidth=2;" value="" vertex="1">
<mxGeometry height="80" width="80" x="690" y="230" as="geometry" /> <mxGeometry height="80" width="80" x="690" y="230" as="geometry" />
</mxCell> </mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-12" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;exitX=0.13;exitY=-0.031;exitDx=0;exitDy=0;exitPerimeter=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="674.9999999999999" y="530.0000000000001" as="sourcePoint" />
<mxPoint x="785" y="391.86" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" value="" vertex="1"> <mxCell id="8LSkbo7Ni411-_OUStLd-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" value="" vertex="1">
<mxGeometry height="60" width="120" x="670" y="480" as="geometry" /> <mxGeometry height="60" width="120" x="670" y="430" as="geometry" />
</mxCell> </mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-4" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value=""> <mxCell id="8LSkbo7Ni411-_OUStLd-4" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
@@ -25,20 +25,11 @@
<mxPoint x="1130" y="270" as="targetPoint" /> <mxPoint x="1130" y="270" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-3" parent="1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=15;" value="&lt;b&gt;W&lt;sub&gt;2&lt;/sub&gt;&lt;/b&gt;" vertex="1"> <mxCell id="8LSkbo7Ni411-_OUStLd-3" parent="1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=15;" value="&lt;b&gt;W&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="40" x="710" y="490" as="geometry" /> <mxGeometry height="30" width="40" x="710" y="445" as="geometry" />
</mxCell> </mxCell>
<mxCell id="qO-CM7M714h87kHfMT8G-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eeeeee;strokeColor=#36393d;" value="" vertex="1"> <mxCell id="qO-CM7M714h87kHfMT8G-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eeeeee;strokeColor=#36393d;" value="" vertex="1">
<mxGeometry height="480" width="240" x="270" y="200" as="geometry" /> <mxGeometry height="460" width="240" x="270" y="200" as="geometry" />
</mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-6" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="8LSkbo7Ni411-_OUStLd-2" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="620" y="510" />
</Array>
<mxPoint x="620" y="460" as="sourcePoint" />
<mxPoint x="1040" y="370" as="targetPoint" />
</mxGeometry>
</mxCell> </mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-7" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" value="" vertex="1"> <mxCell id="8LSkbo7Ni411-_OUStLd-7" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" value="" vertex="1">
<mxGeometry height="60" width="120" x="330" y="240" as="geometry" /> <mxGeometry height="60" width="120" x="330" y="240" as="geometry" />
@@ -52,14 +43,13 @@
<mxPoint x="392.5" y="270" as="targetPoint" /> <mxPoint x="392.5" y="270" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-10" edge="1" parent="1" source="8LSkbo7Ni411-_OUStLd-8" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="ngw2JN3qWJ9t0b-mEEB_-14" value=""> <mxCell id="8LSkbo7Ni411-_OUStLd-10" edge="1" parent="1" source="8LSkbo7Ni411-_OUStLd-8" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="8LSkbo7Ni411-_OUStLd-2" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points"> <Array as="points">
<mxPoint x="620" y="460" /> <mxPoint x="620" y="460" />
<mxPoint x="620" y="420" />
</Array> </Array>
<mxPoint x="510" y="460" as="sourcePoint" /> <mxPoint x="510" y="460" as="sourcePoint" />
<mxPoint x="410" y="460" as="targetPoint" /> <mxPoint x="670" y="420" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="8LSkbo7Ni411-_OUStLd-11" edge="1" parent="1" source="uwalZ4GZDBHuo1GNIbxM-2" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value=""> <mxCell id="8LSkbo7Ni411-_OUStLd-11" edge="1" parent="1" source="uwalZ4GZDBHuo1GNIbxM-2" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
@@ -102,41 +92,24 @@
<mxGeometry height="40" width="190" x="780" y="227.5" as="geometry" /> <mxGeometry height="40" width="190" x="780" y="227.5" as="geometry" />
</mxCell> </mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-9" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;strokeWidth=2;" value="&lt;span style=&quot;font-size: 15px;&quot;&gt;LMS&lt;/span&gt;" vertex="1"> <mxCell id="ngw2JN3qWJ9t0b-mEEB_-9" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;strokeWidth=2;" value="&lt;span style=&quot;font-size: 15px;&quot;&gt;LMS&lt;/span&gt;" vertex="1">
<mxGeometry height="60" width="120" x="670" y="580" as="geometry" /> <mxGeometry height="60" width="120" x="670" y="530" as="geometry" />
</mxCell> </mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-10" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="ngw2JN3qWJ9t0b-mEEB_-9" value=""> <mxCell id="ngw2JN3qWJ9t0b-mEEB_-10" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="ngw2JN3qWJ9t0b-mEEB_-9" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points"> <Array as="points">
<mxPoint x="980" y="610" /> <mxPoint x="980" y="560" />
</Array> </Array>
<mxPoint x="980" y="270" as="sourcePoint" /> <mxPoint x="980" y="270" as="sourcePoint" />
<mxPoint x="940" y="369" as="targetPoint" /> <mxPoint x="940" y="369" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-14" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" value="" vertex="1"> <mxCell id="ngw2JN3qWJ9t0b-mEEB_-17" edge="1" parent="1" source="8LSkbo7Ni411-_OUStLd-2" style="endArrow=none;html=1;rounded=0;strokeWidth=2;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" value="">
<mxGeometry height="60" width="120" x="670" y="390" as="geometry" />
</mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-15" parent="1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=15;" value="&lt;b&gt;W&lt;sub&gt;1&lt;/sub&gt;&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="40" x="710" y="400" as="geometry" />
</mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-17" edge="1" parent="1" style="endArrow=none;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points"> <Array as="points" />
<mxPoint x="840" y="420" />
</Array>
<mxPoint x="790" y="420" as="sourcePoint" /> <mxPoint x="790" y="420" as="sourcePoint" />
<mxPoint x="840" y="460" as="targetPoint" /> <mxPoint x="840" y="460" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-18" edge="1" parent="1" source="8LSkbo7Ni411-_OUStLd-2" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="840" y="510" />
</Array>
<mxPoint x="830" y="510" as="sourcePoint" />
<mxPoint x="840" y="460" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ngw2JN3qWJ9t0b-mEEB_-19" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=2;" target="8LSkbo7Ni411-_OUStLd-1" value=""> <mxCell id="ngw2JN3qWJ9t0b-mEEB_-19" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=2;" target="8LSkbo7Ni411-_OUStLd-1" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points"> <Array as="points">
@@ -160,9 +133,9 @@
<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"> <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" /> <mxGeometry height="85" width="222.5" x="658.75" y="142.5" as="geometry" />
</mxCell> </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.5;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" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;" target="8LSkbo7Ni411-_OUStLd-8" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="270" y="330" as="sourcePoint" /> <mxPoint x="270" y="460" as="sourcePoint" />
<mxPoint x="430" y="390" as="targetPoint" /> <mxPoint x="430" y="390" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
@@ -190,9 +163,9 @@
<mxPoint x="450" y="252.07999999999998" as="targetPoint" /> <mxPoint x="450" y="252.07999999999998" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </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=""> <mxCell id="sM4xvtsetW-iOXl8wo82-3" edge="1" parent="1" source="qO-CM7M714h87kHfMT8G-4" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=-0.001;entryY=0.562;entryDx=0;entryDy=0;entryPerimeter=0;exitX=-0.001;exitY=0.161;exitDx=0;exitDy=0;exitPerimeter=0;" target="8LSkbo7Ni411-_OUStLd-7" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="270" y="277.58" as="sourcePoint" /> <mxPoint x="270" y="278" as="sourcePoint" />
<mxPoint x="335" y="277.5" as="targetPoint" /> <mxPoint x="335" y="277.5" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>

View File

@@ -1,159 +1,159 @@
<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.0.3"> <mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36" version="29.3.4">
<diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ"> <diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ">
<mxGraphModel dx="-280" dy="297" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <mxGraphModel dx="576" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
<mxCell id="H6R4VGwbr_i7cj5zOMue-17" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-17" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1299.58" y="80" as="sourcePoint" /> <mxPoint x="1299.58" y="80" as="sourcePoint" />
<mxPoint x="1300" y="120" as="targetPoint" /> <mxPoint x="1300" y="120" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-19" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-19" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1299.58" y="160" as="sourcePoint" /> <mxPoint x="1299.58" y="160" as="sourcePoint" />
<mxPoint x="1300" y="200" as="targetPoint" /> <mxPoint x="1300" y="200" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-21" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-21" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1300" y="240" as="sourcePoint" /> <mxPoint x="1300" y="240" as="sourcePoint" />
<mxPoint x="1300" y="270" as="targetPoint" /> <mxPoint x="1300" y="270" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-23" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-23" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1299.58" y="310" as="sourcePoint" /> <mxPoint x="1299.58" y="310" as="sourcePoint" />
<mxPoint x="1300" y="350" as="targetPoint" /> <mxPoint x="1300" y="350" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-25" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Accumulator +=&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Noise&lt;sub&gt;[&lt;/sub&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&lt;sub&gt;j+i]&lt;/sub&gt; * Filter&lt;sub&gt;[i]&lt;/sub&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-25" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Accumulator +=&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Noise&lt;sub&gt;[&lt;/sub&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&lt;sub&gt;j+i]&lt;/sub&gt; * Filter&lt;sub&gt;[i]&lt;/sub&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="1200" y="350" width="200" height="60" as="geometry" /> <mxGeometry height="60" width="200" x="1200" y="350" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-27" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="H6R4VGwbr_i7cj5zOMue-25" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-27" edge="1" parent="1" source="H6R4VGwbr_i7cj5zOMue-25" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1490" y="350" as="sourcePoint" />
<mxPoint x="1340" y="290" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1440" y="380" /> <mxPoint x="1440" y="380" />
<mxPoint x="1440" y="290" /> <mxPoint x="1440" y="290" />
</Array> </Array>
<mxPoint x="1490" y="350" as="sourcePoint" />
<mxPoint x="1340" y="290" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-28" value="i++" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="H6R4VGwbr_i7cj5zOMue-27" vertex="1" connectable="0"> <mxCell id="H6R4VGwbr_i7cj5zOMue-28" connectable="0" parent="H6R4VGwbr_i7cj5zOMue-27" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" value="i++" vertex="1">
<mxGeometry x="-0.2439" y="3" relative="1" as="geometry"> <mxGeometry relative="1" x="-0.2439" y="3" as="geometry">
<mxPoint y="3" as="offset" /> <mxPoint y="3" as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-30" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="H6R4VGwbr_i7cj5zOMue-25" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-30" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="H6R4VGwbr_i7cj5zOMue-25" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1160" y="379.9999999999999" as="sourcePoint" /> <mxPoint x="1160" y="379.9999999999999" as="sourcePoint" />
<mxPoint x="1130.42" y="500" as="targetPoint" /> <mxPoint x="1130.42" y="500" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-31" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="H6R4VGwbr_i7cj5zOMue-25" target="H6R4VGwbr_i7cj5zOMue-32" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-31" edge="1" parent="1" source="H6R4VGwbr_i7cj5zOMue-25" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="H6R4VGwbr_i7cj5zOMue-32" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1410" y="420" as="sourcePoint" /> <mxPoint x="1410" y="420" as="sourcePoint" />
<mxPoint x="1410.42" y="460" as="targetPoint" /> <mxPoint x="1410.42" y="460" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-32" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Output&lt;sub&gt;[j]&lt;/sub&gt; = &lt;br&gt;Input&lt;sub&gt;[j]&lt;/sub&gt; - Accumulator&lt;/font&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-32" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Output&lt;sub&gt;[j]&lt;/sub&gt; = &lt;br&gt;Input&lt;sub&gt;[j]&lt;/sub&gt; - Accumulator&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="1200" y="450" width="200" height="60" as="geometry" /> <mxGeometry height="60" width="200" x="1200" y="450" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-34" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" target="JXUbh7mfEI0vDSi9tXp8-2" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-34" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="JXUbh7mfEI0vDSi9tXp8-2" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1299.8600000000001" y="510" as="sourcePoint" /> <mxPoint x="1299.8600000000001" y="510" as="sourcePoint" />
<mxPoint x="1299.8600000000001" y="560" as="targetPoint" /> <mxPoint x="1299.8600000000001" y="560" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-35" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Correction =&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: rgb(32, 33, 34); font-family: sans-serif; text-align: start;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;font&gt;µ&lt;/font&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Output&lt;sub&gt;[j]&lt;/sub&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-35" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Correction =&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: rgb(32, 33, 34); font-family: sans-serif; text-align: start;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;font&gt;µ&lt;/font&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Output&lt;sub&gt;[j]&lt;/sub&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="1200" y="630" width="210" height="60" as="geometry" /> <mxGeometry height="60" width="210" x="1200" y="630" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-38" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Filter&lt;sub&gt;[k]&lt;/sub&gt; =&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Correction * Noise&lt;sub&gt;[j+k]&lt;/sub&gt;&lt;/font&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-38" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Filter&lt;sub&gt;[k]&lt;/sub&gt;&amp;nbsp;+=&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Correction * Noise&lt;sub&gt;[j+k]&lt;/sub&gt;&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="1490" y="350" width="170" height="60" as="geometry" /> <mxGeometry height="60" width="170" x="1490" y="350" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-39" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Input&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[d&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, d&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... ,&amp;nbsp;dM-N]&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-39" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Input&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[d&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, d&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... ,&amp;nbsp;dM-N]&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="1200" y="40" width="200" height="40" as="geometry" /> <mxGeometry height="40" width="200" x="1200" y="40" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-41" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;j = 0&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-41" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;j = 0&lt;/font&gt;" vertex="1">
<mxGeometry x="1260" y="120" width="80" height="40" as="geometry" /> <mxGeometry height="40" width="80" x="1260" y="120" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="H6R4VGwbr_i7cj5zOMue-41" target="H6R4VGwbr_i7cj5zOMue-41" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-42" edge="1" parent="1" source="H6R4VGwbr_i7cj5zOMue-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="H6R4VGwbr_i7cj5zOMue-41">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-43" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;i = 0&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-43" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;i = 0&lt;/font&gt;" vertex="1">
<mxGeometry x="1265" y="270" width="80" height="40" as="geometry" /> <mxGeometry height="40" width="80" x="1265" y="270" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-44" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Filter&lt;/b&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[w&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, w&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... , w&lt;sub&gt;M-N&lt;/sub&gt;]&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-44" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Filter&lt;/b&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[w&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, w&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... , w&lt;sub&gt;M-N&lt;/sub&gt;]&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="1200" y="200" width="200" height="40" as="geometry" /> <mxGeometry height="40" width="200" x="1200" y="200" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-45" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="H6R4VGwbr_i7cj5zOMue-35" target="H6R4VGwbr_i7cj5zOMue-41" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-45" edge="1" parent="1" source="H6R4VGwbr_i7cj5zOMue-35" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="H6R4VGwbr_i7cj5zOMue-41" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1440" y="610" as="sourcePoint" />
<mxPoint x="1475" y="340" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1305" y="720" /> <mxPoint x="1305" y="720" />
<mxPoint x="950" y="720" /> <mxPoint x="950" y="720" />
<mxPoint x="950" y="140" /> <mxPoint x="950" y="140" />
</Array> </Array>
<mxPoint x="1440" y="610" as="sourcePoint" />
<mxPoint x="1475" y="340" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-46" value="j++" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="H6R4VGwbr_i7cj5zOMue-45" vertex="1" connectable="0"> <mxCell id="H6R4VGwbr_i7cj5zOMue-46" connectable="0" parent="H6R4VGwbr_i7cj5zOMue-45" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" value="j++" vertex="1">
<mxGeometry x="0.2417" y="1" relative="1" as="geometry"> <mxGeometry relative="1" x="0.2417" y="1" as="geometry">
<mxPoint y="67" as="offset" /> <mxPoint y="67" as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-48" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="H6R4VGwbr_i7cj5zOMue-38" target="H6R4VGwbr_i7cj5zOMue-44" edge="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-48" edge="1" parent="1" source="H6R4VGwbr_i7cj5zOMue-38" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="H6R4VGwbr_i7cj5zOMue-44" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1290" y="390" as="sourcePoint" />
<mxPoint x="1340" y="340" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1575" y="220" /> <mxPoint x="1575" y="220" />
</Array> </Array>
<mxPoint x="1290" y="390" as="sourcePoint" />
<mxPoint x="1340" y="340" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n1TZPSIdfv_mN465yjPh-1" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;k = 0&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1"> <mxCell id="n1TZPSIdfv_mN465yjPh-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;k = 0&lt;/font&gt;" vertex="1">
<mxGeometry x="1535" y="460" width="80" height="40" as="geometry" /> <mxGeometry height="40" width="80" x="1535" y="460" as="geometry" />
</mxCell> </mxCell>
<mxCell id="n1TZPSIdfv_mN465yjPh-2" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="H6R4VGwbr_i7cj5zOMue-35" target="n1TZPSIdfv_mN465yjPh-1" edge="1"> <mxCell id="n1TZPSIdfv_mN465yjPh-2" edge="1" parent="1" source="H6R4VGwbr_i7cj5zOMue-35" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="n1TZPSIdfv_mN465yjPh-1" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1450" y="580" as="sourcePoint" />
<mxPoint x="1460" y="530" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1575" y="660" /> <mxPoint x="1575" y="660" />
</Array> </Array>
<mxPoint x="1450" y="580" as="sourcePoint" />
<mxPoint x="1460" y="530" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n1TZPSIdfv_mN465yjPh-3" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Noise&lt;/b&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[x&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, x&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... , x&lt;sub&gt;M-N&lt;/sub&gt;]&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxCell id="n1TZPSIdfv_mN465yjPh-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Noise&lt;/b&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[x&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, x&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... , x&lt;sub&gt;M-N&lt;/sub&gt;]&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="970" y="360" width="190" height="40" as="geometry" /> <mxGeometry height="40" width="190" x="970" y="360" as="geometry" />
</mxCell> </mxCell>
<mxCell id="n1TZPSIdfv_mN465yjPh-4" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="n1TZPSIdfv_mN465yjPh-1" target="H6R4VGwbr_i7cj5zOMue-38" edge="1"> <mxCell id="n1TZPSIdfv_mN465yjPh-4" edge="1" parent="1" source="n1TZPSIdfv_mN465yjPh-1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" target="H6R4VGwbr_i7cj5zOMue-38" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1580" y="470" as="sourcePoint" /> <mxPoint x="1580" y="470" as="sourcePoint" />
<mxPoint x="1630" y="420" as="targetPoint" /> <mxPoint x="1630" y="420" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n1TZPSIdfv_mN465yjPh-5" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="H6R4VGwbr_i7cj5zOMue-38" target="n1TZPSIdfv_mN465yjPh-1" edge="1"> <mxCell id="n1TZPSIdfv_mN465yjPh-5" edge="1" parent="1" source="H6R4VGwbr_i7cj5zOMue-38" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="n1TZPSIdfv_mN465yjPh-1" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1460" y="380" as="sourcePoint" />
<mxPoint x="1510" y="330" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1460" y="380" /> <mxPoint x="1460" y="380" />
<mxPoint x="1460" y="480" /> <mxPoint x="1460" y="480" />
</Array> </Array>
<mxPoint x="1460" y="380" as="sourcePoint" />
<mxPoint x="1510" y="330" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n1TZPSIdfv_mN465yjPh-6" value="k++" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="n1TZPSIdfv_mN465yjPh-5" vertex="1" connectable="0"> <mxCell id="n1TZPSIdfv_mN465yjPh-6" connectable="0" parent="n1TZPSIdfv_mN465yjPh-5" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" value="k++" vertex="1">
<mxGeometry x="-0.2231" y="1" relative="1" as="geometry"> <mxGeometry relative="1" x="-0.2231" y="1" as="geometry">
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="JXUbh7mfEI0vDSi9tXp8-2" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Output&lt;/b&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[o&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, o&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... , o&lt;sub&gt;M-N&lt;/sub&gt;]&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxCell id="JXUbh7mfEI0vDSi9tXp8-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;font&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b style=&quot;&quot;&gt;Output&lt;/b&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;font style=&quot;&quot;&gt;[o&lt;sub style=&quot;&quot;&gt;1&lt;/sub&gt;, o&lt;/font&gt;&lt;sub style=&quot;&quot;&gt;2&lt;/sub&gt;, ... , o&lt;sub&gt;M-N&lt;/sub&gt;]&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry x="1200" y="550" width="200" height="40" as="geometry" /> <mxGeometry height="40" width="200" x="1200" y="550" as="geometry" />
</mxCell> </mxCell>
<mxCell id="JXUbh7mfEI0vDSi9tXp8-4" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" edge="1"> <mxCell id="JXUbh7mfEI0vDSi9tXp8-4" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;exitX=0.462;exitY=1.333;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" value="">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1304.58" y="590" as="sourcePoint" /> <mxPoint x="1304.58" y="590" as="sourcePoint" />
<mxPoint x="1305" y="630" as="targetPoint" /> <mxPoint x="1305" y="630" as="targetPoint" />
</mxGeometry> </mxGeometry>

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/144.0.0.0 Safari/537.36" version="29.3.1"> <mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36" version="29.3.4">
<diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ"> <diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ">
<mxGraphModel dx="-171" dy="354" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <mxGraphModel dx="576" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
@@ -184,7 +184,7 @@
<mxPoint x="1320" y="860" as="targetPoint" /> <mxPoint x="1320" y="860" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="yYsWn2o99izGpPgvcdo1-44" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="&lt;div&gt;&lt;span style=&quot;font-size: 14px; background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&lt;b&gt;Calculate next Sample&lt;br&gt;&lt;/b&gt;calc()&lt;/span&gt;&lt;/div&gt;" vertex="1"> <mxCell id="yYsWn2o99izGpPgvcdo1-44" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="&lt;div&gt;&lt;span style=&quot;font-size: 14px; background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&lt;b&gt;Calculate next Sample&lt;br&gt;&lt;/b&gt;calculate_output()&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="40" width="200" x="1200" y="850" as="geometry" /> <mxGeometry height="40" width="200" x="1200" y="850" as="geometry" />
</mxCell> </mxCell>
<mxCell id="yYsWn2o99izGpPgvcdo1-45" edge="1" parent="1" source="yYsWn2o99izGpPgvcdo1-44" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.344;entryY=1.013;entryDx=0;entryDy=0;entryPerimeter=0;" target="yYsWn2o99izGpPgvcdo1-33" value="&lt;font style=&quot;font-size: 13px;&quot;&gt;Write Sample&lt;/font&gt;"> <mxCell id="yYsWn2o99izGpPgvcdo1-45" edge="1" parent="1" source="yYsWn2o99izGpPgvcdo1-44" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.344;entryY=1.013;entryDx=0;entryDy=0;entryPerimeter=0;" target="yYsWn2o99izGpPgvcdo1-33" value="&lt;font style=&quot;font-size: 13px;&quot;&gt;Write Sample&lt;/font&gt;">

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/144.0.0.0 Safari/537.36" version="29.3.4"> <mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36" version="29.3.8">
<diagram name="Page-1" id="V-e6ogSouhfiz4ZDr4nW"> <diagram name="Page-1" id="V-e6ogSouhfiz4ZDr4nW">
<mxGraphModel dx="983" dy="512" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <mxGraphModel dx="815" dy="425" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
@@ -55,10 +55,10 @@
<mxCell id="GcUYTYrn2KeO2qM5n07K-17" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-17" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1">
<mxGeometry height="25" width="25" x="278" y="217.5" as="geometry" /> <mxGeometry height="25" width="25" x="278" y="217.5" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-18" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Delay&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-18" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Sample Line&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="30" width="60" x="180" y="85" as="geometry" /> <mxGeometry height="30" width="70" x="180" y="85" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-19" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-19" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter Line&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="40" width="60" x="340" y="80" as="geometry" /> <mxGeometry height="40" width="60" x="340" y="80" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-20" edge="1" parent="1" source="GcUYTYrn2KeO2qM5n07K-14" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="GcUYTYrn2KeO2qM5n07K-5" value=""> <mxCell id="GcUYTYrn2KeO2qM5n07K-20" edge="1" parent="1" source="GcUYTYrn2KeO2qM5n07K-14" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="GcUYTYrn2KeO2qM5n07K-5" value="">
@@ -289,10 +289,10 @@
<mxCell id="GcUYTYrn2KeO2qM5n07K-230" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-230" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1">
<mxGeometry height="25" width="25" x="278" y="607.5" as="geometry" /> <mxGeometry height="25" width="25" x="278" y="607.5" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-231" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Delay&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-231" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Sample Line&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="30" width="60" x="180" y="475" as="geometry" /> <mxGeometry height="30" width="70" x="175" y="475" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-232" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-232" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter Line&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="40" width="60" x="340" y="470" as="geometry" /> <mxGeometry height="40" width="60" x="340" y="470" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-233" edge="1" parent="1" source="GcUYTYrn2KeO2qM5n07K-227" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="GcUYTYrn2KeO2qM5n07K-218" value=""> <mxCell id="GcUYTYrn2KeO2qM5n07K-233" edge="1" parent="1" source="GcUYTYrn2KeO2qM5n07K-227" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="GcUYTYrn2KeO2qM5n07K-218" value="">
@@ -523,10 +523,10 @@
<mxCell id="GcUYTYrn2KeO2qM5n07K-285" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-285" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1">
<mxGeometry height="25" width="25" x="278" y="997.5" as="geometry" /> <mxGeometry height="25" width="25" x="278" y="997.5" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-286" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Delay&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-286" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Sample Line&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="30" width="60" x="180" y="865" as="geometry" /> <mxGeometry height="30" width="70" x="175" y="865" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-287" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-287" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter Line&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="40" width="60" x="340" y="860" as="geometry" /> <mxGeometry height="40" width="60" x="340" y="860" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-288" edge="1" parent="1" source="GcUYTYrn2KeO2qM5n07K-282" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="GcUYTYrn2KeO2qM5n07K-273" value=""> <mxCell id="GcUYTYrn2KeO2qM5n07K-288" edge="1" parent="1" source="GcUYTYrn2KeO2qM5n07K-282" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="GcUYTYrn2KeO2qM5n07K-273" value="">
@@ -688,7 +688,7 @@
<mxCell id="GcUYTYrn2KeO2qM5n07K-316" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=1;fontSize=14;" value="2nd Cycle - FIR Caclulation" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-316" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=1;fontSize=14;" value="2nd Cycle - FIR Caclulation" vertex="1">
<mxGeometry height="30" width="210" x="40" y="820" as="geometry" /> <mxGeometry height="30" width="210" x="40" y="820" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-317" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" value="Acc&lt;div&gt;&lt;span style=&quot;font-size: 7px;&quot;&gt;(=w1 * x1)&lt;/span&gt;&lt;/div&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-317" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" value="Acc&lt;div&gt;&lt;span style=&quot;font-size: 7px;&quot;&gt;(=w&lt;sub&gt;1&lt;/sub&gt; * x&lt;sub&gt;1&lt;/sub&gt;)&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="50" x="264.5" y="1091" as="geometry" /> <mxGeometry height="30" width="50" x="264.5" y="1091" as="geometry" />
</mxCell> </mxCell>
<mxCell id="GcUYTYrn2KeO2qM5n07K-318" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="d&lt;sub&gt;2&lt;/sub&gt;" vertex="1"> <mxCell id="GcUYTYrn2KeO2qM5n07K-318" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="d&lt;sub&gt;2&lt;/sub&gt;" vertex="1">
@@ -730,7 +730,7 @@
<mxCell id="zqf6Z4ZYqrToiwcanCgf-8" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="0" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-8" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="0" vertex="1">
<mxGeometry height="30" width="80" x="753.75" y="605" as="geometry" /> <mxGeometry height="30" width="80" x="753.75" y="605" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-9" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="w&lt;sub&gt;1&lt;br&gt;&lt;/sub&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;(=&amp;nbsp;&lt;span style=&quot;color: rgb(32, 33, 34); font-family: sans-serif; font-style: italic; text-align: start;&quot;&gt;µ*d1*x1)&lt;/span&gt;&lt;/font&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-9" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="w&lt;sub&gt;1&lt;br&gt;&lt;/sub&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;(=&amp;nbsp;&lt;span style=&quot;color: rgb(32, 33, 34); font-family: sans-serif; font-style: italic; text-align: start;&quot;&gt;µ*d&lt;sub&gt;1&lt;/sub&gt;*x&lt;sub&gt;1&lt;/sub&gt;)&lt;/span&gt;&lt;/font&gt;" vertex="1">
<mxGeometry height="30" width="80" x="913.75" y="515" as="geometry" /> <mxGeometry height="30" width="80" x="913.75" y="515" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-10" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="0" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-10" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="0" vertex="1">
@@ -757,10 +757,10 @@
<mxCell id="zqf6Z4ZYqrToiwcanCgf-17" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-17" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1">
<mxGeometry height="25" width="25" x="861.75" y="607.5" as="geometry" /> <mxGeometry height="25" width="25" x="861.75" y="607.5" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-18" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Delay&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-18" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Sample Line&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="30" width="60" x="763.75" y="475" as="geometry" /> <mxGeometry height="30" width="76.25" x="757.5" y="475" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-19" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-19" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter Line&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="40" width="60" x="923.75" y="470" as="geometry" /> <mxGeometry height="40" width="60" x="923.75" y="470" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-20" edge="1" parent="1" source="zqf6Z4ZYqrToiwcanCgf-14" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="zqf6Z4ZYqrToiwcanCgf-5" value=""> <mxCell id="zqf6Z4ZYqrToiwcanCgf-20" edge="1" parent="1" source="zqf6Z4ZYqrToiwcanCgf-14" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="zqf6Z4ZYqrToiwcanCgf-5" value="">
@@ -964,10 +964,10 @@
<mxCell id="zqf6Z4ZYqrToiwcanCgf-117" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="0" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-117" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="0" vertex="1">
<mxGeometry height="30" width="80" x="753.75" y="995" as="geometry" /> <mxGeometry height="30" width="80" x="753.75" y="995" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-118" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="w&lt;sub&gt;1&lt;/sub&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-118" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="w&lt;sub&gt;1&lt;/sub&gt;&lt;br&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;(= w&lt;sub&gt;1&lt;/sub&gt; +&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: rgb(32, 33, 34); font-family: sans-serif; font-style: italic; text-align: start;&quot;&gt;µ*o&lt;sub&gt;2&lt;/sub&gt;*x&lt;sub&gt;2&lt;/sub&gt;)&lt;/span&gt;&lt;/font&gt;" vertex="1">
<mxGeometry height="30" width="80" x="913.75" y="905" as="geometry" /> <mxGeometry height="30" width="80" x="913.75" y="905" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-119" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="w2&lt;br&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;(=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: rgb(32, 33, 34); font-family: sans-serif; font-style: italic; text-align: start;&quot;&gt;µ*o2*x2)&lt;/span&gt;&lt;/font&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-119" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="w&lt;sub&gt;2&lt;/sub&gt;&lt;br&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;(=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: rgb(32, 33, 34); font-family: sans-serif; font-style: italic; text-align: start;&quot;&gt;µ*o&lt;sub&gt;2&lt;/sub&gt;*x&lt;sub&gt;2&lt;/sub&gt;)&lt;/span&gt;&lt;/font&gt;" vertex="1">
<mxGeometry height="30" width="80" x="913.75" y="935" as="geometry" /> <mxGeometry height="30" width="80" x="913.75" y="935" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-120" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="0" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-120" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="0" vertex="1">
@@ -991,10 +991,10 @@
<mxCell id="zqf6Z4ZYqrToiwcanCgf-126" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-126" parent="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" value="x" vertex="1">
<mxGeometry height="25" width="25" x="861.75" y="997.5" as="geometry" /> <mxGeometry height="25" width="25" x="861.75" y="997.5" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-127" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Delay&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-127" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Sample Line&lt;br&gt;x&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="30" width="60" x="763.75" y="865" as="geometry" /> <mxGeometry height="30" width="76.25" x="755.5" y="865" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-128" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-128" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Filter Line&lt;br&gt;w&lt;sub&gt;[n]&lt;/sub&gt;" vertex="1">
<mxGeometry height="40" width="60" x="923.75" y="860" as="geometry" /> <mxGeometry height="40" width="60" x="923.75" y="860" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-129" edge="1" parent="1" source="zqf6Z4ZYqrToiwcanCgf-123" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="zqf6Z4ZYqrToiwcanCgf-114" value=""> <mxCell id="zqf6Z4ZYqrToiwcanCgf-129" edge="1" parent="1" source="zqf6Z4ZYqrToiwcanCgf-123" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="zqf6Z4ZYqrToiwcanCgf-114" value="">
@@ -1156,7 +1156,7 @@
<mxCell id="zqf6Z4ZYqrToiwcanCgf-157" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=1;fontSize=14;" value="2nd Cycle - Coefficient adaption" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-157" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=1;fontSize=14;" value="2nd Cycle - Coefficient adaption" vertex="1">
<mxGeometry height="30" width="236.25" x="623.75" y="820" as="geometry" /> <mxGeometry height="30" width="236.25" x="623.75" y="820" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-158" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" value="Acc&lt;div&gt;&lt;span style=&quot;font-size: 7px;&quot;&gt;(=w1 * x1)&lt;/span&gt;&lt;/div&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-158" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" value="Acc&lt;div&gt;&lt;span style=&quot;font-size: 7px;&quot;&gt;(=w&lt;sub&gt;1&lt;/sub&gt; * x&lt;sub&gt;1&lt;/sub&gt;)&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="50" x="848.25" y="1091" as="geometry" /> <mxGeometry height="30" width="50" x="848.25" y="1091" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zqf6Z4ZYqrToiwcanCgf-159" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="d&lt;sub&gt;2&lt;/sub&gt;" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-159" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="d&lt;sub&gt;2&lt;/sub&gt;" vertex="1">
@@ -1174,6 +1174,54 @@
<mxCell id="zqf6Z4ZYqrToiwcanCgf-163" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" value="Correction" vertex="1"> <mxCell id="zqf6Z4ZYqrToiwcanCgf-163" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" value="Correction" vertex="1">
<mxGeometry height="30" width="80" x="1003.75" y="1040" as="geometry" /> <mxGeometry height="30" width="80" x="1003.75" y="1040" as="geometry" />
</mxCell> </mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-3" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="899" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-4" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="929" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-5" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="958" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-6" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="988" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-7" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="900" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-8" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="929" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-9" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="958" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-10" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="989" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-11" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="510" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-12" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="540" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-13" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="569" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-14" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="1003.75" y="599" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-15" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="510" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-16" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="540" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-17" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="569" as="geometry" />
</mxCell>
<mxCell id="lyxZcRr64k90961b_5eU-18" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;add&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="27" width="30" x="420" y="599" as="geometry" />
</mxCell>
</root> </root>
</mxGraphModel> </mxGraphModel>
</diagram> </diagram>

164
main.bbl-SAVE-ERROR Normal file
View File

@@ -0,0 +1,164 @@
% $ biblatex auxiliary file $
% $ biblatex bbl format version 3.2 $
% Do not modify the above lines!
%
% This is an auxiliary file used by the 'biblatex' package.
% This file may safely be deleted. It will be recreated by
% biber as required.
%
\begingroup
\makeatletter
\@ifundefined{ver@biblatex.sty}
{\@latex@error
{Missing 'biblatex' package}
{The bibliography requires the 'biblatex' package.}
\aftergroup\endinput}
{}
\endgroup
\refsection{0}
\datalist[entry]{none/global//global/global}
\entry{source_synchrony}{misc}{}
\name{author}{1}{}{%
{{hash=ffb45f0281705211553241b831eeaf22}{%
family={MED-EL},
familyi={M\bibinithyphendelim E\bibinitperiod}}}%
}
\strng{namehash}{ffb45f0281705211553241b831eeaf22}
\strng{fullhash}{ffb45f0281705211553241b831eeaf22}
\strng{bibnamehash}{ffb45f0281705211553241b831eeaf22}
\strng{authorbibnamehash}{ffb45f0281705211553241b831eeaf22}
\strng{authornamehash}{ffb45f0281705211553241b831eeaf22}
\strng{authorfullhash}{ffb45f0281705211553241b831eeaf22}
\field{extraname}{1}
\field{sortinit}{1}
\field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{\url{https://www.medel.com/de/hearing-solutions/cochlear-implants}}
\field{note}{Accessed on 20.01.2026}
\field{title}{MED-EL Synchrony Cochlear Implant with a Sonnet 3 Audio Processor}
\field{year}{2026}
\endentry
\entry{source_electrode}{misc}{}
\name{author}{1}{}{%
{{hash=ffb45f0281705211553241b831eeaf22}{%
family={MED-EL},
familyi={M\bibinithyphendelim E\bibinitperiod}}}%
}
\strng{namehash}{ffb45f0281705211553241b831eeaf22}
\strng{fullhash}{ffb45f0281705211553241b831eeaf22}
\strng{bibnamehash}{ffb45f0281705211553241b831eeaf22}
\strng{authorbibnamehash}{ffb45f0281705211553241b831eeaf22}
\strng{authornamehash}{ffb45f0281705211553241b831eeaf22}
\strng{authorfullhash}{ffb45f0281705211553241b831eeaf22}
\field{extraname}{2}
\field{sortinit}{3}
\field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{\url{https://blog.medel.pro/de/chirurgie/relevanz-der-ci-elektrode/}}
\field{note}{Accessed on 30.01.2026}
\field{title}{Visualization of a MED-EL electrode inserted into a human cochlear}
\field{year}{2026}
\endentry
\entry{source_dsp_ch1}{misc}{}
\name{author}{1}{}{%
{{hash=26ad37f8f6f878dc28acadb561885bff}{%
family={Li\bibnamedelima Tan},
familyi={L\bibinitperiod\bibinitdelim T\bibinitperiod},
given={Jean\bibnamedelima Jiang},
giveni={J\bibinitperiod\bibinitdelim J\bibinitperiod}}}%
}
\strng{namehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{fullhash}{26ad37f8f6f878dc28acadb561885bff}
\strng{bibnamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authorbibnamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authornamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authorfullhash}{26ad37f8f6f878dc28acadb561885bff}
\field{extraname}{1}
\field{sortinit}{4}
\field{sortinithash}{9381316451d1b9788675a07e972a12a7}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{Elsevier Inc.}
\field{note}{Chapter 1}
\field{title}{Digital Signal Processing Fundamentals and Applications 3rd Ed}
\field{year}{2013}
\endentry
\entry{source_dsp_ch2}{misc}{}
\name{author}{1}{}{%
{{hash=26ad37f8f6f878dc28acadb561885bff}{%
family={Li\bibnamedelima Tan},
familyi={L\bibinitperiod\bibinitdelim T\bibinitperiod},
given={Jean\bibnamedelima Jiang},
giveni={J\bibinitperiod\bibinitdelim J\bibinitperiod}}}%
}
\strng{namehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{fullhash}{26ad37f8f6f878dc28acadb561885bff}
\strng{bibnamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authorbibnamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authornamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authorfullhash}{26ad37f8f6f878dc28acadb561885bff}
\field{extraname}{2}
\field{sortinit}{1}
\field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{Elsevier Inc.}
\field{note}{Chapter 2}
\field{title}{Digital Signal Processing Fundamentals and Applications 3rd Ed}
\field{year}{2013}
\endentry
\entry{source_patent}{misc}{}
\name{author}{1}{}{%
{{hash=93a5470d20a141eea1a1f94678d4a447}{%
family={Fogel},
familyi={F\bibinitperiod},
given={Lawrence\bibnamedelima J.},
giveni={L\bibinitperiod\bibinitdelim J\bibinitperiod}}}%
}
\strng{namehash}{93a5470d20a141eea1a1f94678d4a447}
\strng{fullhash}{93a5470d20a141eea1a1f94678d4a447}
\strng{bibnamehash}{93a5470d20a141eea1a1f94678d4a447}
\strng{authorbibnamehash}{93a5470d20a141eea1a1f94678d4a447}
\strng{authornamehash}{93a5470d20a141eea1a1f94678d4a447}
\strng{authorfullhash}{93a5470d20a141eea1a1f94678d4a447}
\field{sortinit}{1}
\field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{United States Patent Office}
\field{note}{Pat. Nr. 2966549}
\field{title}{Apparatus for improving intelligence under high ambient noise levels}
\field{year}{1960}
\endentry
\entry{source_dsp_ch9}{misc}{}
\name{author}{1}{}{%
{{hash=26ad37f8f6f878dc28acadb561885bff}{%
family={Li\bibnamedelima Tan},
familyi={L\bibinitperiod\bibinitdelim T\bibinitperiod},
given={Jean\bibnamedelima Jiang},
giveni={J\bibinitperiod\bibinitdelim J\bibinitperiod}}}%
}
\strng{namehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{fullhash}{26ad37f8f6f878dc28acadb561885bff}
\strng{bibnamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authorbibnamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authornamehash}{26ad37f8f6f878dc28acadb561885bff}
\strng{authorfullhash}{26ad37f8f6f878dc28acadb561885bff}
\field{extraname}{3}
\field{sortinit}{1}
\field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{Elsevier Inc.}
\field{note}{Chapter 9}
\field{title}{Digital Signal Processing Fundamentals and Applications 3rd Ed}
\field{year}{2013}
\endentry
\enddatalist
\endrefsection
\endinput

View File

@@ -47,7 +47,7 @@ in cochlear implant systems}}\\[-0.5ex]
\textbf{\Large{Master of Science}}\\ \textbf{\Large{Master of Science}}\\
\bigskip\par \bigskip\par
by \par by \par
\large{Patrick Hangl, BSc}\\[-1ex] \large{Patrick Hangl, B.Sc.}\\[-1ex]
\large{Matriculation Nr.: q4179749}\\ [-1ex] \large{Matriculation Nr.: q4179749}\\ [-1ex]
\vspace{0.6cm} \vspace{0.6cm}
\end{center} \end{center}
@@ -73,6 +73,8 @@ abstract
\include{chapter_02} \include{chapter_02}
\include{chapter_03} \include{chapter_03}
\include{chapter_04} \include{chapter_04}
\include{chapter_05}
\include{chapter_06}
\printbibliography \printbibliography
\listoffigures \listoffigures