Frequenzanalyse

darkeye2

Bekanntes Mitglied
Hallo,

die forensuche hat mir zwar ein ergebniss geliefert, allerdings wurde da die frage werder richtig beantwortet, noch gehen die dort angegebenen links.
Ich beschäftige mich in letzter zeit sehr viel mit Musik, hauptsächlich mit mp3, hab auch schon viele sachen zusammen, eine klasse, die das abspielt, klassen, die alle möglichen daten aus den mp3´s auslesen, .... . Nun möchte ich allerdings wissen, welche Frequenz zu einem bestimmten zeitpunkt des liedes ist .... also z.b. ich möchte wissen, welche Frequenz das lied bei 10sec hat, welche bei 11, .... , wie könnte man sowas realisieren, hab schon einiges über FFT und ähnliches gelesen, aber nicht wirklich verstanden wie mir das helfen soll, bzw was das macht, grundelegen würde ich mich zunächst mal über informationen sowie informative links freuen, auch einen code würde ich mir gerne anschauen, aber die infos haben vorrang.
 

MQue

Top Contributor
Beschäftig dich erst mal mit Matlab, Matlab ist ein paradebeispiel für FFT- Programmierung und außerdem ist die GUI von Matlab in Java Programmiert, da kannst du gleich schaun, wie man sowas in 3D darstellen kann.
 

darkeye2

Bekanntes Mitglied
matlab scheint kostenpflichtig zu sein, außerdem will ich doch nur wissen, was genau das ist, und wie mir das helfen soll, zu einem bestimmten zeitpunkt die frequenz des liedes zu ermitteln.
 

AlexSpritze

Bekanntes Mitglied
Wenn du schon einiges über FFT gelesen hast, dann solltest du auch wissen, dass die diskrete FT „zur Bestimmung der in einem abgetasteten Signal hauptsächlich vorkommenden Frequenzen“ (de.wikipedia.org -> DFT) benutzt werden kann. Und es wird bestimmt mehrere Java-Bibliotheken für die FFT geben, kannst davon eins ja mal testweise ausprobieren.

Bei einem Lied wirst du aber zu einem bestimmten Zeitpunkt mehr als eine Frequenz haben, siehe z.B. den Equalizer bei WinAMP.

Welchen Sinn siehst du in 180 Werten, die dir die Frequenz zu jeder vollen Sekunde eines 3 minütigen Liedes anzeigen? Was ist mit Werten dazwischen? ;)
 
D

Dow Jones

Gast
Hallo,
Nun möchte ich allerdings wissen, welche Frequenz zu einem bestimmten zeitpunkt des liedes ist .... also z.b. ich möchte wissen, welche Frequenz das lied bei 10sec hat, welche bei 11, ....

Hi,
man müsste es anders ausdrücken: Ein Lied hat zu jedem Zeitpunkt alle Frequenzen, wobei jede Frequenz individuell stark ausgeprägt ist.

Du kannst dir das so vorstellen das ein (Musik-)Signal zunächst mal eine "beliebg geartete Schwingung" ist. Wenn du deinen Song in einem Waveeditor öffnest und einen Ausschnitt daraus betrachtest (z.B. die 11. Sekunde), dann bekommst du vermutlich so etwas hier angezeigt:
signal.png


Das ist aber keine einfache Schwingung zu der man irgendeine Frequenz angeben könnte, sondern eine Überlagerung von mehreren monofrequenten Schwingungen. Soll heißen, es ist eine Überlagerung von verschiedenen Sinuswellen mit individueller Amplitude.

Wenn wir zum Beispiel eine Sinusschwingung von einem Hertz und der Amplitude 0.5 mit einer Sinusschwingung von 2 Hertz und der Amplitude 0.4 überlagern erhalten wir als Ergebnis die Schwingung S = sin(1*t)*0.5 + sin(2*t)*0.4.
1u2.png


Addieren wir noch eine Sinusschwingung von 10 Hertz und einer Amplitude von 0.1 hinzu erhalten wir S = sin(1*t)*0.5 + sin(2*5)*0.4 + sin(10*t)*0.1
1u2u10.png


Jetzt noch schnell einen Sinus von 0.25 Herz und einer Amplitude von -0.6 addiert und wir haben wie von Zauberhand unser obiges Beispielsignal.
1u2u10u025.png



hab schon einiges über FFT und ähnliches gelesen, aber nicht wirklich verstanden wie mir das helfen soll, bzw was das macht
Die Fouriertransformation liefert dir zu einem gegebenen Eingangssignal die zugehörige Zerlegung in monofrequente Schwingungen. Oder besser gesagt, sie liefert dir für jede Frequenz die zugehörige Amplitude (damit die Überlagerung aller Frequenzen das gewünschte Eingangssignal ergibt). Bei unserem Beispiel würde die FT folgendes ergeben:

FT (0 Hertz) = 0.0
FT (0.25) = -0.6
FT (1) = 0.5
FT (2) = 0.4
FT (3) = 0.0
FT (4) = 0.0
...
FT (9) = 0.0
FT (10) = 0.1
FT (11) = 0.0
FT (12) = 0.0
...
Das bedeutet halt das sich das Eingangssignal als sin(0*t)*0.0 + sin(0.25*t)*(-0.6) + sin(1*t)*0.5 + sin(2*t)*0.4 + sin(3*t)*0.0 + sin(4*t)*0.0 + ... + sin(9*t)*0.0 + sin(10*t)*0.1 + sin(11*t)*0.0 + ... schreiben lässt. Diese Amplitudenwerte sind übrigens auch das, was dir der Equalizer bei Winamp anzeigt (die ständig hüpfenden Balken). Auch daran sieht man, wie oben schon gesagt, das ein Lied nicht nur eine Frequenz hat sondern alle gleichzeitig, nur halt unterschliedlich stark ausgeprägt.
Es empfiehlt sich dabei natürlich das gewünschte Eingangssignal - also das gesamte Lied - in ganz kleine Häppchen zu zerlegen (wobei die errechneten Amplituden dann natürlich nur für ein jeweiliges Häppchen gelten). Eine Sekunde ist da schon recht lang, nimm lieber noch kleinere Einheiten. Dann hast du weniger Rundungsfehler, und schneller geht die Berechnung auch noch.

Codeschnipsel oder eine Library für das Ganze habe ich jetzt leider auch nicht zur Hand. Aber wenn du mal nach der eindimensionalen diskreten Fouriertransformation googelst müsstest du schnell was passendes finden.
 

homer65

Top Contributor
Zu einem Zeitpunkt hatt ein Signal überhaupt keine Frequenz. Um einem Signal Frequenzen zuzuordnen braucht man ein Zeitinterval. Dann kann man den Verlauf des Signals in diesem Intervall duch Frequenzen annähern.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben