Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
|
Re: Grundsätzliche Funktionsweise von Musikerkennungssoftwar
14. Jun 2005, 12:03
Oben hatte ich's schon angesprochen, allerdings kam das wohl nicht so exakt rüber.
Das Ziel ist es einen inhaltlich korrekten Fingerabdruck eines Songs zu bekommen. Dieser sollte natürlich kurz sein. Man könnte jetzt eine FFT über den gesammten Songs durchführen, nur würde das fast nichts bringen. Eine solche FFT würden den kompletten Song so betrachten als würde er zeitlich gesehen mit einem einzigsten Male abgespielt werden. Viele, sehr veschiedene Songs, würden also immer ähnliche FFT Spektren erzeugen das es keinen zeitlichen Bezug des Spektrums zum Song mehr gibt.
Deshalb meinte ich oben das man eine "3D" FFT durchführt. Man erzeugt in einem zeitlichen Raster also mehrere FFT's nacheinander. Jede dieser FFT's wird zb. auf nur 16 Frequenzbänder limitiert. Angenommen wir benutzen ein Raster von 1 Sekunde, so ergibt sich also pro Sekunde eine FFT mit 16 Realwerten. Nach 3 Minuten haben wir 16 zeitliche Frequenzbänder mit jeweils 180 Realwerten, macht 180*16 insgesammt. Nun werden diese 16 Frequenzbänder nochmals normalisiert indem man 16 DFT's, also diskrete Fourier Transformationen auf diese anwendet. Angenommen diese DFT's erzeugen aus den Bändern wiederum 16 Bänder, so ergibt das am Ende 16*16 = 256 Realwerte als Fingerabdruck. Der Vorteil bei den "horizontalen" DFT's ist das sie mit Inputdaten beliebiger Länge auf Outputdaten mit fest vorgegebener Länge arbeiten können. Das bedeutet das die "vertikalen" Frequenzband-schnitte, die ja abhängig von der Songdauer sind denoch mit den abschließenden DFT's auf eine normierte Große gemappt werden können.
Also nochmal zur Verdeutlichung:
Man zerlegt die Songs in Zeitscheiben von immer gleicher Länge und erzeugt von diesen Happen "vertikale" FFT's. Jede dieser FFT's produziert sehr wenige Frequenzspektren, zb. 16. Man hat am Ende des Songs also 16 Frequenz-spektren-spuren die nun jeweils für sich gesehen einer DFT unterworfen werden. Diese DFT erzeugt sozusagen ein Frequenzspektrum über den zeitlichen Verlauf eines Frequenzspektrums in einem Song. Im Grunde kann man so errechnen in welcher Frequenz der Takt eines Songes verläuft, sprich man ermittelt den Beat, das Spektrum verschiedener Stimmen, die Benutzung klangtypischer Instrumente usw. usw.
Wir haben nun ein 16*16 Array of Double das einen Song normalisiert und komplett beschreibt. Man erzeugt nun eine Datenbank die diese Daten als "Baumstruktur" sortiert enthalten. Nun ist es einfach mit der Suche. Man erzeugt den Fingerabdruck des aktuellen Songs. Sucht den ersten Eintrag des Fingerabdruckes -> array[0], und selektiert den Knoten der Wertmäßig am nächsten kommt. Nun geht man eine Ebene im Baum tiefer und sucht dort den Wertmäßig passenden Eintrag zum array[1] Wert, usw. usw. Dabei wird immer überprüft das dieser Vergleich keine zu starken Differenzen bildet, d.h. der Song auch wirklich in der Datenbank steht. Am ende hat man im besten Falle mit 256 Vergleichen den Song in der Datenbank gefunden.
So würde ich das Problem angehen.
Gruß Hagen
|