einzelne Werte in Bel (db) aus einer WAV



  • Hallo liebe Leserinnen und Leser,
    ich hoffe ihr könnt mir weiterhelfen. Eine Datei aufzuzeichnen und als WAV abzuspeichern ist kein Problem für mich. Nur ich bräuchte noch eine „Kleinigkeit“ und zwar die einzelnen Werte in Bel (db) aus der WAV Datei. Z. B. in dem Format (CSV):
    Frequenz [khz], Pegel [db] bei 0,1 Sek., Pegel [db] bei 0,2 Sek., …
    10, 36,5, 37, …
    11, 40, 41, …
    12, 34, 35, …
    13, 50, 51, …

    Quasi eine Tabelle (Dezibel in Abhängigkeit zur Frequenz). Ich habe unter anderem das Stichwort FFT gefunden. Finde aber nur Links auf Codes aber kaum Dokumentation und Hinweise wie ich direkt einzelne Werte abfrage (abfange, auslese).

    (Das Vorzeichen vernachlässigt, db Werte sind ja eh alle negativ)
    Eine Funktion wie eine solche wäre vollkommend ausreichend…

    double CSound::GetAt(unsigned long int msek, unsigned long int freq); // return the db
    

    Über weitere Hinweise oder sogar einen direkten Verweis würde ich mich riesig freuen 🙂

    Freundliche Grüße und eine schöne Woche

    PS: Es wäre noch zu erwähnen das es Windowskompatibel sein sollte. Falls es aber dafür "nur" gute GNU Bibliotheken gibt geht das auch, kann mit beiden umgehen 😉



  • Löse das Problem zuerst auf Papier mit Mathe..



  • man da haste dir was vorgenommen, ich würde (ich habe davon echt 0 ahnung) mir erstmal eine AudioLibrary suchen z.b. OpenAL... und dann vlt mal die funktionen analysieren um zu sehen wie die damit umgehen... kann sein dass mein ansatz völlig falsch ist aber ich kann dir auch nicht mehr dazu sagen 😉

    Gruß chris



  • Ich weiß nicht, ob's dafür vorgefertigte Bibliotheken gibt, kann aber sein. Würdest du es auch von Hand implementieren? Wenn ja, sehe ich zwei Probleme/Herausforderungen: Erstens musst du dir überlegen, ob du die Werte an einem bestimmten Punkt ermitteln willst, oder über 1ms / 0.5ms interpolierst. Zweitens, hast du schon einen Algorithmus, wie du aus den PCM-Daten die Lautstärke und Frequenz ermitteln kannst?



  • Auf Papier mit Mathematik lösen, das war ein Scherz oder?

    Ich hab ja diverse andere Fragen gefunden die ähnlich sind aber halt nix genaues aussagen wie z. B. diese Antworten:

    Die FFT wird aber benutzt um aus aufgenomenen WAVE's (WAV Datei) die einzelenen Frequenzen zu extrahieren. Rein theoretisch ist es also ein Filter der verschiedene, im Sample vorkommenden, überlagerten Frequenzen = Schwingungen einzeln wiederherstellt. Einfach ausgedrückt, Du erzeugt mit drei Frequensgeneratoren drei unterschiedliche Töne und mischt diese zur Ausgabe auf EINEM Lauftsprecher. Die FFT ist nun theoretisch in der Lage diese 3 Töne aus dem einem Kanal (Mischprodukt) wieder zu extrahieren.

    Die Resultate einer normalen FFT Analyse stellen, je nach Auflösung, ein Bericht über die Verteilung und Stärke der jeweiligen Frequenzen dar. D.h. jeder Eintrag der FFT Daten ist einer bestimmten Frequenz zugeordnet. Ich würde nun die gespeicherten WAVES auch mit der FFT umsetzen und mit den aktuellem Input vergleichen....

    Zu der Frage ob ich schon einen Algo habe... das ist ja genau die Frage die ich stelle 😞





  • das was in der wav datei steht hat doch erst mal nix mit db zum tun, das hängt doch dann vom verstärker ab. :xmas1:



  • Auf Papier mit Mathematik lösen, das war ein Scherz oder?

    Das war sicher kein Scherz. Ich mein natürlich nicht dass Du einzelne Resultate berechnest, aber quasi ein Lösungsweg. Analytisch oder Nummerisch, aber Du musst Dir ja im klaren sein, wie Du das Problem lösen möchtest und die Lösung ist ganz garantiert mathematisch. Die Umsetzung kann dann in deiner Lieblingssprache / Lieblingslibrary erfolgen. Kannst ja auch zuerst Versuche mit Mathe SW machen (MatLAB, SciLAB, etc.).

    Grüsse
    Simon



  • das was in der wav datei steht hat doch erst mal nix mit db zum tun, das hängt doch dann vom verstärker ab.

    Kann gut in dBFS (= dB bezogen auf Full Scale) angegeben werden. Nix Verstärker.
    Kein Schalldruck!



  • du musst ne fft durchführen, dann liegen die werte sozusagen schon vor dir,
    denn eine fourier-transformierte hat im real-teil die energie des signals, was ja in etwa lautstärke (db) ist ...
    eine fft zu programmieren ist ne sache von 20 zeilen in c++, aber eine wenig über fourier-transformationen zu lesen wäre vielleicht von vorteil 😉



  • FFT durchführen ist korrekt.
    Jedoch musst Du entscheiden in welchem Zeitbereich des Signals Du die FFT durchführen möchtest.

    Z.B. alle 1024 Samples oder alle Samples überhaupt... das Ergebnis ist nicht dasselbe.

    Zudem musst Du nach der FFT noch eine geeignete Fenster- Funktion (z.B. Hanning) anwenden um die 'Fehler' die bei der FFT entstaden sind auszubesseren.

    Grüsse
    Simon


Anmelden zum Antworten