From 38aa63d2fcadc512894f6c5d7ed706a8dfb94afa Mon Sep 17 00:00:00 2001 From: patha Date: Sun, 17 May 2026 13:29:48 +0200 Subject: [PATCH] Abgabe --- acronyms.aux | 2 +- chapter_01.tex | 2 +- chapter_02.tex | 60 +++++++++++++++++++++++++------------------------- chapter_03.tex | 22 +++++++++--------- chapter_04.aux | 31 +++++++++++++------------- chapter_04.tex | 20 ++++++++--------- chapter_05.aux | 12 +++++----- chapter_05.tex | 18 +++++++-------- chapter_06.aux | 4 ++-- chapter_06.tex | 12 +++++----- literature.bib | 16 +++++++------- main.tex | 4 ++-- 12 files changed, 100 insertions(+), 103 deletions(-) diff --git a/acronyms.aux b/acronyms.aux index 0d1f699..af9b606 100644 --- a/acronyms.aux +++ b/acronyms.aux @@ -59,7 +59,7 @@ \setcounter{refsegment}{0} \setcounter{maxextratitle}{0} \setcounter{maxextratitleyear}{0} -\setcounter{maxextraname}{3} +\setcounter{maxextraname}{4} \setcounter{maxextradate}{0} \setcounter{maxextraalpha}{0} \setcounter{abbrvpenalty}{50} diff --git a/chapter_01.tex b/chapter_01.tex index f672183..5725242 100644 --- a/chapter_01.tex +++ b/chapter_01.tex @@ -16,7 +16,7 @@ Usually, a \ac{CI} system consists out of an external processor with a microphon \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_electrode.jpg} - \caption{Visualization of a MED-EL electrode inserted into a human cochlea. \cite{source_electrode}} + \caption{Visualization of a MED-EL electrode inserted into a human cochlea \cite{source_electrode}} \label{fig:fig_electrode} \end{figure} \noindent As for any head worn hearing aid, the audio processor of a \ac{CI} system does not only pick up the desired ambient audio signal, but also any sort of interference noises from different sources. This circumstance leads to a decrease in the quality of the final audio signal for the user. Reducing this interference noise through adaptive noise reduction, implemented on a low-power digital signal processor, which can be powered within the electrical limitations of a CI system, is the topic of this master's thesis. diff --git a/chapter_02.tex b/chapter_02.tex index 45b0d43..b7d543a 100644 --- a/chapter_02.tex +++ b/chapter_02.tex @@ -4,14 +4,14 @@ The chapter begins with the description of signals, the problem of them interfer Filters are used in various functional designs, therefore a short explanation into the concepts of Finite Impulse Response- and Infinite Impulse Response filters is indispensable.\\ At this point an introduction into \ac{ANR} follows, including a short overview of the most important steps in history, the general concept of \ac{ANR} and its design- and optimization possibilities in regard of error calculation.\\ With this knowledge covered, a realistic signal flow diagram of an implanted \ac{CI} system with corresponding transfer functions is designed, essential to implement \ac{ANR} on a low-power digital signal processor.\\ \\ -Throughout this thesis, sampled signals are denoted in lowercase with square brackets (e.g. {x[n]}) to distinguish them from time-continuous signals (e.g. {x(t)}). Vectors are notated in lowercase bold font, whereas matrix are notated in uppercase bold font. Scalars are notated in normal lowercase font. +Throughout this thesis, sampled signals are denoted in lowercase with square brackets (e.g. {x[n]}) to distinguish them from time-continuous signals (e.g. {x(t)}). Vectors are notated in lowercase bold font, whereas matrix are notated in uppercase bold font. Scalars are notated in normal lowercase font.\\ \\ Chapter 2, especially the mathematical foundation, is oriented on the textbook ``Digital Signal Processing Fundamentals and Applications 3rd Ed'' by Tan and Jiang \cite{source_dsp1}. \subsection{Signals and signal interference} A signal is a physical parameter (e.g. pressure, voltage) changing its value over time. Whereas in nature, a signal is always analog, meaning continuous in both time and amplitude, a digital signal is represented in a discrete form, being sampled at specific time intervals and quantized to finite amplitude levels.\\ \\ -The term ``signal interference'' describes the overlapping of unwanted signals or noise with the desired signal, degrading the overall quality and intelligibility of the processed information. A simple example of signal interference is shown in Figure \ref{fig:fig_interference} - the noisy signal (top) consists out of several signals of different frequencies, representing both the desired signal and unwanted noise. The cleaned signal (bottom) shows the signal after unwanted frequencies has been cut off by a filter.\\ \\ +The term ``signal interference'' describes the overlapping of unwanted signals or noise with the desired signal, degrading the overall quality and intelligibility of the processed information. A simple example of signal interference is shown in Figure \ref{fig:fig_interference} - the noisy signal (top) consists out of several signals of different frequencies, representing both the desired signal and unwanted noise. The cleaned signal (bottom) shows the signal after unwanted frequencies have been cut off by a filter.\\ \\ \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_interference.jpg} - \caption{Noisy signal containing different frequencies and cleaned signal. \cite{source_dsp_ch1}} + \caption{Noisy signal containing different frequencies and cleaned signal \cite{source_dsp_ch1}} \label{fig:fig_interference} \end{figure} \noindent In cochlear implant systems, speech signals must be reconstructed with high spectral precision to ensure intelligibility for the user. As signal interference can cause considerable degradation to the quality of said final audio signal, the objective of this thesis is the improvement of implant technology in regard of adaptive noise reduction. @@ -21,15 +21,15 @@ Digital signal processing describes the manipulation of digital signals on a \ac \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_dsp.jpg} - \caption{Block diagram of processing an analog input signal to an analog output signal with digital signal processing in between. \cite{source_dsp_ch1}} + \caption{Block diagram of processing an analog input signal to an analog output signal with digital signal processing in between \cite{source_dsp_ch1}} \label{fig:fig_dsp} \end{figure} -Before digital signal processing can be applied to an analog signal like human voice, several steps are required beforehand. An analog signal, continuous in both time and amplitude, is passed through an initial filter, which limits the frequency bandwidth. An analog-digital converter then samples and quantities the signal into a digital form, now discrete in time and amplitude. This digital signal can now be processed, before (possibly) being converted to an analog signal again (refer to Figure \ref{fig:fig_dsp}). The sampling rate defines, in how many samples per second are taken from the analog signal - a higher sample rate delivers a more accurate digital representation of the signal but also uses more resources. According to the Nyquist–Shannon sampling theorem, the sample rate must be at least twice the highest frequency component present in the signal to avoid aliasing of the signal (refer to Figure \ref{fig:fig_nyquist}). Aliasing describes the phenomenon, that high frequency parts of a signal are wrongly interpreted, if the sampling rate of the analog signal is too low. The digitalized signal then contains low frequencies, which don't occur in the original signal. +Before digital signal processing can be applied to an analog signal like human voice, several steps are required beforehand. An analog signal, continuous in both time and amplitude, is passed through an initial filter, which limits the frequency bandwidth. An analog-digital converter then samples and quantities the signal into a digital form, now discrete in time and amplitude. This digital signal can now be processed, before (possibly) being converted to an analog signal again (refer to Figure \ref{fig:fig_dsp}). The sampling rate defines, how many samples per second are taken from an analog signal - a higher sample rate delivers a more accurate digital representation of the signal but also uses more resources. According to the Nyquist–Shannon sampling theorem, the sample rate must be at least twice the highest frequency component present in the signal to avoid aliasing of the signal (refer to Figure \ref{fig:fig_nyquist}). Aliasing describes the phenomenon, that high frequency parts of a signal are wrongly interpreted, if the sampling rate of the analog signal is too low. The digitalized signal then contains low frequencies, which don't occur in the original signal. \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_nyquist.jpg} \caption{Adequate (top) and inadequate - (bottom) sampling frequency of a signal. \cite{source_dsp_ch1}} + (bottom) sampling frequency of a signal \cite{source_dsp_ch1}} \label{fig:fig_nyquist} \end{figure} \noindent The discrete digital signal can be viewed as a sequence of finite samples with its amplitude being a discrete value, like a 16- or 32-bit integer. A signal vector of the length N, containing N samples, is therefore notated as @@ -43,7 +43,7 @@ A signal (either analog or digital) can be displayed and analyzed in two ways: t \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_fft.jpg} - \caption{Sampled digital signal in the time spectrum and in the frequency spectrum. \cite{source_dsp_ch1}} + \caption{Sampled digital signal in the time spectrum and in the frequency spectrum \cite{source_dsp_ch1}} \label{fig:fig_fft} \end{figure} \subsubsection{Transfer functions and filters} @@ -51,7 +51,7 @@ When we discuss signals in a mathematical way, we need to explain the term ``tra \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_transfer.jpg} - \caption{Simple representation of a transfer function taking a noisy input signal and delivering a clean output signal. \cite{source_dsp_ch1}} + \caption{Simple representation of a transfer function taking a noisy input signal and delivering a clean output signal \cite{source_dsp_ch1}} \label{fig:fig_transfer} \end{figure} \noindent In digital signal processing, especially in the design of a noise reduction algorithm, transfer functions are essential for modeling and analyzing filters, amplifiers, and the pathway of the signal itself. By understanding a system’s transfer function, one can predict how sound signals are altered and therefore how filter parameters can be adapted to deliver the desired output signal.\\ \\ @@ -76,7 +76,7 @@ As there are three operators present in the filter, three samples are needed bef \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_fir.jpg} - \caption{\ac{FIR} filter example with three feedforward operators.} + \caption{\ac{FIR} filter example with three feedforward operators} \label{fig:fig_fir} \end{figure} \subsubsection{Infinite Impulse Response filters} @@ -90,7 +90,7 @@ Figure \ref{fig:fig_iir} visualizes a simple \ac{IIR} filter with two feedforwar \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_iir.jpg} - \caption{\ac{IIR} filter example with two feedforward operators and two feedback operators.} + \caption{\ac{IIR} filter example with two feedforward operators and two feedback operators} \label{fig:fig_iir} \end{figure} \subsubsection{FIR- vs. IIR-filters} @@ -98,7 +98,7 @@ Due to the fact, that there is no feedback, a \ac{FIR} filter offers uncondition The recursive nature of a \ac{IIR} filter, in contrary, allows achieving a sharp frequency response with significantly fewer coefficients than an equivalent \ac{FIR} filter, but it also opens up the possibility, that the filter response diverges, depending on the set coefficients.\\ \\ A higher number of needed coefficients implies, that the filter itself needs more time to complete its signal response, as the group delay is increased. -\subsection{Introduction to Adaptive Noise Reduction} +\subsection{Introduction to adaptive noise reduction} \subsubsection{History} The necessity for the use of electric filters arose the first time in the beginnings of the 20th century with the development of the quite young fields of tele- and radio-communication. At his time, engineers used static filters, like low- or highpass filters, to improve transmission quality - this fundamental techniques allowed limiting the frequency spectrum, by cutting out certain frequencies like high-pitched noises or humming. From this time on, the development of new filter designs accelerated, for example with the soon-to-be developed LC-filter by Otto Zobel, an American scientist working at the telecommunication company AT\&T. Until then, the used filters were static, meaning they didn't change their behavior over time.\\ \\ In the 1930s, the first real concept of active noise cancellation was proposed by the German Physician Paul Lueg. Lueg patented the idea of two speakers emitting antiphase signals which cancel each other out. Though his patent was granted in 1936, back at the time, there was no technical possibility detect and process audio signals in a way, to make his noise cancellation actually work in a technical environment.\\ \\ @@ -106,7 +106,7 @@ In the 1930s, the first real concept of active noise cancellation was proposed b \begin{figure}[H] \centering \includegraphics[width=0.7\linewidth]{Bilder/fig_patent.jpg} - \caption{Reconstruction of Lawrence Fogel´s patent in 1960. \cite{source_patent}} + \caption{Reconstruction of Lawrence Fogel´s patent in 1960 \cite{source_patent}} \label{fig:fig_patent} \end{figure} \noindent In contrary to the static filters in the beginning of the century, the active noise cancellation approach of Lueg and Widrow was far more advanced than just reducing a signal by a specific frequency portion like with the use of static filters, yet this technique still has their limitations as it is designed only to work within to a certain environment.\\ \\ @@ -114,11 +114,11 @@ With the rapid advancement of digital signal processing technologies, noise canc \subsubsection{The concept of adaptive filtering} \ac{ANR} describes an advanced filtering method based on an error metric and represents a significant advancement over these earlier methods by allowing the filter parameters to continuously adapt to the changing acoustic environment in real-time. This adaptability makes \ac{ANR} particularly suitable for hearing devices, where environmental noise characteristics vary constantly.\\ \\ Static filters, like low- and high-pass filters, as described in the previous subchapter, feature coefficients that remain constant over time. They are designed for known, predictable noise conditions (e.g. removing a steady 50 Hz hum originating from a power supply). While these filters are efficient and easy to implement, they fail to function when noise characteristics change dynamically.\\ \\ -Although active noise cancellation and adaptive noise reduction share obvious similarities, they differ fundamentally in their application and signal structure. While active noise cancellation aims to physically cancel noise in the acoustic domain — typically before, or at the time, the signal reaches the ear — \ac{ANR} operates within the signal processing chain, attempting to extract the noisy component from the digital signal. In cochlear implant systems, the latter is more practical because the acoustic waveform is converted into electrical stimulation signals; thus, signal-domain filtering is the only feasible approach. +Although active noise cancellation and adaptive noise reduction share obvious similarities, they differ fundamentally in their application and signal structure. While active noise cancellation aims to physically cancel noise in the acoustic domain — typically before, or at the time, the signal reaches the ear — \ac{ANR} operates within the signal processing chain, attempting to extract the noisy component from the digital signal. In cochlear implant systems, the latter is relevant because the acoustic waveform is converted into electrical stimulation signals. Thus, signal-domain filtering is the only feasible approach. \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_anr.jpg} - \caption{The basic idea of an adaptive filter design for noise reduction.} + \caption{The basic concept of an adaptive filter design for noise reduction} \label{fig:fig_anr} \end{figure} \noindent Figure \ref{fig:fig_anr} shows the basic concept of an adaptive filter design, represented through a feedback filter application. The primary sensor (top) aims to receive the desired signal and outputs the corrupted signal $d[n]$, which consists out of the desired signal $s[n]$ and the corruption noise signal $n[n]$ after passing the transfer function of the sensor, whereas the secondary signal sensor aims to receive (ideally) only the noise signal and outputs the reference noise signal $x[n]$ after also passing the respective transfer function, which then feeds the adaptive filter. We assume at this point, that the corruption noise signal is uncorrelated to the desired signal, and therefore separable from it. In addition, we assume, that the corruption noise signal is correlated to the reference noise signal, as it originates from the same source, but takes a different signal path. \\ \\ The adaptive filter removes a certain, noise-related, frequency part of the input signal and re-evaluates the output through its feedback design. The filter parameters are then adjusted and applied to the next sample to minimize the observed error $e[n]$, which also represents the approximated desired signal $š[n]$. @@ -128,7 +128,7 @@ To reduce the required computing power, a hybrid static/adaptive filter design c \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{Bilder/fig_anr_hybrid.jpg} - \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} \end{figure} \subsection{Adaptive optimization strategies} @@ -151,21 +151,21 @@ The goal of the adaptive filter is therefore to minimize this error signal over The minimization of the error signal $e[n]$ can be achieved by applying different error metrics and algorithms used to evaluate the performance of an adaptive filter, including: \begin{itemize} \item \ac{MSE}: This metric calculates the averaged square of the error between the expected value and the observed value over a predefined period. It is sensitive to large errors and is commonly used in adaptive filtering applications. -\item \ac{LMS}: The \ac{LMS} is an algorithm, focused on minimizing the \ac{MSE} by adjusting the filter coefficients iteratively based on the error signal by applying the gradient descent method. It is computationally efficient and widely used in real-time applications. +\item \ac{LMS}: The \ac{LMS} algorithm, developed by Bernard Widrow in 1960, focuses on minimizing the \ac{MSE} by adjusting the filter coefficients iteratively based on the error signal by applying the gradient descent method. It is computationally efficient and widely used in real-time applications. \item \ac{NLMS}: An extension of the \ac{LMS} algorithm that normalizes the step size based on the input signal, improving convergence speed. \item \ac{RLS}: This algorithm aims to minimize the weighted sum of squared errors, providing faster convergence than the \ac{LMS} algorithm but at the cost of higher computational effort. \end{itemize} -As computational efficiency is a key requirement for the implementation of real-time \ac{ANR} on a low-power \ac{DSP}, the Least Mean Squares algorithm is chosen for the minimization of the error signal and therefore will be further explained in the following subchapter. +As computational efficiency is a key requirement for the implementation of real-time \ac{ANR} on a low-power \ac{DSP}, the \ac{LMS} algorithm is chosen for the minimization of the error signal and therefore will be further explained in the following subchapter. \subsubsection{The Wiener filter and the concept of gradient descent} -Before the Least Mean Squares algorithm can be explained in detail, the Wiener filter and the concept of gradient descent have to be introduced. \\ \\ +Before the \ac{LMS} algorithm can be explained in detail, the Wiener filter and the concept of gradient descent have to be introduced. \\ \\ \begin{figure}[H] \centering \includegraphics[width=0.7\linewidth]{Bilder/fig_wien.jpg} - \caption{Simple implementation of a Wiener filter.} + \caption{Simple implementation of a Wiener filter} \label{fig:fig_wien} \end{figure} -\noindent The Wiener filter, the base of many adaptive filter designs, is a statistical filter used to minimize the Mean Squares Error between a desired signal and the output of a linear filter. The output $y[n]$ of the Wiener filter is the sum of the weighted input samples, where the weights are represented by the filter coefficients. +\noindent The Wiener filter, the base of many adaptive filter designs, is a statistical filter used to minimize the \ac{MSE} between a desired signal and the output of a linear filter. The output $y[n]$ of the Wiener filter is the sum of the weighted input samples, where the weights are represented by the filter coefficients. \begin{equation} \label{equation_wien} y[n] = w_0x[n] + w_1x[n-1] + ... + w_Mx[n-M] = \sum_{k=0}^{M} w_kx[n-k] @@ -229,7 +229,7 @@ After settings the derivative of Equation \ref{equation_j_matrix} to zero and so \label{equation_w_optimal_matrix} \textbf{w}_{opt} = \textbf{P}\textbf{R}^{-1} \end{equation} -\noindent For a large filter, the numerical solution of Equation \ref{equation_w_optimal_matrix} can be computational expensive, as it involves the inversion of potential large matrix. Therefore, to find the optimal set of coefficients $w$, the concept of gradient descent, introduced by Widrow\&Stearns in 1985, can be applied. The gradient decent algorithm aims to minimize the MSE iteratively sample by sample, by adjusting the filter coefficients $w$ in small steps towards the direction of the steepest descent to find the optimal coefficients. The update rule for the coefficients using gradient descent can be expressed as +\noindent For a large filter, the numerical solution of Equation \ref{equation_w_optimal_matrix} can be computational expensive, as it involves the inversion of potential large matrix. Therefore, to find the optimal set of coefficients $w$, the concept of gradient descent (introduced by Widrow\&Stearns in 1985 \cite{source_anr}) can be applied. The gradient decent algorithm aims to minimize the MSE iteratively sample by sample, by adjusting the filter coefficients $w$ in small steps towards the direction of the steepest descent to find the optimal coefficients. The update rule for the coefficients using gradient descent can be expressed as \begin{equation} \label{equation_gradient} w(n+1) = w(n) - \mu \frac{dJ}{dw} @@ -238,7 +238,7 @@ where $\mu$ is the constant step size determining the rate of convergence. Figur \begin{figure}[H] \centering \includegraphics[width=0.9\linewidth]{Bilder/fig_gradient.jpg} - \caption{Visualization of the steepest decent algorithm used on the Mean Squared Error. \cite{source_dsp_ch9}} + \caption{Visualization of the steepest decent algorithm used on the Mean Squared Error \cite{source_dsp_ch9}} \label{fig:fig_w_opt} \end{figure} \subsubsection{The Least Mean Squares algorithm} @@ -260,19 +260,19 @@ The \ac{LMS} algorithm therefore updates the filter coefficients $w[n]$ after ev \begin{figure}[H] \centering \includegraphics[width=1.1\linewidth]{Bilder/fig_anr_implant.jpg} - \caption{Filter design for an implanted cochlear implant system with two signal sensors.} + \caption{Filter design for an implanted cochlear implant system with two signal sensors} \label{fig:fig_anr_implant} \end{figure} \noindent Figure \ref{fig:fig_anr_hybrid} showed us the basic concept of an \ac{ANR} implementation, without a detailed description how the corrupted signal $d[n]$ and the reference noise signal $x[n]$ are formed. Figure \ref{fig:fig_anr_implant} now shows a more complete and realistic signal flow diagram of an implanted cochlear implant system, with two signal sensors and an adaptive noise reduction circuit afterwards. \\ \\ The following definitions of the involved signals shall help to better understand the involved signals and their interactions: \begin{itemize} -\item Desired signal: The wanted signal, like human voice, which shall be restored. -\item Noise signal: The unwanted signal, like background noise, which shall be reduced. -\item Recorded desired signal: The desired signal after passing the transfer function to the primary sensor. -\item Corruption noise signal: The noise signal after passing the transfer function to the primary sensor. -\item Reference noise signal: The noise signal after passing the transfer function to the secondary sensor. -\item Corrupted signal: The combination of the recorded desired signal and the corruption noise signal -\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 Desired signal $t[n]$: The wanted signal, like human voice, which shall be restored. +\item Noise signal $v[n]$: The unwanted signal, like background noise, which shall be reduced. +\item Recorded desired signal $s[n]$: The desired signal after passing the transfer function to the primary sensor. +\item Corruption noise signal $n[n]$: The noise signal after passing the transfer function to the primary sensor. +\item Reference noise signal $x[n]$: The noise signal after passing the transfer function to the secondary sensor. +\item Corrupted signal $d[n]$: The combination of the recorded desired signal and the corruption noise signal +\item Filter output $e[n]$: 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} 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.\\ \\ diff --git a/chapter_03.tex b/chapter_03.tex index 9c653f7..0b21617 100644 --- a/chapter_03.tex +++ b/chapter_03.tex @@ -4,7 +4,7 @@ The implementation is conducted in Python, which provides a flexible environment \subsection{Adaptive noise reduction algorithm implementation} The high-level implementation of the \ac{ANR} algorithm follows the theoretical framework outlined in Subchapter 2.5, specifically Equation \ref{equation_lms}. The algorithm is designed to adaptively filter out noise from a desired signal using a reference noise signal. The implementation of the \ac{ANR} function includes the following key steps: \begin{itemize} - \item Initialization: Define arrays to store the reference noise samples (Sample Line), the filter coefficients (Filter Line), the processed output samples (output), and the updated filter coefficients (coefficient\_matrix) over time. Then a sequence of input samples is processed iteratively. + \item Initialization: Define arrays to store the reference noise samples (Sample Line), the filter coefficients (Filter Line) and the processed output samples (Output) over time. Then a sequence of input samples is processed iteratively. \item Filtering Process: The reference noise samples fill up the Sample Line, the filter coefficients in the Filter Line (initially set to zero) are then multiplied with the corresponding reference noise samples before being added up to an accumulator. \item Error Calculation: The accumulator is then subtracted from the current input sample to produce the output sample, which represents the error signal. \item Coefficient Update: Every filter coefficient is then updated, by adding a term, which consists out of the error signal multiplied by the corresponding reference noise sample, scaled by the step size. The adaption step parameter allows controlling how often the coefficients are updated. @@ -14,36 +14,34 @@ The flow diagram in Figure \ref{fig:fig_anr_logic} illustrates the logical flow \begin{figure}[H] \centering \includegraphics[width=0.9\linewidth]{Bilder/fig_anr_logic.jpg} - \caption{Flow diagram of the code implementation of the \ac{ANR} algorithm.} + \caption{Flow diagram of the code implementation of the \ac{ANR} algorithm} \label{fig:fig_anr_logic} \end{figure} \begin{listing}[H] \centering \begin{lstlisting}[style=pythonstyle] -def anr_function(input, ref_noise, coefficients, mu, adaption_step=1): - sample_count = len(input) +def anr_function(Input, ref_noise, coefficients, mu, adaption_step=1): + sample_count = len(Input) filter_line = np.zeros(coefficients) sample_line = np.zeros(coefficients) - output = np.zeros(sample_count) - coefficient_matrix = np.zeros((sample_count, coefficients)) + Output = np.zeros(sample_count) for n in range(sample_count): sample_line = np.roll(sample_line, 1) sample_line[0] = ref_noise[n] accumulator = np.dot(filter_line, sample_line) - error = input[n] - accumulator - output[n] = error + error = Input[n] - accumulator + Output[n] = error filter_line += mu * error * sample_line - coefficient_matrix[n, :] = filter_line - return output, coefficient_matrix + return Output \end{lstlisting} \caption{High-level implementation of the \ac{ANR} algorithm in Python} \label{lst:lst_anr_code} \end{listing} -\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: +\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. 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} \text{P}_{\text{Error signal}} = \text{P}_{\text{Desired signal}} - \text{P}_{\text{Filter-output}} \\ @@ -53,7 +51,7 @@ def anr_function(input, ref_noise, coefficients, mu, adaption_step=1): with $\text{P}_{\text{Desired signal}}$ being the power of the desired signal, $\text{P}_{\text{Noise signal}}$ being the power of the noise signal and $\text{P}_{\text{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} To evaluate the general functionality and performance of the \ac{ANR} algorithm from Listing \ref{lst:lst_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 exemplary 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 exemplary 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 evaluate the performance of the algorithm in a simple way. \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. diff --git a/chapter_04.aux b/chapter_04.aux index a7c36c8..2db5ae9 100644 --- a/chapter_04.aux +++ b/chapter_04.aux @@ -64,7 +64,7 @@ \acronymused{DSP} \acronymused{DSP} \acronymused{ARM} -\@writefile{lof}{\contentsline {figure}{\numberline {31}{\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.}}{43}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {31}{\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}}{43}{}\protected@file@percent } \acronymused{CI} \acronymused{ARM} \acronymused{DSP} @@ -81,7 +81,7 @@ \acronymused{DSP} \acronymused{DMA} \acronymused{PCM} -\@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces Simplified flowchart of the sample processing between the \ac {ARM} core and the \ac {DSP} core via interrupts and shared memory.}}{44}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces Simplified flowchart of the sample processing between the \ac {ARM} core and the \ac {DSP} core via interrupts and shared memory}}{44}{}\protected@file@percent } \acronymused{ARM} \acronymused{DSP} \newlabel{fig:fig_dsp_comm.jpg}{{32}{44}{}{figure.32}{}} @@ -151,7 +151,7 @@ \acronymused{DSP} \@writefile{lol}{\contentsline {listing}{\numberline {3}{\ignorespaces Low-level implementation: Main loop and interrupt handling}}{48}{}\protected@file@percent } \newlabel{lst:lst_dsp_code_mainloop}{{3}{48}{}{listing.3}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {35}{\ignorespaces Flow diagram of the code implementation of the main loop and interrupt handling on the \ac {DSP} core.}}{49}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {35}{\ignorespaces Flow diagram of the code implementation of the main loop and interrupt handling on the \ac {DSP} core}}{49}{}\protected@file@percent } \acronymused{DSP} \newlabel{fig:fig_dsp_logic.jpg}{{35}{49}{}{figure.35}{}} \@writefile{toc}{\contentsline {paragraph}{calculate\_output()-function}{49}{}\protected@file@percent } @@ -170,7 +170,7 @@ \newlabel{lst:lst_dsp_code_find_max}{{4}{50}{}{listing.4}{}} \@writefile{toc}{\contentsline {paragraph}{Cyclic array iteration}{50}{}\protected@file@percent } \acronymused{ANR} -\@writefile{lol}{\contentsline {listing}{\numberline {5}{\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.}}{51}{}\protected@file@percent } +\@writefile{lol}{\contentsline {listing}{\numberline {5}{\ignorespaces Manual implementation of a cyclic array iteration function in C, taking the core 20 cycles to execute a pointer increment of 1. The intrinsic functions of the DSP compiler allows a single-cycle implementation of such cyclic additions.}}{51}{}\protected@file@percent } \newlabel{lst:lst_dsp_code_cyclic_add}{{5}{51}{}{listing.5}{}} \acronymused{DSP} \acronymused{DSP} @@ -188,7 +188,6 @@ \@writefile{toc}{\contentsline {paragraph}{write\_buffer()}{52}{}\protected@file@percent } \acronymused{DSP} \@writefile{toc}{\contentsline {paragraph}{apply\_fir\_filter()}{52}{}\protected@file@percent } -\acronymused{FIR} \acronymused{MAC} \acronymused{DSP} \acronymused{DSP} @@ -206,18 +205,18 @@ \newlabel{lst:lst_dsp_code_update_filter_coefficients}{{7}{54}{}{listing.7}{}} \acronymused{MAC} \acronymused{DSP} -\@writefile{lof}{\contentsline {figure}{\numberline {37}{\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.}}{55}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {37}{\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 in the Filter Line.}}{55}{}\protected@file@percent } \newlabel{fig:fig_dsp_coefficient_cycle.jpg}{{37}{55}{}{figure.37}{}} \@writefile{toc}{\contentsline {paragraph}{update\_output()}{55}{}\protected@file@percent } \newlabel{equation_computing}{{24}{55}{}{equation.24}{}} -\newlabel{equation_c_1}{{25}{55}{}{equation.25}{}} -\newlabel{equation_c_2}{{26}{55}{}{equation.26}{}} -\newlabel{equation_c_3}{{27}{55}{}{equation.27}{}} -\newlabel{equation_c_4}{{28}{55}{}{equation.28}{}} -\newlabel{equation_c_5}{{29}{55}{}{equation.29}{}} +\newlabel{equation_c_1}{{25}{56}{}{equation.25}{}} +\newlabel{equation_c_2}{{26}{56}{}{equation.26}{}} +\newlabel{equation_c_3}{{27}{56}{}{equation.27}{}} +\newlabel{equation_c_4}{{28}{56}{}{equation.28}{}} +\newlabel{equation_c_5}{{29}{56}{}{equation.29}{}} \newlabel{equation_computing_final}{{31}{56}{}{equation.31}{}} \acronymused{DSP} -\@writefile{lof}{\contentsline {figure}{\numberline {38}{\ignorespaces Dependence of the total computing effort on the filter length $\text {N}$ and update rate $\text {1/U}$.}}{56}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {38}{\ignorespaces Dependence of the total computing effort on the filter length $\text {N}$ and update rate $\text {1/U}$}}{56}{}\protected@file@percent } \newlabel{fig:fig_c_total.png}{{38}{56}{}{figure.38}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Verification of the DSP implementation}{56}{}\protected@file@percent } \acronymused{DSP} @@ -233,9 +232,9 @@ \acronymused{ANR} \acronymused{DSP} \newlabel{fig:fig_plot_2_dsp_complex.png}{{40}{57}{}{figure.40}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {41}{\ignorespaces Comparison of the high- and low-level simulation output.}}{58}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {41}{\ignorespaces Comparison of the high- and low-level simulation output}}{58}{}\protected@file@percent } \newlabel{fig:fig_high_low_comparison.png}{{41}{58}{}{figure.41}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {42}{\ignorespaces Histogram of the error amplitude between the high- and low-level simulation output.}}{58}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {42}{\ignorespaces Histogram of the error amplitude between the high- and low-level simulation output}}{58}{}\protected@file@percent } \newlabel{fig:fig_high_low_comparison_hist.png}{{42}{58}{}{figure.42}{}} \acronymused{ANR} \acronymused{DSP} @@ -272,7 +271,7 @@ \setcounter{citetotal}{0} \setcounter{multicitecount}{0} \setcounter{multicitetotal}{0} -\setcounter{instcount}{22} +\setcounter{instcount}{24} \setcounter{maxnames}{3} \setcounter{minnames}{1} \setcounter{maxitems}{3} @@ -286,7 +285,7 @@ \setcounter{refsegment}{0} \setcounter{maxextratitle}{0} \setcounter{maxextratitleyear}{0} -\setcounter{maxextraname}{3} +\setcounter{maxextraname}{4} \setcounter{maxextradate}{0} \setcounter{maxextraalpha}{0} \setcounter{abbrvpenalty}{50} diff --git a/chapter_04.tex b/chapter_04.tex index 3cd2605..01bb4ea 100644 --- a/chapter_04.tex +++ b/chapter_04.tex @@ -19,14 +19,14 @@ In order to ensure a smooth, but power-efficient, operation together with the \a \begin{figure}[H] \centering \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} \end{figure} \noindent The \ac{ARM} Core receives the 16-bit audio data (the corrupted signal and the reference noise signal on two seperate 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] \centering \includegraphics[width=0.9\linewidth]{Bilder/fig_dsp_comm.jpg} - \caption{Simplified flowchart of the sample processing between the \ac{ARM} core and the \ac{DSP} core via interrupts and shared memory.} + \caption{Simplified flowchart of the sample processing between the \ac{ARM} core and the \ac{DSP} core via interrupts and shared memory} \label{fig:fig_dsp_comm.jpg} \end{figure} @@ -127,7 +127,7 @@ int main(void) { \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_logic.jpg} - \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} \end{figure} \paragraph{calculate\_output()-function} @@ -166,7 +166,7 @@ int* cyclic array iteration(int *pointer, int increment, int *pointer_start, int return new_pointer; } \end{lstlisting} -\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.} +\caption{Manual implementation of a cyclic array iteration function in C, taking the core 20 cycles to execute a pointer increment of 1. The intrinsic functions of the DSP compiler allows a single-cycle implementation of such cyclic additions.} \label{lst:lst_dsp_code_cyclic_add} \end{listing} \noindent Listing \ref{lst:lst_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. @@ -187,7 +187,7 @@ The $calculate\_output()$ functions consists out of the following five main part \end{itemize} These sub-functions feature \ac{DSP}-specific 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 Sample Line, where the samples of the reference noise signal are stored for further processing. The buffer management mainly consists 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, indipendent 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 Sample Line. The needed cycles for this function are mainly depenendent on the length 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 allow performing multiplications on two 32-bit integers without losing precision or the need for manual bit-shifting operations. +\paragraph{apply\_fir\_filter()} The $apply\_fir\_filter()$-function is responsible for applying the coefficients stored in the Filter Line on the reference noise signal samples stored in the Sample Line. The needed cycles for this function are mainly depenendent on the length 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 allow performing multiplications on two 32-bit integers without losing precision or the need for manual bit-shifting operations. \begin{listing}[H] \centering \begin{lstlisting}[style=cstyle] @@ -241,10 +241,10 @@ for (int i=0; i< n_coeff; i+=2) chess_loop_range(1,){ \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.} + \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 in the Filter Line.} \label{fig:fig_dsp_coefficient_cycle.jpg} \end{figure} -\paragraph{update\_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. +\paragraph{update\_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 $\text{N}$ can now be calculated by summing up the computing efforts of the different sub-functions: \begin{equation} \label{equation_computing} @@ -275,7 +275,7 @@ Equation \ref{equation_computing_final} now provides an estimation of the necess \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 $\text{N}$ and update rate $\text{1/U}$.} + \caption{Dependence of the total computing effort on the filter length $\text{N}$ and update rate $\text{1/U}$} \label{fig:fig_c_total.png} \end{figure} \subsection{Verification of the DSP implementation} @@ -295,13 +295,13 @@ To verify the general performance of the \ac{DSP}-implemented \ac{ANR} algorithm \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.} +\caption{Comparison of the high- and low-level simulation output} \label{fig:fig_high_low_comparison.png} \end{figure} \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_high_low_comparison_hist.png} -\caption{Histogram of the error amplitude between the high- and low-level simulation output.} +\caption{Histogram of the error amplitude between the high- and low-level simulation output} \label{fig:fig_high_low_comparison_hist.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 10.26 dB it performs equivalent sucessful 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 subfigure, together with the plotted error amplitude. Lastly, Figure \ref{fig:fig_high_low_comparison_hist.png} features a histogram of the error amplitude between the high- and low-level implemenation, indicating the correct functionality of the \ac{DSP} implementation. The small deviations 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. 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. diff --git a/chapter_05.aux b/chapter_05.aux index c46f6b4..4bd56f4 100644 --- a/chapter_05.aux +++ b/chapter_05.aux @@ -51,9 +51,9 @@ \acronymused{SNR} \@writefile{toc}{\contentsline {subsubsection}{\numberline {5.3.2}Reduced-update implementation for multiple noise signals}{64}{}\protected@file@percent } \acronymused{SNR} -\@writefile{lof}{\contentsline {figure}{\numberline {46}{\ignorespaces Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the update rate of the ANR algorithm for different noise signals.}}{65}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {46}{\ignorespaces Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the update rate of the ANR algorithm for different noise signals}}{65}{}\protected@file@percent } \newlabel{fig:fig_gain_update_rate.png}{{46}{65}{}{figure.46}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {47}{\ignorespaces Absolute \ac {DSP} load in relation to the update rate of the ANR algorithm for different noise signals.}}{65}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {47}{\ignorespaces Absolute \ac {DSP} load in relation to the update rate of the ANR algorithm for different noise signals}}{65}{}\protected@file@percent } \acronymused{DSP} \newlabel{fig:fig_load_update_rate.png}{{47}{65}{}{figure.47}{}} \acronymused{DSP} @@ -80,9 +80,9 @@ \acronymused{SNR} \@writefile{toc}{\contentsline {subsubsection}{\numberline {5.4.2}Error-driven implementation for multiple noise signals}{68}{}\protected@file@percent } \acronymused{SNR} -\@writefile{lof}{\contentsline {figure}{\numberline {49}{\ignorespaces Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the error threshold for different noise signals.}}{68}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {49}{\ignorespaces Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the error threshold for different noise signals}}{68}{}\protected@file@percent } \newlabel{fig:fig_gain_error_threshold.png}{{49}{68}{}{figure.49}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {50}{\ignorespaces Absolute \ac {DSP} load in relation to the error threshold for different noise signals.}}{69}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {50}{\ignorespaces Absolute \ac {DSP} load in relation to the error threshold for different noise signals}}{69}{}\protected@file@percent } \acronymused{DSP} \newlabel{fig:fig_load_error_threshold.png}{{50}{69}{}{figure.50}{}} \acronymused{DSP} @@ -147,7 +147,7 @@ \setcounter{citetotal}{0} \setcounter{multicitecount}{0} \setcounter{multicitetotal}{0} -\setcounter{instcount}{22} +\setcounter{instcount}{24} \setcounter{maxnames}{3} \setcounter{minnames}{1} \setcounter{maxitems}{3} @@ -161,7 +161,7 @@ \setcounter{refsegment}{0} \setcounter{maxextratitle}{0} \setcounter{maxextratitleyear}{0} -\setcounter{maxextraname}{3} +\setcounter{maxextraname}{4} \setcounter{maxextradate}{0} \setcounter{maxextraalpha}{0} \setcounter{abbrvpenalty}{50} diff --git a/chapter_05.tex b/chapter_05.tex index 1aac2ce..05fd594 100644 --- a/chapter_05.tex +++ b/chapter_05.tex @@ -70,13 +70,13 @@ Now the same evaluation as in the previous subchapter is conducted for the five \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_gain_update_rate.png} - \caption{Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the update rate of the ANR algorithm for different noise signals.} + \caption{Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the update rate of the ANR algorithm for different noise signals} \label{fig:fig_gain_update_rate.png} \end{figure} \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_load_update_rate.png} - \caption{Absolute \ac{DSP} load in relation to the update rate of the ANR algorithm for different noise signals.} + \caption{Absolute \ac{DSP} load in relation to the update rate of the ANR algorithm for different noise signals} \label{fig:fig_load_update_rate.png} \end{figure} \noindent Figure \ref{fig:fig_gain_update_rate.png} shows the performance gain for the five different scenarios. The mean performance gain for all scenarious now wandered to an update rate of 0.32. Figure \ref{fig:fig_load_update_rate.png} shows the load of the \ac{DSP} core for the different update rates, which is the same for all scenarios, as it is only dependent on the update rate itself. @@ -95,9 +95,9 @@ The most straight forward implementation of a reduced-update rate is through the \label{equation_update_1} \text{C}_{\text{increment\_counter}} = 5 \text{ cycles} \\ \label{equation_update_2} -\text{C}_{\text{check\_counter}} = 23 (24) \text{ cycles} +\text{C}_{\text{check\_counter}} = 24 \text{ cycles} \end{gather} -Incrementing the counter and checking if the counter has reached the update rate through a modulo operation adds 29 cycles to cycle count for one sample (28 when the coefficients are updated and 29 when they are not updated). Equation \ref{equation_computing_calculation_reduced_update_3} and \ref{equation_load_calculation_reduced_update_3} show the new calculation of the needed cycles and the load of the \ac{DSP} core for an update rate of 0.32: +Incrementing the counter and checking if the counter has reached the update rate through a modulo operation adds 29 cycles to cycle count for one sample. Equation \ref{equation_computing_calculation_reduced_update_3} and \ref{equation_load_calculation_reduced_update_3} show the new calculation of the needed cycles and the load of the \ac{DSP} core for an update rate of 0.32: \begin{equation} \label{equation_computing_calculation_reduced_update_3} \text{C}_{\text{total}} = 45 + (6*45+8)*0.32 + 63 = 197 \text{ cycles} @@ -112,7 +112,7 @@ In contrary to the fixed update implementation of the previous chapter, the erro The idea is, as the update size of the filter coefficients gets smaller, the benefit of updating them decreases. In practice, a closer look at the update of the filter coefficients is taken: As shown in Equation \ref{equation_lms}, the size of the update of the filter coefficients is directly related to the error signal - if the error signal decreases, the update-size of the filter coefficients also decreases. \\ \\ As the fixed update implementation is not able to detect such changes, the reduction in update frequency is applied in a static way, which means, that there are situations were it is beneficial and situations where it is not. The error-driven implementation, on the other hand, is able to detect such changing behavior and therefore can adapt the update frequency accordingly. Therefore, the error-driven implementation is expected to deliver a better cost-value ratio than the fixed update implementation. \subsubsection{Error-driven implementation for the benchmark case} -The chosen approach for an error-driven implementation is the use a fixed error threshold. This means, that if the error signal remains below an in advance set, certain threshold, the filter coefficients remain unchanged and are not updated. If the error signal exceeds the threshold, the filter coefficients are updated as in the full-update implementation.\\ \\ The crucial aspect of this approach, is the right choise of the error threshold, which is expected to be highly dependent on the acoustic situation. To get an idea of a beneficial error threshold, different values are initially evaluated for the already used benchmark case.\\ \\ The reduction in computational load must now be calculated for the whole audio track by the percentage of samples, where the error signal exceeds the threshold and therefore the coefficients are adapted. This means in detail, that if for a certain error threshold, 50000 of 200000 samples exceed said threshold, the filter coefficients are updated in 25\% of the samples - therefore the update rate of the filter coefficients amounts to 0.25. The result can therefore be expressed in the same way as for the fixed update implementation, where the update rate is directly calculated for one sample. +The chosen approach for an error-driven implementation is the use a fixed error threshold. This means, that if the error signal remains below an in advance set, certain threshold, the filter coefficients remain unchanged and are not updated. If the error signal exceeds the threshold, the filter coefficients are updated.\\ \\ The crucial aspect of this approach, is the right choise of the error threshold, which is expected to be highly dependent on the acoustic situation. To get an idea of a beneficial error threshold, different values are initially evaluated for the already used benchmark case.\\ \\ The reduction in computational load must now be calculated for the whole audio track by the percentage of samples, where the error signal exceeds the threshold and therefore the coefficients are adapted. This means in detail, that if for a certain error threshold, 50000 of 200000 samples exceed said threshold, the filter coefficients are updated in 25\% of the samples - therefore the update rate of the filter coefficients amounts to 0.25. The result can therefore be expressed in the same way as for the fixed update implementation, where the update rate is directly calculated for one sample. \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_snr_error_threshold.png} @@ -134,13 +134,13 @@ Again, the same evaluation as for the benchmark track is conducted for the five \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_gain_error_threshold.png} -\caption{Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the error threshold for different noise signals.} +\caption{Performance gain (distance between relative SNR-Gain and needed relative cycles/sample) in relation to the error threshold for different noise signals} \label{fig:fig_gain_error_threshold.png} \end{figure} \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_load_error_threshold.png} -\caption{Absolute \ac{DSP} load in relation to the error threshold for different noise signals.} +\caption{Absolute \ac{DSP} load in relation to the error threshold for different noise signals} \label{fig:fig_load_error_threshold.png} \end{figure} \noindent Similar to the reduced-update rate implementation, the observation made for every signal/noise combination is similar to the benchmark case. Figure \ref{fig:fig_gain_error_threshold.png} shows the performance gain for the five different scenarios. The most beneficial error threshold shifted noticeable to a value of 0.07. It's interesting to notice, that the benchmark case seems to be a bit of an exception compared to the behavior of the other scenarios.\\ \\ @@ -173,14 +173,14 @@ Equation \ref{equation_computing_calculation_error_threshold_3} and \ref{equatio Contrary to the reduced-update implementation, the computational load for an error threshold of 0.07 shows only a minimal increase from 16.6\% to 17.8\% through the use of a computational cheap if-clause. This is a clear advantage compared to the fixed update implementation. In the case of the benchmark track, the load rises from 24.1\% to 25.7\%. \subsection{Summary of the performance evaluation} The results of two analysis 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 all different signal/noise combinations. Under these 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.\\ \\ -A simple method to further reduce the load of the \ac{DSP} core is to reduce the update frequency of the filter coeffcients. For the benchmark signal/noise combination, an update rate of 0.39 nearly halfs the processor load from 44.6\% to 23.5\%, while only reducing the \ac{SNR}-Gain by rougly 31 \% from 9.47 dB to 6.40 dB. For all viewed scenarios, an update rate of 0.32 represents the best cost-value ratio, for reducing the load while geting the best possible noise reduction - with a mean \ac{SNR}-Gain reduction of 24.5\% from 11.54 dB to 8.72 dB, while the load of the \ac{DSP} core is reduced by about 53.4\% from 44.6\% to 20.8\%. While the perfromance benefit of this approach is reasonable, the computanional effort of the implementation is significant - the 20.8\% total load rise to 24.6\%. Figure \ref{fig:fig_snr_update_rate_new.png} shows the updated plot of the relative performance of the SNR-Gain, the cycles per samples and the DSP load in regard of the update rate for the benchmark case, where the higher load is indicated by the newly added continuous grahps. The initial graphs are still slightly visible allowing a better comparison of the two implementations. +A simple method to further reduce the load of the \ac{DSP} core is to reduce the update frequency of the filter coeffcients. For the benchmark signal/noise combination, an update rate of 0.39 nearly halfs the processor load from 44.6\% to 23.5\%, while only reducing the \ac{SNR}-Gain by rougly 31 \% from 9.47 dB to 6.40 dB. For all viewed scenarios, an update rate of 0.32 represents the best cost-value ratio, for reducing the load while geting the best possible noise reduction - with a mean \ac{SNR}-Gain reduction of 24.5\% from 11.54 dB to 8.72 dB, while the load of the \ac{DSP} core is reduced by about 53.4\% from 44.6\% to 20.8\%. While the perfromance benefit of this approach is reasonable, the computanional effort of the implementation is significant - the 20.8\% averagetotal load rise to 24.6\%. Figure \ref{fig:fig_snr_update_rate_new.png} shows the updated plot of the relative performance of the SNR-Gain, the cycles per samples and the DSP load in regard of the update rate for the benchmark case, where the higher load is indicated by the newly added continuous grahps. The initial graphs are still slightly visible allowing a better comparison of the two implementations. \begin{figure}[H] \centering \includegraphics[width=1.0\linewidth]{Bilder/fig_snr_update_rate_new.png} \caption{Updated plot of the relative performance of the SNR-Gain, the cycles per samples and the DSP load in regard of the update rate for the benchmark case. The higher load is indicated by the newly added continuous lines.} \label{fig:fig_snr_update_rate_new.png} \end{figure} -\noindent A more sophisticated method to reduce the load of the \ac{DSP} core is to use an error-driven implementation, where the update of the filter coefficients is only conducted, if the error signal exceeds a certain threshold. For the benchmark case, with a similar \ac{DSP} load of 24.1\% (compared to the reduced-update implementation), the \ac{SNR}-Gain is reduced by only 8.9\% from 9.47 dB to 8.63 dB. For all viewed scenarios, an error threshold of 0.07 represents the best cost-value ratio - with a mean \ac{SNR}-Gain reduction of 11.7\% from 11.54 dB to 10.19 dB, while the load of the \ac{DSP} core is reduced by about 62.8\% from 44.6\% to 16.6\%. This substentional performance gain is bought by only a slight increase in computing effort - the 16.6\% total load rise only to 17.8\%\\ \\ +\noindent A more sophisticated method to reduce the load of the \ac{DSP} core is to use an error-driven implementation, where the update of the filter coefficients is only conducted, if the error signal exceeds a certain threshold. For the benchmark case, with a similar \ac{DSP} load of 24.1\% (compared to the reduced-update implementation), the \ac{SNR}-Gain is reduced by only 8.9\% from 9.47 dB to 8.63 dB. For all viewed scenarios, an error threshold of 0.07 represents the best cost-value ratio - with a mean \ac{SNR}-Gain reduction of 11.7\% from 11.54 dB to 10.19 dB, while the load of the \ac{DSP} core is reduced by about 62.8\% from 44.6\% to 16.6\%. This substentional performance gain is bought by only a slight increase in computing effort - the 16.6\% average total load rise only to 17.8\%\\ \\ This result proofes, that an error-driven implementation of the \ac{ANR} algorithm is highly suitable to reduce the load needed for adaptive noise reduction in a \ac{CI} application, while still providing nearly 90\% of the maximum achievable performance under the viewed circumstances. Again, Figure \ref{fig:fig_snr_error_threshold_new.png} shows the updated plot of the relative performance of the SNR-Gain, the cycles per samples and the DSP load in regard of the error threshold for the benchmark case. \begin{figure}[H] \centering diff --git a/chapter_06.aux b/chapter_06.aux index 29c352e..9a1f97f 100644 --- a/chapter_06.aux +++ b/chapter_06.aux @@ -43,7 +43,7 @@ \setcounter{citetotal}{0} \setcounter{multicitecount}{0} \setcounter{multicitetotal}{0} -\setcounter{instcount}{22} +\setcounter{instcount}{24} \setcounter{maxnames}{3} \setcounter{minnames}{1} \setcounter{maxitems}{3} @@ -57,7 +57,7 @@ \setcounter{refsegment}{0} \setcounter{maxextratitle}{0} \setcounter{maxextratitleyear}{0} -\setcounter{maxextraname}{3} +\setcounter{maxextraname}{4} \setcounter{maxextradate}{0} \setcounter{maxextraalpha}{0} \setcounter{abbrvpenalty}{50} diff --git a/chapter_06.tex b/chapter_06.tex index aff457c..cbcfeef 100644 --- a/chapter_06.tex +++ b/chapter_06.tex @@ -1,12 +1,12 @@ \section{Conclusion and outlook} -The focus of this thesis was to investigate the feasibility and the improvement options for the implementation of a real-time capable \ac{ANR} algorithm in \ac{CI} systems.\\ \\ The initial high-level implementation in Python proofed the general suitability of the proposed \ac{LMS} method, where the \ac{SNR}-Gain was introduced as a metric for the quality of the noise reduction. Said metric was used to evaluate the performance of the algorithm in various settings and noise conditions. First a fictional desired signal (chirp) and noise signal (sine wave or white noise) were used to check the algorithm for its general functionality. Then the step to real, recorded signals was made. The final and most complex combination (which then served as a benchmark for the remaining thesis) was the use of the same real world signals, but now different transfer functions and delays were introduced, to mimic a complex, practical and realistic situation. In every case, the algorithm was able to achieve significant performance improvement in the \ac{SNR} for the processed signals. \\ \\ +The focus of this thesis was to investigate the feasibility and the improvement options for the implementation of a real-time capable \ac{ANR} algorithm in \ac{CI} systems.\\ \\ The initial high-level implementation in Python proofed the general suitability of an adaptive filter design using the \ac{LMS} algorithm, where the \ac{SNR}-Gain was introduced as a metric for the quality of the noise reduction. Said metric was used to evaluate the performance of the algorithm in various settings and noise conditions. First, a fictional desired signal (chirp) and noise signal (sine wave or white noise) were used to check the algorithm for its general functionality. Then the step to real, recorded signals was made. The final and most complex combination (which then served as a benchmark for the remaining thesis) was the use of the same real world signals, but now different transfer functions and delays were introduced, to mimic a complex, practical and realistic situation. In every case, the algorithm was able to achieve significant performance improvement in the \ac{SNR} for the processed signals. \\ \\ \noindent The next challenge was to implement the algorithm efficiently in the C programming language, to achieve real-time capability. This was achieved by the use of \ac{DSP} compiler instrinsic functions, which allow performing logic operations with a minimum of needed instructions. After the C implementation was functional, the performacne for the benchmark track was compared to the initial Python implementation. A histrogram of the differences between the two ouptuts showed only minor deviations, which can be attributed to the fixed-point calculations of the \ac{DSP} compiler.\\ \\ -\noindent Having a working C-implementation in place, a closer look on the performance, especially the needed cycles to compute one sample, was taken - the result was a formula, which calculates the needed samples as a function of the filter length and the update rate. With this information in mind, several noise sources were put under test, to evaluatue the optimal filter length, which is a trade-off between the performance improvement and the computational cost - the result was 45 coefficients for an assumption of a signal delay of 2 milliseconds.\\ \\ +\noindent Having a working C implementation in place, a closer look on the performance, especially the needed cycles to compute one sample, was taken - the result was a formula, which calculates the needed samples as a function of the filter length and the update rate. With this information in mind, several noise sources were put under test to evaluatue the optimal filter length, which is a trade-off between the performance improvement and the computational cost - the result was 45 coefficients for an assumption of a signal delay of 2 milliseconds.\\ \\ With a set filter length of 45 coefficients, the final improvement of the algorithm regarding performance and computational cost could be conducted. The base was the computational most costly full-update implementation, needing 357 cycles to process one sample - this correspondends with about 45\% \ac{DSP} load.\\ \\ \noindent The first approach was a rather simple reduction in the update rate, evaluated for the benchmark case and different signal/noise combinations. The result was a significant reduction in the needed cycles, but with quite strong decrease in the \ac{SNR}-Gain. Additionaly, the implementation of such a universal reduction, required computational expensive processor operations, further reducing the cost-benefit-ratio.\\ \\ -\noindent The second approach was the proposed method of an error driven optimization, utilizing the idea of a fixed threshold for the error signal. Again, evaluated for the benchmark case and different signal/noise combinations, this approach can be considered a success, as it was able to achieve a significant reduction in the needed cycles, while only reducing the \ac{SNR}-Gain by a small amount. The implementation of this method is also computationally efficient, as it only requires a simple comparison operation to check if an update is necessary.\\ \\ -\noindent The error driven optimization approach can therefore be seen as the clear winner, as it was able to further improve an already real-time capable \ac{ANR} algorithm, by significantly reducing the computational load of the \ac{DSP} core, while only slightly reducing the performance improvement in terms of \ac{SNR}-Gain.\\ \\ -\noindent For future work, a more advanced method to further optimize the system could be the use of a dynamic threshold, which could be adapted according to the current noise conditions. The background for this proposal is the fact, that beside the error signal, also the noise signal itself influences the size of the filter coeffcient update. In the current implementation, the threshold is only dependend on the error signal - if a sitatuion arises, where the noise signal is very small, but the error/output signal is high due to a high input signal, an update of the filter coefficients would be triggered, even if not necessary. A dynamic threshold, which also takes the noise signal into account, could further reduce the number of updates, but with a potentially higher computational effort.\\ \\ +\noindent The second approach was the proposed method of an error-driven optimization, utilizing the idea of a fixed threshold for the error signal. Again, evaluated for the benchmark case and different signal/noise combinations, this approach can be considered a success, as it was able to achieve a significant reduction in the needed cycles, while only reducing the \ac{SNR}-Gain by a small amount. The implementation of this method is also computationally efficient, as it only requires a simple comparison operation to check if an update is necessary.\\ \\ +\noindent The error-driven optimization approach can therefore be seen as the clear winner, as it was able to further improve an already real-time capable \ac{ANR} algorithm, by significantly reducing the computational load of the \ac{DSP} core, while only slightly reducing the performance in terms of \ac{SNR}-Gain.\\ \\ +\noindent For future work, a more advanced method to further optimize the system could be the use of a dynamic threshold, which could be adapted according to the current noise conditions. The background for this proposal is the fact, that beside the error signal, also the noise signal itself influences the size of the filter coeffcient update. In the current implementation, the threshold is only dependend on the error signal - if a sitatuion arises, where the noise signal is very small, but the error-/output signal is high due to a high input signal, an update of the filter coefficients would be triggered, even if not necessary. A dynamic threshold, which also takes the noise signal into account, could further reduce the number of updates, but with a potentially higher computational effort.\\ \\ \noindent Also, the already in Chapter 2 mentioned hybrid filter approach, which splits the filter into a static and adaptive part, could be further investigated. The idea behind this approach is, that the static part of the filter covers certain signal paths, which are to be expected time invariant, while the adaptive part of the filter only needs to cover changing signals.\\ \\ \noindent Therefore, the final result of this thesis can be summarized as follows:\\ \\ -The approach of an error driven optimization of a real-time capable \ac{ANR} algorithm, utilizing the idea of a fixed threshold for the error signal, is a viable method to achieve significant reduction in computational load while still keeping the performance near its maximum. For the use in a \ac{CI} system, this means, that the additional power usage needed for Adaptive Noise Reduction can be kept low, making it a promising option to further improve the auditory quality for \ac{CI} users.\\ \\ \ No newline at end of file +The approach of an error-driven optimization of a real-time capable \ac{ANR} algorithm, utilizing the idea of a fixed threshold for the error signal, is a viable method to achieve significant reduction in computational load while still keeping the noise reduction performance near its maximum. For the use in a \ac{CI} system, this means, that the additional power usage needed for adaptive noise reduction can be kept low, making it a promising option to further improve the auditory quality for \ac{CI} users.\\ \\ \ No newline at end of file diff --git a/literature.bib b/literature.bib index 7a65a97..bf7c9df 100644 --- a/literature.bib +++ b/literature.bib @@ -5,13 +5,6 @@ year = {2026}, note = {Accessed on 20.01.2026} } -@misc{source_anr, - author = {Ghalib R. Ibrahim}, - title = {Adaptive filtering based system for extracting gearbox condition feature from the measured vibrations}, - howpublished = {\url{https://www.researchgate.net/publication/257093929_Adaptive_filtering_based_system_for_extracting_gearbox_condition_feature_from_the_measured_vibrations}}, - year = {2026}, - note = {Accessed on 24.01.2026} -} @misc{source_electrode, author = {MED-EL}, @@ -49,10 +42,17 @@ year = {1960}, note = {Pat. Nr. 2966549} } +@misc{source_anr, + author = {Bernard Widrow, Samuel D. Stearns}, + title = {Adaptive Signal Processing}, + howpublished = {Prentice Halll, Inc.}, + year = {1985}, + note = {ISBN: 978-0-13-004029-9} +} @misc{source_dsp_ch9, author = {Li Tan, Jean Jiang}, title = {Digital Signal Processing Fundamentals and Applications 3rd Ed}, howpublished = {Elsevier Inc.}, year = {2013}, note = {Chapter 9} -} \ No newline at end of file +} diff --git a/main.tex b/main.tex index 881dd1d..44dd749 100644 --- a/main.tex +++ b/main.tex @@ -111,14 +111,14 @@ by \par \newpage \begin{abstract} \noindent The goal of this thesis is the implementation, followed by the investigation of improvement options, of a real-time capable Adaptive Noise Reduction (ANR) algorithm in Cochlear Implant (CI) systems. The focus lies on the reduction of the computational load, and subsequently the power consumption, of the used Digital Signal Processor (DSP) core, while still keeping the noise reduction performance as high as possible.\\ \\ - \noindent The chosen method for noise reduction is the use of an adaptive filter combined with the Least Mean Square algorithm, which is a widely utilized method in this context. The evaluation of the performance is conducted via the Signal-Noise-Ratio (SNR)-Gain, which serves as a metric for the quality of the noise reduction. Several use cases (from simple to realistic) are analyzed to evaluate the output qualitiy under different conditions.\\ \\ + \noindent The chosen method for noise reduction is the use of an adaptive filter combined with the Least Mean Squares algorithm, which is a widely utilized method in this context. The evaluation of the performance is conducted via the Signal-Noise-Ratio (SNR)-Gain, which serves as a metric for the quality of the noise reduction. Several use cases (from simple to realistic) are analyzed to evaluate the output qualitiy under different conditions.\\ \\ \noindent After confirming the general feasibility of the proposed method in a high-level Python implementation, the algorithm is implemented in C, using DSP compiler instrinsic functions to achieve real-time capability. The performance of the C implementation is then sucessfully compared to the initial high-level variant, showing only minor deviations.\\ \\ \noindent With a working C implementation in place, a closer look on the achievable performance under full-update settings is taken, which serves as a benchmark-setting for the remaining thesis. The computational cost of the algorithm is evaluated in terms of the needed cycles to compute one audio sample, which can be expressed as a function of the filter length and the update rate.\\ \\ \noindent With a feasible equation developed, several noise sources are put under test to evaluatue the optimal filter length, which is a trade-off between the performance improvement and the computational cost. The ideal filter length is determined at 45 coeffcients, where about 95\% averaged \ac{SNR}-Gain can be achieved.\\ \\ \noindent With the filter length set, the improvement of the algorithm is tackled, both for a benchmark track and different signal/noise scenarios.\\ \\ \noindent The first approach is a reduction of the update rate. This strategy is able to significantly reduce the needed cycles, but with a simultanious considerable decrease in the SNR-Gain.\\ \\ \noindent The second approach is an error-driven optimization, utilizing the idea of a fixed threshold for the error signal, over which the decision over an upgrade of the filter coefficients is made. This approach turns out to be a success, as it is able to achieve a significant reduction in the needed cycles, while only reducing the SNR-Gain by a small amount.\\ \\ - \noindent Therefore, the error-driven optimization approach can be seen as the sucessful result of this thesis, as it is able to further improve an already real-time capable ANR algorithm by significantly reducing the computational load of the DSP core, while only slightly decreasing the performance improvement in terms of the SNR-Gain.\\ \\ + \noindent Therefore, the error-driven optimization approach can be seen as the sucessful result of this thesis, as it is able to further improve an already real-time capable ANR algorithm by significantly reducing the computational load of the DSP core, while only slightly decreasing the performance in terms of the SNR-Gain.\\ \\ \end{abstract} \include{chapter_01}