next up previous contents index
Next: Überlegungen zum Datenvolumen Up: Vorverarbeitung Previous: Signalaufbereitung   Contents   Index


Signaltransformation

Alle bisherigen Arbeiten enden hier und generieren direkt aus diesen Koeffizienten einen Eingabevektor. Kohonen selbst schlägt in seinem Buch vor, Fourierkoeffizienten als Merkmale zur Generierung von SOM Eingangsvektoren zu benutzen [#!kohonen!#]:

...one can use the elements of the ...Fourier amplitude-spectrum as features.
Das erhaltene Frequenzspektrum (FRQ-Daten) stellt eine Momentaufnahme dar (engl: snapshot)und ist für die Klanganalyse geeignet. Um auf die Zeitachse zurückzukehren wird eine Gruppe von hintereinander liegenden Snapshots ausgewählt. In Experimenten stellte sich heraus, dass die besten Ergebnisse bei einer Snapshot Gruppe von insgesamt 5 Sekunden erzielt werden konnten.

Leider erweist sich die Entnahme einer fünfsekundigen Probe als schwierig, da der komplexe Aufbau von XMMS keine zeitlichen Schranken für die Berechnung erlaubt. Einerseits entstehen Timingprobleme durch die Plugin-Architektur, andererseits durch die Prozessorlast. Da Linux auch kein Echtzeitbetriebssystem ist, kann der XMMS Prozess auch von anderen Prozessen unterbrochen werden. Um exakte Zeitpunkte zu erhalten wird in das programmierte Plugin ein Timer eingebaut, der die real verstrichene Zeit zwischen zwei Sample-Arrays misst. Weiters wird durch die Auswahl einer sehr schnellen CPU und Beendigung aller nicht benötigten Programme dafür gesorgt, dass XMMS immer genügend Rechenzeit zur Verfügung steht. Die tatsächliche Prozessorlast lag bei den Experimenten während des Abspielens der Musik dauerhaft bei unter 10 Prozent. Die zeitlichen Probleme sind damit vorerst gelöst, doch bedarf es einer späteren Berücksichtigung der eingeführten Zeitstempel. Bei den Experimenten zeigte sich, dass XMMS etwa alle 20 ms ein Datenarray liefert. Für fünf Sekunden ergeben sich somit 250 Datenwerte.

Figure: gesamt über die Frequenz betrachtete Frequenzspektren
\includegraphics [width=0.6\textwidth,clip]{frq2}

Durch die am Computer gegebene Beschränkung des Speicherplatzes war allerdings noch eine weitere Optimierung notwendig. In Experimenten zeigte sich, dass es nicht nötig war jedes einzelne Frequenzband zu betrachten, sondern dass hier eine deutliche Datenreduktion wenig Auswirkungen auf die Ergebnisse hat. Daher wurden nicht alle 256 Frequenzbänder betrachtet, sondern nur jedes fünfzehnte, wodurch insgesamt 17 Bänder betrachtet werden (siehe auch Kapitel [*]). Abbildung [*] zeigt 6 aufeinander folgende Snapshots (20 ms Abstand) in 17 Frequenzbändern $(1,16,\ldots,241)$ mit jeweils einer Amplitude bis zu 32767.

Durch diese Zusammenfassung sind die Daten jetzt in Form einer im Ausdruck [*] gezeigte zweidimensionale $250 \times 17$ - Datenreihe gegeben.

\begin{displaymath}
\begin{array}{cccccc}
t_{1}: & k_{1\ 1} & k_{1\ 16} & k_{1\ ...
..._{250\ 16} & k_{250\ 31} & \ldots & k_{250\ 241}\\
\end{array}\end{displaymath} (5)

In den Spalten befinden sich die Fourierkoeffizienten und in den Zeilen die einzelnen Samples. Die Zeilennummern $22 \times 22$ repräsentieren die Zeitstempel, die darauf hinweisen, dass die Abstände zwischen den einzelnen Samples nicht regelmäßig sind. Das Ganze ist somit wieder eine Funktion über die Zeit. Bei diesem Schritt kann man jetzt abbrechen und aus diesen Datenreihen einen Eingabevektor erzeugen, doch wird hier noch einen Schritt weiter gegangen. Um, wie Kohonen und andere auch, Spektren von der SOM gruppieren zu lassen, wird nochmals eine Fouriertransformation vollzogen. Diesmal ist jedoch nicht ein Audiosignal die zu transformierende Funktion, sondern eine Funktion, die aus den Spalten aus Ausdruck [*] durch Interpolation erstellt wird. Da die einzelnen Frequenzbänder für unterschiedliche Frequenzbereiche stehen, kann man sie getrennt betrachten. Somit erhält man 17 Funktionen die zu interpolieren sind. Da allerdings nur wieder diskrete Eingangswerte für die darauf folgende FFT interessant sind, wird die Funktion selbst nicht berechnet, sondern nur deren Funktionswerte.

Zur Anwendung kommt das Lagrange-Verfahren (Ausdruck [*]). Bei diesem Verfahren hängen die Polynome nur von den Stützstellen $0.8$ ab (siehe Ausdruck [*]).

\begin{displaymath}
P_{n}(x_{i}) = f(x_{i}),\qquad (i=0,1,\ldots,n)
\end{displaymath} (6)

Für das Lagrange-Verfahren existieren sehr schnelle und bekannte Implementierungen, wie sie in [#!numrec!#,#!numcd!#] zu finden sind und hier zur Anwendung kommen.
\begin{displaymath}
P_{n}(x) = \sum_{i=0}^{n} \left( \prod_{j=0, j \not= i}^{n}\frac{x-x_{j}}{x_{i}-x_{j}}\right) f(x_{i})
\end{displaymath} (7)

Ergebnis der Interpolation sind 256 äquidistante Funktionswerte pro Funktion, an denen nachfolgend eine FFT durchgeführt wird. Resultat sind 256 reale positive und negative Fourierkoeffizienten.

\begin{displaymath}
\begin{array}{cccc}
f_{1\ 1} & f_{1\ 2} & \ldots & f_{1\ 256...
...
f_{241\ 1} & f_{241\ 2} & \ldots & f_{241\ 256}\\
\end{array}\end{displaymath} (8)

Ausdruck [*] sieht auf den ersten Blick bekannt aus, doch enthalten die Spalten jetzt zusammengehörige Fourierkoeffizienten der einzelnen interpolierten Funktionen in den Zeilen. Abbildung [*] zeigt die Ausgangslage vor der Lagrangeinterpolation. Sie zeigt ein ähnliches Bild wie Abbildung [*], doch ist die Abbildung gedreht. Statt wie in [*] eine Funktion über Frequenzbänder zu betrachten, wird in [*] eine Funktion über die Zeit betrachtet.

Figure: getrennt über die Zeit betrachtete Frequenzspektren
\includegraphics [width=0.6\textwidth,clip]{frq3m}

Aus diesem Zahlenfeld wird nun ein SOM Eingabevektor erstellt. Da die SOM nur einstellige Vektoren akzeptiert, wird das zweidimensionale Feld in einen Zeilenvektor umgewandelt.

\begin{displaymath}
f_{1\ 1}\ f_{1\ 2}\ \ldots\ f_{1\ 256}\ ,\ f_{16\ 1}\ f_{16\...
...}\ ,\ \ldots\ ,\ f_{241\ 1}\ f_{241\ 16}\ \ldots\ f_{241\ 256}
\end{displaymath} (9)

Ausdruck [*] symbolisiert nun den Vektor für ein fünfsekundiges Stück eines Liedes. Einer dieser Vektoren besteht somit aus $10 \times10$ Werten (engl: features). Jedes Lied wird, wie oben beschrieben, in fünfsekundige Intervalle eingeteilt. Aus den resultierenden Vektoren wird das Eingabevektorfile erstellt. Das letzte Intervall eines Liedes wird sich in den meisten Fällen nicht genau auf 5 Sekunden ausgehen. Eine Möglichkeit wäre, das letzte Intervall mit Nullen auf die Länge von fünf Sekunden aufzufüllen. Nach Anwendung der SOM würden allerdings solche Stücke durch ihre Ähnlichkeit alle auf einem Knoten landen. Diese Ähnlichkeit wäre allerdings durch das Verfahren erzeugt worden und somit nicht in den Ursprungsdaten enthalten. Diese Lösung ist nicht erstrebenswert. Solche Schlusssegmente werden daher ignoriert. Ein Lied mit einer Länge von 4 Minuten wird also durch $18 \times 18$ Vektoren dargestellt. Um die Datenrate noch weiter zu senken wurde nur jedes zweite fünfsekundige Segment gewählt. In Experimenten erwies sich auch das als eine erhebliche Performancesteigerung.

Noch einmal sei daran erinnernt, dass das hier gezeigte Verfahren nicht Melodie verarbeitend ist, sondern die Änderung bzw. Dynamik des Klanges untersucht. Segmente, die in der Karte nebeneinander abgebildet sind, haben somit ähnliche klangliche Dynamik und nicht eine ähnliche Melodie. Zur Illustration soll Abbildung [*] dienen.

Figure: drei fast gleiche Stücke auf Ähnlichkeit untersucht
\includegraphics [width=18mm,clip]{parsec}

Die Grafik zeigt drei fast gleiche fünfsekundige Musikstücke, die aus dem Refrain des Lieds Breathless (The Corrs)stammen. Auf der horizontalen Achse sind die 256 Fourierkoeffizienten aufgetragen, und auf der vertikalen Achse deren Wert. Stück $0.8$ beinhaltet ausschließlich Refrain. Stück $10 \times10$ läuft Stück $A$ um eine halbe Sekunde voraus und beinhaltet auch nur Refrain. Stück $C$ läuft Stück $A$ um eine Sekunde voraus und beinhaltet sowohl Refrain, als auch einen kurzen Teil einer Strophe, die eine gänzlich andere Instrumentierung besitzt. Abbildung [*] zeigt die Fourierkoeffizienten, die zur Vektorbildung für die Segmentkarte herangezogen werden. Während Stück $A$ und Stück $B$ gleich klingen, da dieselbe Instrumentierung und derselbe Gesang vorherrscht, obwohl sie versetzt sind, zeigt Stück $C$ ein gänzlich anderes Verhalten der Koeffizienten. Dies zeigt eindeutig, dass das gezeigte Verfahren unabhängig von der Melodie nur auf die Dynamik des Klanges abzielt.

In einem letzten Vorverarbeitungsschritt erfolgt eine Nullpunktverschiebung über den gesamten Bereich. Da die Vektoren Kurvenbeschreibungen darstellen, muss man nur den kleinsten Koeffizienten über alle Vektoren wählen und dessen Absolutbetrag zu allen Koeffizienten dazuzählen um alle Kurven in den positiven Bereich zu übertragen. Zum Schluss werden die Vektoren noch auf den Bereich $[0,1]$ Längen normiert.



Subsections
next up previous contents index
Next: Überlegungen zum Datenvolumen Up: Vorverarbeitung Previous: Signalaufbereitung   Contents   Index
Markus Fruehwirth
2001-03-30