DJ Raptor hat folgendes geschrieben: |
hm der begriff power spektrum sagt mir jetzt nichts, ich muss eben anhand des gesamtsignals wissen welche frequenz in Hz vorliegt. Natürlich mit einer gewissen Toleranz, da die Frequenz ja nie ganz genau exakt anliegen wird. eine erklärung für FFT wär aber natürlich auch hilfreich wobei ich dann natürlich zur Theorie auch noch einen Vorschlag zur praktischen Umsetzung bräuchte. |
So genau kannst du die Frequenzen sowieso nicht rausfinden. Es gibt eine mathematisch bedingte Unschärfe (welche übrigens dieselbe ist wie bei der Unschärfe bei der Quantenmechanik

).
Wie dem auch sei. Zunächst brauchst du eine FFT Routine. Die FFT-Funktion nimmt ein kurzes Mono-Signal (z.B. ein array of double) und transformiert ihn in den Fourier-Raum. Der Fourier-Raum ist im allgemeinen komplex und deswegen kriegst du auch ein array of complex aus der FFT-Routine raus. In den komplexen Zahlen des Arrays sind die Stärke und die Phasenverschiebung der einzelnen Frequenzanteile gespeichert. Um nun das Energie-Spektrum zu erhalten, rechnest du den Betrag der komplexen Zahlen (= Pythagoras) und quadrierst sie. Das ist eigentlich schon alles.
Die Frequenzen in der komplexen Array sind folgendermassen geordnet:
1. Eintrag = Nullverschiebung.
2. Eintrag = Grundfrequenz = 1/Signaldauer. Wenn das Mono-Signal also 0.5s lang ist, ist die Grundfrequenz 2 Hz.
3. Eintrag = 2xGrundfrequenz
4. Eintrag = 3xGrundfrequenz
etc.
Die höchste Frequenz (die sog. Nyquist-Frequenz) ist gerade die Hälfte der Abtastfrequenz (bei einem 44KHz Signal ist die höchstmögliche Frequenz 22KHz).
Praktische Umsetzung:
- Du nimmst die Wave-Daten und schneidest sie in kleine Stücke. Am besten nimmst du für die Länge eine feste Zweierpotenz. Z.B. 2048 Samples. Für jedes kleine Stück führst du dann eine Frequenzanalyse durch.
- Du nimmst so ein Stückchen und konvertierst die Daten (bei 16-bit Sound in SmallInt gegeben) in Floats (z.B. in Double)
- Du normierst die Floats (durch 32768 teilen)
- Danach multiplizierst du ein Hamming-Window drüber. Das ist wichtig, sonst kriegst du Phantomfrequenzen, weil die Wave-Form links und rechts nicht stetig ineinander übergehen.
Die Hamming-Funktion sieht folgendermassen aus:
Delphi-Quelltext
1: 2:
| for i := 0 to n-1 do CorrectedWavePiece[i] := OldWavePiece[i] * ((0.42 - 0.5 * cos(2.0 * pi * i / n) + 0.08 * cos(4.0 * pi * i / n))); |
Wobei n = length(OldWavePiece) ist. Diese Korrekturfunktion die man drübermultipliziert bewirkt zudem eine Faltung im Frequenzraum und verschmiert so die Frequenzen ein bisschen.
- Auf dieses korrigierte Array führst du eine FFT durch und erhältst ein neues Array mit komplexen Zahlen. Das komplexe Output-Array ist halb so lang wie das reelle Input-Array. Es geht jedoch keine Information verloren, da eine komplexe Zahl ja aus zwei reellen besteht.
- Für jede komplexe Zahl berechnest du den Betrag und quadrierst diesen (Energie = Imaginärteil^2+Realteil^2).
Dann hast du für jedes Vielfache der Grundfrequenz die Energie..
Ich weiss nicht, wie einfach oder schwer es ist, das umzusetzen, wenn man noch nie mit solchen Sachen gearbeitet hat.