Ergebnis 1 bis 18 von 18

Thema: Anhand der bpm (beats per minute) die ms-Dauer eines einzelnen Beats ermitteln

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Zitat Zitat von Mono Beitrag anzeigen
    Ich glaube, du bringst hier gerade einige grundlegende Sachen durcheinander. Der MVC hat nichts hiermit zu tun und ein Durchlaufen eines Buffers würde ich nicht als Abtastung bezeichnen, da dieser Begriff für etwas ganz anderes benutzt wird.
    Ich bin selber Softwareentwickler. Ich weiß, was der MVC ist. Danke für diese Belehrung -.-
    Der Graph, für die grafische Darstellung (View), braucht aber Daten, die er darstellen soll, und die kommen von einer Datenstruktur (Model), und diese Datenstruktur muss von irgendwo gefüllt werden.
    Es spielt also keine Rolle, ob ich nun die Wellenform grafisch darstelle, oder weiterbearbeite, da die Datenstruktur unabhängig von der grafischen Darstellung ist.

    Zitat Zitat von Mono Beitrag anzeigen
    Das Frequenzspektrum hilft dir in diesem Fall nicht weiter. Du kannst höchstens mit lokalen Frequenzspektren die Änderungen der Frequenzen beobachten. Allerdings ist dies in diesem Szenario absoluter Overkill, da eine einfache Kantenerkennung auf dem Rohsignal ein bereits ausreichendes Resultat bildet bei viel geringerem Rechenaufwand. Im Extremfall einen leichten Tiefpass auf das Signal legen und dann die Kanten erkennen. Das ist immernoch sehr viel einfacher als dauernd FFTs auszuführen.
    OK, ich habe mir noch mal den MP3-Standard angeschaut.
    Tatsächlich werden die einzelnen Frequenzbänder decodiert (bis zu 32 pro Sample). Dann könnte man auch einfach die Daten von den tiefen Frequenzen nehmen.
    Nicht desto trotz bleibt dir eine Analyse nicht erspart, um zu entscheiden, welcher Peak wichtig ist, und welcher nicht, und im Grunde ist das nichts weiter, als das Analysieren eines Frequenzspektrums.

    Zitat Zitat von Mono Beitrag anzeigen
    Das Öffnen einer Audiodatei hat nichts mit Abtastfrequenzen zu tun. Diese brauchst du nur für den ADC auf der Soundkarte, damit er aus dem diskreten Signal ein eindeutiges (zeit)kontinuierliches Erzeugen kann.
    Eben.
    Und nun lies noch mal, was ich geschrieben habe

    Zitat Zitat von Mono Beitrag anzeigen
    Ebenfalls wird diese gebraucht, um die Frequenzen eindeutig aus den Rohdaten ableiten zu können (bspw. für weitere Verarbeitung). Eine Wellenform bspw. kannst du unabhängig der bei der Abtastung eingesetzten Abtastfrequenz erstellen, da diese allein keinerlei Bezug zu Frequenzen hat.
    Ich habe auch nie gesagt, dass er die Wellenform nun irgendwo zeichnen soll, sondern dass er die Wellenform analysieren soll, und genau das musst du tun, was du auch schon geschrieben hast
    Eine Wellenform ist nichts weiter, als eine Anreihung von Daten. Im simpelsten Fall ein Array. Die Abtastrate wird dann benötigt, um herauszufinden, zu welcher Zeit ein Peak stattfindet.

    Geändert von Whiz-zarD (01.10.2013 um 13:36 Uhr)

  2. #2
    Gut gut... nach dem ganzen Geschwätz würde ich folgenden Plan vorschlagen, um die ganze Sache recht einfach hinzubekommen:

    Dazu sollten die Audiodaten aber bereits decodiert in irgendeinem Buffer bereit liegen, auf den man Zugriff hat. Somit erspart man sich irgendwelche Prügeleien mit Audioformaten und die Decodierung wird ohnehin zum Abspielen benötigt. Da wahrscheinlich recht einfache elektronische Musik zum Einsatz kommt, sollten die Resultate brauchbar sein.

    Es gibt einen Parameter (zwischen 0 und 1), der als Grundlage für den Grenzwert fungiert. Den müsste man durch Ausprobieren so einstellen, dass die Resultate ausreichend sind.

    Durchgang 1: Du suchst das Maximum im Buffer. Einfach Array durchgehen und das Maximum merken.
    Durchgang 2: Das Maximum wird mit dem Parameter multipliziert. Dies bildet den Grenzwert. In einfacher elektronischer Musik kann man die Eigenschaft ausnutzen, dass die rhythmus-bestimmenden Anteile deutlich lauter sind als der Rest. Damit erspart man sich das Gefummel mit Frequenzen komplett und sucht einfach nur die Spitzen in den Rohdaten, die über dem Grenzwert liegen. In diesem Durchgang gehst du also wieder das Array durch und ignorierst alle Werte unterhalb vom Grenzwert. Beim Auftreten von Werten über dem Grenzwert suchst du eine Spitze. Wie man das macht, bleibt jedem selbst überlassen. Man kann es auf verschiedene Weisen machen, manche einfacher als andere und das Resultat wird besser oder schlechter. Eventuell rumprobieren. Ein erster Ansatz wäre, beim Durchgehen des Arrays den aktuellen Wert mit dem vorherigen zu vergleichen, wenn der vorherige über dem Grenzwert lag. Liefert der Vergleich einen starken Abfall, dann fügt man den Index in eine Auflistung der Spitzen ein. Nach dem Abfall muss erst wieder ein Anstieg erfolgen, damit die Möglichkeit einer Spitze gegeben ist.
    Aber dort kann man ein wenig herumspielen und probieren, bis die Resultate gut genug sind.
    Durchgang 3: Du gehst die Liste mit den Indices der Spitzen durch und rechnest daraus deren Zeiten aus (Index durch Abtastrate). Damit bekommst du eine Liste von Peaks mit Zeitangaben in Sekunden.


    Btw. ich hab vor einigen Jahren mal ein Progrämmchen entwickelt, welches angespielte Noten auf einem an den Line-In angeschlossenen Bass richtig erkennt. Sowohl die Zeit als auch den Notenwert. Weiterhin konnte es auch in Echtzeit Beats in Musik erkennen, die ein angeschlossenes Mikrofon etc. gerade aufnimmt. Hat ziemlich gut funktioniert und der PeakDetector war ähnlich wie der Vorschlag, den ich oben geschrieben habe. Die Idee, die ich damals bei meinem Projekt hatte, wurde mittlerweile ja auch kommerziell umgesetzt und nennt sich RockSmith, wenn ich mich nicht irre. Tja.. wär ich mal an dem Projekt drangeblieben

    Geändert von Mono (01.10.2013 um 14:23 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •