Spektrum aus Audio Daten nur wie?

Gast #390373
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
Gast #390374
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.
Gast #390375
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
#390376
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
Gast #390378
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?
Gast #390379
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.