Commit 3112183e authored by pcy's avatar pcy
Browse files

bluh

parents
bin/
obj/
This diff is collapsed.
default: all
PDFVIEW ?= mupdf
PAGER ?= less
TARGET := fir
LATEXMK ?= latexmk
LATEXMKFLAGS ?= -pdf -Werror -f- -use-make -outdir=obj/ \
-pdflatex="pdflatex -interaction=nonstopmode"
%/:
@mkdir -vp "$@"
obj/ref.bib: $(wildcard ref/*.bib)
cat $^ > "$@"
#obj/$(TARGET).pdf: $(TARGET).tex obj/ obj/ref.bib
# $(LATEXMK) $(LATEXMKFLAGS) "$<"
#bin/$(TARGET).pdf: obj/$(TARGET).pdf
# @cp -v "$<" "$@"
all: obj/ obj/ref.bib bin/ #bin/$(TARGET).pdf
$(LATEXMK) $(LATEXMKFLAGS) "$(TARGET).tex"
@cp -v "obj/$(TARGET).pdf" "bin/$(TARGET).pdf"
clean:
$(LATEXMK) -CA $(LATEXMKFLAGS)
@rm -vf bin/$(TARGET).pdf TODO
view:
$(PDFVIEW) bin/$(TARGET).pdf
dbg: all view
.PHONY: default all clean view \
bin/$(TARGET).pdf obj/$(TARGET).pdf $(TARGET).tex
todo:
rg -g '*.tex' -F TODO -p -C 2 | tee TODO | $(PAGER) -RS
# fir.tex
LaTeX-broncode van een document dat ik heb geschreven om FIR-filters
duidelijker te maken.
Nieuwste PDF is altijd te vinden [op de VTK
wiki](https://wiki.vtk.be/Informatie-overdracht_en_-verwerking_(H01D2A)).
## Licensie
CC-BY-SA 4.0
\documentclass[a4paper,9pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[dutch]{babel}
\usepackage{graphicx,listings,float,booktabs,longtable,url,wrapfig}
\usepackage{amsfonts,amssymb,subcaption,hyperref,csquotes}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage[intlimits]{amsmath}
\usepackage[backend=biber,style=numeric,autocite=plain]{biblatex}
\addbibresource{obj/ref.bib}
\addto\captionsdutch{\renewcommand{\abstractname}{Disclaimer}}
\DeclareMathOperator\sinc{sinc}
\title{Digitale signaalverwerking: FIR-filters\footnote{CC BY-SA 4.0:
\url{https://creativecommons.org/licenses/by-sa/4.0/deed.nl},
\url{https://creativecommons.org/licenses/by-sa/4.0/legalcode.nl}}}
\author{pcy\footnote{\href{mailto:pcy@ulyssis.org}{
\nolinkurl{pcy.ulyssis.org}}}}
\date{\today \\ DRAFT (v1.0.3)\footnote{Nieuwste versie is te vinden op de
VTK wiki.}}
\begin{document}
\maketitle
\begin{abstract}
Ik heb dit document geschreven omdat de les van prof. Vandenbosch niet
helemaal duidelijk was voor iedereen. Ook ga ik een paar voorbeelden van
toepassingen geven om het minder abstract te maken.
Ik kan me vergissen. Er zitten zeer waarschijnlijk een paar fouten
tussen, dus lees dit aandachtig en contacteer me bij het vinden van een
fout.
\end{abstract}
%\tableofcontents
\section{Theorie}
\subsection{Inleiding}
Het doel van een filter is om bepaalde frequenties uit een signaal weg te
filteren en andere te versterken.
Een Finite Impulse Response-filter is een lineair systeem (cf.
\cite{SysteemtheorieH01A4A}\footnote{Haal dit boek er even terug bij om alles
wat op te frissen.}) met een eindige impulsresponsie:
\begin{equation}\label{eq:firdef}
y[n] = b[k] \ast x[n] = \sum_{k=0}^{N-1} b[k] \cdot x[n - k]
\end{equation}
Voor $x[n] = \delta[n]$ is de uitgang gelijk aan $b[n]$. Met de eigenschappen
uit paragraaf 2.4 uit \cite{SysteemtheorieH01A4A} volgt dat eender welke
(continue) responsie (en dus ook in het frequentiedomein) mogelijk
is\footnote{Ok\'e, niet \textit{alle} alle, maar je weet wat ik bedoel.}.
Natuurlijk worden de re\"ele mogelijkheden beperkt door de orde\footnote{
m.a.w. de lengte, het aantal delays/`taps', ... De grote `$N$' in vgl.
\ref{eq:firdef}} van de filter.
De uiteindelijke realisatie zal enkel berekeningen doen in het tijdsdomein
(want een Fourier-/Laplace-/Z-transformatie uitrekenen vergt veel rekenkracht
en tijd), al gebeurt de analyse voor de constructie wel in het
frequentiedomein\footnote{Met een machine die krachtig genoeg is, is het
natuurlijk mogelijk om w\'el de Fouriertransformatie in realtime uit te rekenen,
maar dit brengt andere problemen met zich mee.}.
De Z-getransformeerde van de filterco\"effici\"enten $b[n]$ is de
overdrachtsfunctie $H(z) = H(\jmath\omega)$, de Z-getransformeerde van de output
is dus de vermenigvuldiging van $X(z) = \mathcal{Z}(x[n])$ en $H(z)$.
De invloed op de frequenties hangt af van de overdrachtsfunctie, die bepaald
wordt door de filterco\"effici\"enten. Het is de bedoeling dat deze
uiteindelijk direct berekenbaar zijn afhankelijk van de soort filter en de
`karakteristieke' frequentie\footnote{Voor lowpassfilters is dit de
cutoff-frequentie, de frequentie waarboven alle frequenties weggefilterd worden.}.
\subsection{Algemeen design FIR-filter}
Het is zeer vaak de bedoeling dat alle frequenties binnen een bepaald interval
te verwijderen, en de rest met een constante factor te versterken of te
verzwakken. Dit laatste is mogelijk door na het filteren de output in het
tijdsdomein met de factor te vermenigvuldingen, dus houden we hier verder geen
rekening mee.
In het frequentiedomein wordt dit dan een combinatie van rechthoekige
functies\footnote{Zie ook de grafiek op p. 7, 8 en 9 de slides: \cite{SlidesIOV4H01D2A}.}.
We bekijken hier het lowpass-geval omdat dit minder complex is, de andere
soorten zijn analoog\footnote{Omdat de Z-transformatie lineair is.}.
Het is onmogelijk om deze rechthoeksvorm direct te gebruiken in de
impulsresponsie: de inverse Z-getransformeerde ervan is een sinc\footnote{
$\sinc(x) = \frac{\sin(x)}{x}$}-functie, die oneindig lang is en oneindig vroeg
begint.
\subsection{Windowfunctie}
De sinc wordt beperkt door deze te vermenigvuldigen met een
\textit{windowfunctie} $w(t) \leftrightarrow W(z)$, wat weer overeenkomt met
een convolutie in het frequentiedomein.
De keuze van windowfunctie bepaalt mee het gedrag van de
filter: bij sommige filters zal de helling van de cutoff steiler zijn dan
anderen, net zoals met de `golvingen' op de pass- en stopband.
Het `plots afkappen van de staarten' van de sinc leidt tot het toevoegen
van hogere frequenties\footnote{Intu\"itief is dit logisch omdat de hoek bij
de afkapping heel steil is, en dus veel sinussen van zeer hoge frequenties
zal moeten bevatten.}, wat zal leiden tot suboptimale demping van de weg te
filteren frequenties, samen met imperfecties en artefacten in de output. Om
deze hoge frequenties te vermijden worden zachter dalende windowfuncties
gebruikt.
Een aantal veel voorkomende windowfuncties zijn te vinden in
tabel \ref{tbl:windowfns}.
\begin{table}
\begin{tabular}{l||p{4cm}|p{2cm}p{2cm}p{2cm}p{2cm}}
Window & functie & Norm. transitiebreedte (Hz) & Passband ripple (dB) &
Min. stopband-attenuatie (window) & Min. stopband-attenuatie (lowpass) \\
\hline \hline
Rechthoek & 1
& $\frac{0.92}{N}$ & $\frac{4 \pi}{N}$ & $13$ dB & $21$ dB \\
Hann(ing) & $0.5\left(1-\cos\left(\frac{2\pi n}{N-1}\right)\right)$
& $\frac{3.11}{N}$ & $\frac{8 \pi}{N}$ & $31$ dB & $44$ dB \\
Hamming & $0.54-0.46\cos\left(\frac{2\pi n}{N-1}\right)$
& $\frac{3.32}{N}$ & $\frac{8 \pi}{N}$ & $41$ dB & $53$ dB \\
Blackman & $0.42-0.5\cos\left(\frac{2\pi n}{N-1}\right)+0.08\cos\left(\frac{4\pi n}{N-1}\right)$
& $\frac{5.56}{N}$ & $\frac{12\pi}{N}$ & $57$ dB & $75$ dB \\
\end{tabular}
\caption{windowfuncties (bron: \cite{SlidesIOV4H01D2A} p. 30 en 34)}
\label{tbl:windowfns}
\end{table}
De windowfuncties gelden voor het interval $[0; N]$. Mocht dit niet zo zijn,
moet de input geschaald worden. Noteer ook dat het oorspronkelijke domein (van
bv. de cosinus) eerst $[-1; 1]$ (of $[-\frac{N}{2}; \frac{N}{2}]$) was, terwijl
nu vanaf 0 gestart wordt. Hierdoor wordt een (gemiddelde) delay van $\frac{N}{2}$
samples ge\"introduceerd. Het argument voor de $\sinc$ mag niet geschaald
worden, omdat de $\sinc$ anders een andere frequentie zal krijgen (en we dus
een andere cutoff-frequentie krijgen).
\subsection{Resultaat}
Uiteindelijk geeft het vermenigvuldigen met de windowfunctie het volgende:
\begin{equation}\label{eq:coeffs}
b[n] = w(n) \cdot \frac{A \overline{\omega_c}}{\pi} \sinc'[n] = \sinc\left(\overline{\omega_c}\left(n - \left\lfloor\frac{N}{2}\right\rfloor\right)\right) \\
\end{equation}
met $A$ de versterking/verzwakking en $\overline{\omega_c} = 2\pi \frac{f_c}{f_{sa}}$
de genormaliseerde cutoffpulsatie.
De fazeverschuiving is altijd lineair binnen de passband (uitwerking te vinden
in \cite{SlidesIOV4H01D2A} p. 37), binnen de stopband is het signaal zo zwak
dat fase-effecten verwaarloosbaar zijn.
\section{Concreet design van een lowpass FIR filter}\label{sec:concreet}
Gegeven de passbandfreq. $f_p$, stopbandfreq. $f_s$, samplerate $f_{sa}$ en
stopbandverzwakking $A$.
Bereken de genormaliseerde cutoff-frequentie
$\overline{f_c} = \frac{f_p + f_s}{2 f_{sa}}$ en de genormaliseerde
transitiebandbreedte $\overline{\Delta f} = \frac{f_s-f_p}{f_{sa}}$.
Eerst moet een windowfunctie gekozen worden. Deze wordt best gekozen aan de
hand van de constraints (bv. de stopbandverzwakking). Uit de transitiebreedte
van het gegeven en uit tabel \ref{tbl:windowfns} kan de minimale orde berekend
worden:
\[
N > \frac{\overline{\Delta f_{win}}}{\overline{\Delta f}}
\]
Voor een Hamming-window is $\overline{\Delta f_{win}}$ gelijk aan $3.32$.
Met vergelijking \ref{eq:coeffs} kunnen dan de uiteindelijke co\"effici\"enten
worden berekend:
\begin{equation}\label{eq:coeffs_final}
b[n] = w(n) \cdot 2 A \overline{f_c}
\sinc\left(2\pi\overline{f_c}\left(n-\left\lfloor\frac{N}{2}\right\rfloor\right)\right)
\end{equation}
We gebruiken gewoon $w(n)$ zonder inputschaling omdat de functies in de tabel
hier al rekening mee houden.
% faq
% * ?
% * f_stop > f_sa / 2 => ?
\subsection{Enkele inzichtsvragen}
Welke filterkarakteristiek (lowpass, highpass, ...) heeft...
... een filter die het gemiddelde neemt van de vorige $n$ waarden?\footnote{Lowpass}
... een filter die het verschil neemt tussen de huidige en de vorige waarde?\footnote{Highpass}
\clearpage
\section{Implementatie}
Een eenvoudige implementatie in Python:
\begin{verbatim}
#functie die de filtercoefficienten berekent:
def make_coeffs(N, fc_norm, A):
coeffs = N*[0] # een list met N nullen
for i in range(N):
# vgl. 2
coeffs[i] = window((i-0.5)*N) * 2 * A * fc_norm
* sinc(2*pi * fc_norm * (n / N - 0.5))
return coeffs
# pas de filter toe op een blok van inputsamples:
#
# de parameter `coeffs' moet de return value
# van `make_coeffs' zijn
def filter_sample(coeffs, samples):
N = len(coeffs)
previous_input = N*[0] # samples voor t < 0 zijn 0
# (previous_input[0] == huidige sample)
output = len(samples)
for i in range(len(samples)):
# update de geschiedenis van vorige samples
del previous_input[-1] # -1 : laatste in list
previous_input.insert(0, state[i])
output_sample = 0
# vgl. 1
for j in range(N):
output_sample = output_sample
+ previous_input[j] * coeffs[j]
# bewaar sample
output[i] = output_sample
return output
\end{verbatim}
Bij het herhaaldelijk toepassen van \texttt{filter\_sample} moet de
`samplegeschiedenis' (\texttt{previous\_input}) wel mee overgebracht worden.
Bij meer performante uitwerkingen wordt de binnenste for-lus (die met \texttt{j})
``ontrold'' en de geschiedenis op een lichtjes andere manier bijgehouden.
Een voorbeeld van een re\"ele IIR-filterimplementatie is hier te vinden:
\url{https://gitlab.com/PoroCYon/dzesamgihe/blob/master/src/biquad.c} (de
principes erachter zijn wel hetzelfde voor FIR-filters).
\section{Meer informatie}
\subsection{Meer info over filterdesign}
Olli `Yehar' Niemitalo heeft een tekst geschreven waarin hij de basis van
filterdesign in verstaanbare woorden uitlegt. Deze is hier te
vinden: \cite{YeharDSP}.
\subsection{IIR-filters}
IIR-filters gebruiken ook de vorige \textit{outputs} om tot een waarde te
komen. Deze zijn veel flexibeler en hebben een hogere kwaliteit dan FIR-filters
van een vergelijkbare orde: een typische IIR-filter heeft een orde kleiner dan
5, terwijl een gelijkaardige FIR-filter een aantal keer meer taps nodig heeft.
Dit betekent ook dat IIR-filters een veel lagere rekenkost hebben.
Omdat ze ook vorige outputs gebruiken, is de kans re\"eel dat de filter
instabiel wordt en ``explodeert''. Door de waarden correct te kiezen kan dit
vermeden worden.
Een zeer eenvoudig voorbeeld van een IIR-filter is de ``exponential running
average''-filter:
\begin{equation}\label{eq:era}
y[n] = \alpha x[n] + (1-\alpha) y[n-1] \text{ met } 1 > \alpha > 0 \text{ (of soms $-1$)}
\end{equation}
Het schema van een exponential running average filter is te vinden in
figuur \ref{fig:era}.
\begin{figure}
\centering
\def\svgwidth{\columnwidth}
\input{img/era.pdf_tex}
\caption{Schema van een exponential running average filter}
\label{fig:era}
\end{figure}
Een klasse van IIR-filters die zeer flexibel en snel te berekenen zijn, zijn de
\textit{bikwadratische} of \textit{biquad}-filters:
\[y[n]=b_{0}x[n]+b_{1}x[n-1]+b_{2}x[n-2]-a_{1}y[n-1]-a_{2}y[n-2]\]
Het is vaak dit type filter dat gebruikt wordt in digitale toepassingen om
een lowpass- of highpassfilter te implementeren.
Hoe deze precies te ontwerpen, wordt in \cite{AudioEQCookbook} besproken.
\section{Toepassingen}
\subsection{Audio: Karplus-Strong snaarsynthese}
Filters worden niet alleen gebruikt om bv. een bas te versterken, maar ook als
basisblok voor grotere dingen. Zo wordt een lowpassfilter gebruikt om een
gitaarklank te synthetiseren, met de zgn. Karplus-Strong-snaarsynthese.
Figuur \ref{fig:karplusstrong} geeft een idee van hoe het werkt. Filters
vormen ook de basis van \textit{subtractieve} synthesizers\footnote{De
tegenhanger, de \textit{additieve} synthesizer, sommeert heel veel sinussen.}.
\begin{figure}
\centering
\def\svgwidth{\columnwidth}
\input{img/ks.pdf_tex}
\caption{Schema van Karplus-Strong-snaarsynthese}
\label{fig:karplusstrong}
\end{figure}
\subsection{Beeld: bloom-effect}
Er bestaan ook meerdimensionale filters die op beelden kunnen toegepast worden,
hun werking is volledig analoog.
Een eenvoudige lowpassfilter maakt het beeld waziger, een highpassfilter maakt
randen duidelijker.
Deze kunnen ook als bouwstenen gebruikt worden om grotere effecten te
realiseren. Zo is het vaak zo dat licht rond een object langsgaat door
imperfecties van lenzen, dit heet een \textit{bloom}-effect. Zie bv.
figuur \ref{fig:bloom}. Het diagram in figuur \ref{fig:bloomdiag} stelt de
werking ervan voor. Het ``blur''-gedeelte wordt gerealiseerd m.b.v. een lowpass
FIR-filter. Bloom-effecten worden ook gebruikt om een voorwerp een `neon glow'
te geven.
\begin{figure}
\begin{subfigure}[b]{0.25\textwidth}
\includegraphics[width=\textwidth]{img/bloom}
\caption{Voorbeeld van een bloom-effect (bron: Wikimedia)}
\label{fig:bloom}
\end{subfigure}
~
\begin{subfigure}[b]{0.72\textwidth}
\includegraphics[width=\textwidth]{img/bloom_steps}
\caption{Diagram van hoe een bloom-effect werkt (bron: \\
\url{https://learnopengl.com/Advanced-Lighting/Bloom})}
\label{fig:bloomdiag}
\end{subfigure}
\caption{Bloom-effect}
\end{figure}
\begin{wrapfigure}{R}{0.3\textwidth}
\begin{center}
\includegraphics[width=0.48\textwidth]{img/24u}
\end{center}
\caption{Balkjes op de 24 urenloopwebsite (bron: iemand op Twitter)}
\label{fig:24u}
\end{wrapfigure}
\subsection{Balkjes van loopploegen bij de 24 urenloop}
Op de website van de 24 urenloop\footnote{\url{http://24urenloop.be/}} toont
ULYSSIS de tussentijdse rondjes van elke loopploeg, samen met een schatting van
de positie van de loper op het parcours.
Omdat het onpraktisch is om van elke loper de exacte positie bij te houden,
wordt de snelheid van de loper benaderd door de afstand tussen de laatste twee
meetpunten te delen door de tijd die nodig was om die afstand te lopen.
Daarover wordt dan een exponential running average (IIR)
toegepast\footnote{Bron:
\url{https://github.com/ULYSSIS-KUL/ipp/blob/master/Processor/src/main/java/org/ulyssis/ipp/snapshot/TeamState.java\#L170}
} om plotse `spikes' weg te werken. Hier is $\alpha = 0.4$ voor
vergelijking \ref{eq:era}.\footnote{Nog een oefening: ga na dat deze filter een
lowpasskarakteristiek heeft.}.
\subsection{Errata}
In de eerste draftversie was er een fout in vgl. \ref{eq:coeffs_final} uit deel
\ref{sec:concreet}, in dit document staat de (hopelijk) correcte versie. Bedankt
Ewout om het me te vertellen.
In v1.0.2 was er nog een fout: $\overline{f_c} = \frac{f_p + f_s}{f_{sa}}$
moest $\overline{f_c} = \frac{f_p + f_s}{2 f_{sa}}$$ $ zijn.
\subsection{Broncode}
\LaTeX-broncode is hier te vinden:
\url{https://gitlab.ulyssis.org/pcy/fir-tex-src}, zodat zij die met \LaTeX
worstelen een `real life'-voorbeeld kunnen bestuderen.
\clearpage
\printbibliography
\end{document}
File added
%% Creator: Inkscape inkscape 0.92.2, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'era.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{456.02241756bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.55920628)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{img/era.pdf}}%
\end{picture}%
\endgroup%
This diff is collapsed.
File added
%% Creator: Inkscape inkscape 0.92.2, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'ks.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{389.38198389bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.36892904)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{img/ks.pdf}}%
\end{picture}%
\endgroup%
This diff is collapsed.
@misc{AudioEQCookbook,
title="Cookbook formulae for audio equalizer biquad filter coefficients",
author="Robert Bristow-Johnson",
url="https://pcy.ulyssis.be/tmp/Audio-EQ-Cookbook.txt",
note=" [Online; bezocht op 2018-12-22. Het origineel is \url{http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt}, maar onbereikbaar door een 'Bandwidth Exceeded Error'.]",
howpublished="text file"
}
@book{IOV1H01A4A,
publisher="CuDi VTK vzw",
year="2018",
title="Informatieoverdracht en -verwerking, Deel 1",
author="B. Nauwelaers",
keywords="information theory, data transmission",
}
@conference{SlidesIOV4H01D2A,
title="Digitale filters",
booktitle="Informatieoverdracht en -verwerking, Slides Deel 4",
author="B. Nauwelaers en G. Vandenbosch",
publisher="CuDi VTK vzw",
year="2018",
}
@book{SysteemtheorieH01A4A,
publisher="CuDi VTK vzw",
year="2017",
title="Toegepaste Algebra, Deel 2: Inleiding tot de systeemtheorie",
author="prof. Vincent Rijmen en prof. Hugo Van Hamme",
keywords="systems and control theory, linear algebra",
}
@misc{YeharDSP,
title="Yehar's Digital Sound Processing tutorial for the braindead!",
author="Olli `Yehar' Niemitalo",
url="http://yehar.com/blog/?p=121",
note=" [Online; bezocht op 2018-12-22]",
year="1998",
month="1",
howpublished="webpage"
}