Get plain frequencies of a mp3 file



  • Hallo,

    hat jemand hier eine Idee, wie man nur die einzelnen Frequenzen einer mp3 Datei bekommt?

    Danke!


  • Mod

    Ja.



  • FFT



  • SeppJ schrieb:

    Ja.

    Ich weiß, dass ich meine Frage tatsächlich doof gestellt habe.
    Wie würdest du dieses Vorhaben denn angehen?

    DSPlerin schrieb:

    FFT

    Das ist tatsächlich schon einmal ein gutes Stichwort.
    Stelle ich mir das soweit richtig vor, dass ich die MP3-Datei dekodieren muss und anschließend dann durch eine FFT schicken muss?
    Habt ihr da Vorschläge für fertige Implementierungen und Libaries?



  • Musikfledderer schrieb:

    Stelle ich mir das soweit richtig vor, dass ich die MP3-Datei dekodieren muss und anschließend dann durch eine FFT schicken muss?

    Ja.

    Musikfledderer schrieb:

    Habt ihr da Vorschläge für fertige Implementierungen und Libaries?

    Sprache? Dürfen Commandline-Utilities zur Verwendung kommen?

    Wenns um C bzw. C++ Libraries geht:
    Zum MP3 Dekodieren könnte man die libavcodec verwenden.
    Für FFT könntest du dir FFTW ansehen.

    Gibt aber vermutlich für beides fertige Commandline Tools (zum MP3 Dekodieren ganz sicher).


  • Mod

    Musikfledderer schrieb:

    SeppJ schrieb:

    Ja.

    Ich weiß, dass ich meine Frage tatsächlich doof gestellt habe.
    Wie würdest du dieses Vorhaben denn angehen?

    Ich habe nicht deshalb so eine doofe Antwort gegeben, weil es möglich war, sondern eher wegen: Was hast du denn überhaupt gemacht? Die ganze Audioverarbeitung am Computer findet im Frequenzraum statt. Das ist einer der grundlegenden Mechanismen, wie mp3s überhaupt funktionieren, denn mp3 ist keine Wellenform, sondern eine (komprimierte) Angabe, welche Frequenzen mit welcher Amplitude die Wellenform ausmachen. Wenn du also fragst, wie du aus mp3s an Frequenzen kommst, hast du dich folglich noch überhaupt gar nicht im geringsten auch nur im entferntesten mit dem Thema auseinander gesetzt, denn sowohl bei Audioverarbeitung im Allgemeinen, als auch bei mp3 im Speziellen ist das so ungefähr das allerallererste überhaupt, mit dem man konfrontiert wird, denn ohne Frequenzen geht da überhaupt gar nichts. Und das ist doch etwas mager, so eine Frage zu stellen, wenn man absolut überhaupt gar nicht selber auch nur im Ansatz versucht hat, sie selber zu beantworten.

    PS: Das heißt übrigens auch, dass die Frequenzen direkt aus der mp3-Datei ablesbar wären, wenn man sich denn bloß mal mit dem Format beschäftigen würde. Die Idee mit dem Decodieren und anschließendem Transformieren ist daher zwar möglicherweise recht einfach zu programmieren, weil man zwei fertige Bibliotheken kombinieren kann, aber es sollte einem Programmierer im Herzen weh tun, aus Faulheit oder Unvermögen solche Umwege zu gehen.



  • SeppJ schrieb:

    PS: Das heißt übrigens auch, dass die Frequenzen direkt aus der mp3-Datei ablesbar wären, wenn man sich denn bloß mal mit dem Format beschäftigen würde.

    Ja, stimmt. Wobei die Frage ist ob einem die Auflösung im Frequenzraum reicht.

    SeppJ schrieb:

    Die Idee mit dem Decodieren und anschließendem Transformieren ist daher zwar möglicherweise recht einfach zu programmieren, weil man zwei fertige Bibliotheken kombinieren kann, aber es sollte einem Programmierer im Herzen weh tun, aus Faulheit oder Unvermögen solche Umwege zu gehen.

    Siehe oben 😉
    Davon abgesehen hat es den Vorteil dass man sich damit nicht auf MP3 festlegt. Was u.U. ein grosser Vorteil sein kann. Oder auch total wurscht - kommt halt immer drauf an. Von daher würde ich das vermutlich meistens so machen, trotz dem ich weiss wie MP3 funktioniert.


  • Mod

    hustbaer schrieb:

    SeppJ schrieb:

    PS: Das heißt übrigens auch, dass die Frequenzen direkt aus der mp3-Datei ablesbar wären, wenn man sich denn bloß mal mit dem Format beschäftigen würde.

    Ja, stimmt. Wobei die Frage ist ob einem die Auflösung im Frequenzraum reicht.

    Ich kann ja sehen, dass man auch tiefere Frequenzen mitbekommt, wenn man über mehrere Frames hinweg kombiniert, aber wenn man mal nur die Frequenzen betrachtet, die in den Samplezeitraum rein passen, dann müsste jeder scheinbare Gewinn an Frequenzauflösung doch nur mathematisches Rauschen sein. Oder übersehe ich da etwas? Irgendwoher müsste die Information schließlich kommen und in der Datei stehen nur Informationen mit endlicher Frequenzgenauigkeit.



  • SeppJ schrieb:

    aber wenn man mal nur die Frequenzen betrachtet, die in den Samplezeitraum rein passen, dann müsste jeder scheinbare Gewinn an Frequenzauflösung doch nur mathematisches Rauschen sein. Oder übersehe ich da etwas? Irgendwoher müsste die Information schließlich kommen und in der Datei stehen nur Informationen mit endlicher Frequenzgenauigkeit.

    Dass FFT verlustfrei ist ist ja mal klar. Irgendwie muss das also gehen - zumindest mit FFT, unendlicher float Genauigkeit, ohne Quantisierung und ohne "Ausnullen" von leisen Tönen.

    Und wenn du dir anguckst wie ne FFT eines einzelnen Sinustons aussieht der zwischen zwei Frequenzraum-Samples liegt, da kommt so ein mehr oder weniger breiter "Hubbel" raus. Also das "lauteste" Sample im Frequenzraum hat dann viele Nachbarn die fast ebenso laut sind. Beim Rekonstruieren des Zeitraums ergibt sich dann ein kleiner Teil einer "Schwebung" die dann eine Frequenz hat die irgendwo zwischen den Teilfrequenzen liegt aus denen sie zusammengesetzt wurde.

    Ich hab's nicht ausprobiert, aber ich würde annehmen dass das psychoakustische Modell eines MP3-Encoders diese benachbarten Frequenzen nicht gleich ausnullt, weil sie eben fast so laut sind wie die "Hauptfrequenz". Und daher nicht unter die Masking-Threshold fallen. Bzw. erst sehr sehr "spät" als Opfer auswählt wenn man extrem mit der Bitrate runterfährt. Und je mehr Nachbarn erhalten bleiben, desto genauer sollte die ursprüngliche Frequenz rekonstruierbar sein.

    Und natürlich verwendet MP3 keine FFT sondern MDCT, aber ich würde schätzen dass das nix ändert.



  • Hab nochmal ein wenig nachgelesen, MP3 ist komplizierter als ich dachte. Ich muss mich also korrigieren: ich weiss ein bisschen was darüber wie MP3 funktioniert. "Ich weiss wie es funktioniert" wäre stark übertrieben 🙂



  • hustbaer schrieb:

    Sprache? Dürfen Commandline-Utilities zur Verwendung kommen?

    Wenns um C bzw. C++ Libraries geht:
    Zum MP3 Dekodieren könnte man die libavcodec verwenden.
    Für FFT könntest du dir FFTW ansehen.

    Gibt aber vermutlich für beides fertige Commandline Tools (zum MP3 Dekodieren ganz sicher).

    C/C++ und Linux, Konsole ist natürlich auch okay.

    Vielleicht auch einmal, wofür ich das überhaupt brauche:
    Es geht darum, dass eine kurze mp3 Datei in ihre Frequenzen zerlegt wird, damit diese direkt in ein Sourcefile eingebettet werden kann. Das soll gemacht werden, damit auf einem Microcontroller ohne SD Slot und ohne größeren Rechenaufwand diese Datei über PWM abgespielt werden kann. Klappt auch alles soweit. Abgesehen eben davon, dass ich nicht weiß, wie ich an die reinen Frequenzen komme. Ich bin auch nicht unbedingt auf das mp3-Format festgelegt. Daran dachte ich nur, weil meine entsprechenden Files so kodiert sind. Aber dafür gibt es sonst auch Converter.
    Ich habe sehr wohl schon relativ viel danach gesucht, aber irgendwie fehlen mir die Stichworte für die richtigen Ergebnisse. Ich hatte die Hoffnung, dass hier jemand Bescheid weiß.

    Aber danke trotzdem.


  • Mod

    Klingt eher so, als wolltest du deine Datei in PCM umwandeln. Das kann jeder noch so popelige Konverter und hat überhaupt gar nichts mit Frequenzen zu tun.



  • war das nicht irgendwie so, dass wav-dateien direkt die werte des da-wandlers enthalten? wenn ja: wie wärs damit?


  • Mod

    Wade1234 schrieb:

    war das nicht irgendwie so, dass wav-dateien direkt die werte des da-wandlers enthalten? wenn ja: wie wärs damit?

    WAV ist ein Container. Die (L)PCM-Codierung, welche das populärste Audioformat für WAV darstellt, macht das, was du beschreibst. Siehe daher auch der Beitrag direkt über deinem!



  • achso. dann ging es ja immerhin schon mal in die richtige richtung. 🙄



  • Danke für den Tipp.
    Ich habe jetzt allerdings einmal ein wenig herumprobiert.
    Folgendes habe ich versucht:
    3s mp3 mit Audacity im raw-format, headerless in 8-bit unsigned mit 300Hz Sample Rate und Mono gespeichert. Das in HEX umgewandelt (xxd), richtig formatiert (kurzes Programm geschrieben).
    Wenn ich dann aber diese 25k Werte ausgebe, kommt nur Gerausche heraus mit ab und an einem hohen Fiepsen.
    Habe ich irgendetwas vergessen/übersehen? Oder ist die Rate von 300Hz einfach zu niedrig, um irgendetwas erkennen zu können?
    Wenn dem tatsächlich so ist, dann müsste ich wohl doch noch irgendwie Pins finden, an die ich eine SD Karte anschließen kann...
    Oder gibt es noch eine Alternative, die ich übersehen habe?


  • Mod

    Hast du in Erwägung gezogen, dass du es schlicht falsch gemacht haben könntest? Klingt dein Audiosample am richtigen Rechner noch erkennbar? Hast du es mal mit etwas ganz einfachem, wie einem periodischen Signal versucht?



  • Ich bin gerade noch einmal die ganzen Schritte durchgegangen.
    Bei 300Hz kann man tatsächlich auch am PC nichts mehr erkennen. Ich dachte, dass ich es extra damit probiert habe, war aber offensichtlich irgendetwas höheres.

    Allerdings habe ich nun noch einmal eine deutlich kürzere mp3 von nur 1s versucht.
    Dort habe ich eine Sampling Rate von 3000Hz genommen, auf dem PC klingt es zwar nicht schön, aber erkennbar.
    Am µC nicht. Ich habe aber mit einem Multimeter schon meine Ton-Lib nachgemessen. Die Frequenzen stimmen eigentlich ziemlich gut. Das schließe ich also als Fehlerquelle aus. Mit einem Stimmgerät bin ich auch schon die Töne nachgegangen. Stimmt eigentlich auch.
    Vielleicht noch einmal mein Ablauf ganz genau:
    In Audacity Stereo auf Mono umstellen und die eine Spur löschen. Die andere vom Format von 32-bit float auf 16-bit PCM umstellen und mit einer Sample Rate von 3000Hz resamplen. Anschließend auf Exportieren und als RAW-Datei exportieren. Dabei wähle ich headerless und unsigned 8-bit aus.
    Anschließend wandel ich das mit xxd (quasi einfach wie ein Hex-Editor) in Hex-Werte um. Die formattiere ich um, sodass ich eine Verkettung von 8-bit Werten habe (0xFF, 0x00, 0xFF, 0x00, etc.). Diese Werte speichere ich in einem Array und gebe die dann einfach so wie sie sind mithilfe von PWM an einen Lautsprecher aus.
    Dort kommt aber nur ein undefinierbaren Rauschen heraus.
    Muss ich vllt. immer 2 Werte zusammen ausgeben? Aber das müsste doch eigentlich durch die Auswahl von 8-bit unsigned passen, oder nicht?


  • Mod

    Wie machst du denn die Umwandlung von Amplituden nach PMW? Das ist ja nicht trivial, aber bei dir ist das bloß ein Nebensatz, als ob das keine große Sache wäre.



  • SeppJ schrieb:

    Wie machst du denn die Umwandlung von Amplituden nach PMW? Das ist ja nicht trivial, aber bei dir ist das bloß ein Nebensatz, als ob das keine große Sache wäre.

    Ups. Ich habe die Werte einfach als Frequenz genommen und ausgegeben.
    Muss ich mir wohl noch etwas einfallen lassen. Hättest du denn sonst einen Vorschlag?


Log in to reply