Get plain frequencies of a mp3 file



  • 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?


  • Mod

    😕

    Bitte lies doch wenigstens mal die Grundlagen von dem, was du da tust! Wie willst du mp3 oder PCM als PWM ausgeben, wenn du offensichtlich nicht einmal nachgeschlagen hast, wofür mp3, PCM und PWM stehen?


Anmelden zum Antworten