Forum: Digitale Signalverarbeitung / DSP / Machine Learning Spektrum aus Audio Daten nur wie?


von dirk (Gast)


Lesenswert?

Hallo

Ich muss ein Programm schreiben das aus Audio Daten ein Power Spektrum
erstellt.
Eingangs Daten: 44100Hz; Stereo; 5 Sekunden; float
Ausgangs Daten: log. 20-22500Hz --> 20Hz=0,9 25Hz=1,1 30Hz=0,8 ....

Nun die Audio Daten habe ich im Speicher.
Nur wie mache ich daraus meine Ausgangs Daten?
Wie eine FFT genau funktioniert habe ich bis jetzt noch nicht richtig
verstanden. Klar ist nur das ich sie brauche. Nun ja eigentlich muss
ich sie ja nur anwenden, aber WIE?

Dirk

von Jürgen Schuhmacher (Gast)


Lesenswert?

Auf opensource und sourceforge gibt es c-codes die das direkt leisten.
Die fft ermittelt dir aber erstmal nur die Verteilung. Bei der Leistung
must Du die f noch gesondert beruecksichtigen.

von dirk (Gast)


Lesenswert?

Ich habe mir die FFT Routinen aus dem Audacity Projekt mal angesehen.
Nur habe ich keine Idee, wie ich damit umgehen muss. Oder anders
gesagt, wie & was ich da rein schieben muss, um mein Ergebniss zu
bekommen. Ist mit Sicherheit ganz einfach, nur ich sehe nicht wie ich
es machen muss und bin ein wenig am verzweifeln.

Dirk

von Timmo H. (masterfx)


Lesenswert?

Musst du das in C machen oder in Matlab oder sowas? In Matlab ist es ja
drin. Ein bisschen Erklärung zum fft Algorithmus von Matlab findest du
auf deren Seite:
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fft.html
Dann gibts auch noch auf folgenden Seiten Hilfe:
http://www.kgw.tu-berlin.de/statisch/lehre/skript/ds/node36.html
http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation

von romanua (Gast)


Lesenswert?

FFT wird hier gut erklaert, finde ich.

http://www.dspguide.com/

von dirk (Gast)


Lesenswert?

Mein Code ist sogar in C++ geschreiben. Also da ist nichts mit Matlab
oder sowas.
Eigentlich will ich auch gar nicht verstehen wie eine FFT geht, sondern
nur wissen wie ich sie anwenden muss.
Ich habe mir in den letzten Tagen einige FFT Routinen angesehen und
eingebaut.
Nun bekomme ich zwar Ausgangs-Daten (Array) nur es fehlt mir der Bezug
zur Frequenz (Array[X]--> ??Hz). Soweit ich es verstanden habe sind die
Daten linear im Array. Ich brauche sie aber mit einer log. Aufteilung.
Muss ich mir da die gewünschten Frequenzen aus dem Array selber raus
suchen?

von Matthias (Gast)


Lesenswert?

Die Daten sind mit der Samplerate f_s=44100 abgetastet, das ergibt t_0 =
1/f_s = ...
Du machst die FFT über N Samples =>
f_0 = f_s / N
beispielsweise 1024 Punkte FFT
f_0 = 44100 / 1024 = 43.0664Hz

Das heißt der Abstand deiner Spektrallinien im Bildbereich ist ca
43Hz.
Die erste Spektrallinie die du hast steht für 0Hz, die nächste für
43Hz, die nächste für 86Hz, ..., bis zu letzten, die für (44100-43)Hz
steht. Alles über f_s/2 sind aber in Wirklichkeit die Werte für die
negativen Frequenzen, am besten du schmeißt sie gleich weg.
Du siehst also, dass du im Frequenzbereich auch eine lineare Skala
erhälst. Wie du das ganze jetzt am besten logarithmisch machst fällt
mir jetzt auch nicht sofort ein. Ich denke die passenden Linien
raussuchen reicht nicht aus. Eventuell musst du du schon alle Linien
verwenden, und dann eben in den höheren Frequenzen immer mehrere
zusammenaddieren.
Dabei gehts darum, dass die Gesamtenergie ja stimmen muss.

von Dirk (Gast)


Lesenswert?

Ist es wirklich so einfach! Und ich habe es nicht selber gesehen.
Hätte ich das nur mal richtig gelernt oder besser aufgepasst.

Danke Dirk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.