Programm zur Audio-Frequenzerkennung in Java/C#/

Hallo!
Ich habe folgendes Programmier-Projekt (vorzugsweise Java oder auch C#) und weiß nicht genau, wie ich an die Sache ran gehen soll. Vielleicht kann mir ja hier jemand einen Gedankenanstoß geben.

Ein Computer soll die Frequenz eines Tones (ich habe mich der Einfachheit halber auf Midi-Töne beschränkt), welcher über ein Mikrofon gesendet wurde, analysieren und z.B. eine spezielle Frequenz erkennen/melden.

Wie schaffe ich es, am Rechner die Frequenz zu analysieren/herauszubekommen? Als Schlagwort kam mir Fourier-Transformation in den Sinn, aber ich weiß dann nicht genau, wie ich das umsetzen soll.
Hole ich mir regelmäßig ein bestimmtes Intervall die Bytes des Audiostreams in ein Array und analysiere die dann? (meine Java-Denke)

Auch über Goertzel-Filter bin ich gestolpert, aber ich bin mir nicht ganz sicher, was meine Anforderungen am besten erfüllt.

Gibt es zur Analyse schon vorhandene, freie Libraries?

Um Tipps und Erklärungen wäre ich sehr, sehr dankbar!

Viele Grüße!

Hallo,

Wie schaffe ich es, am Rechner die Frequenz zu
analysieren/herauszubekommen? Als Schlagwort kam mir
Fourier-Transformation in den Sinn, aber ich weiß dann nicht
genau, wie ich das umsetzen soll.
Hole ich mir regelmäßig ein bestimmtes Intervall die Bytes des
Audiostreams in ein Array und analysiere die dann? (meine
Java-Denke)

Genau, du zerlegst den Eingabestream in Bloecke, und fourier-transformierst die. Dann suchst du im Ergebnis nach Maxima.

Ob du die das in regelmaessigen Abstaenden selbst machst, oder das Audio-Framework einen Callback von dir aufruft haengt davon ab, was fuer Audio-Bibliotheken du benutzt.

Gibt es zur Analyse schon vorhandene, freie Libraries?

Also zu FFT gibts sehr viel, fuer die speziellere Anwendung kenne ich nichts, aber das muss nichts heissen.

Gruesse,
Moritz

Vielen Dank für deine Antwort Moritz - jetzt habe ich zumindest eher den Eindruck, dass ich auf dem richtigen Wegen bin! :smile: Dass ich nach dem Maxima suchen muss, ist eine wichtige Information, das hatte ich bislang so nicht gewusst.

Dann werde ich mich wohl weiter in den Untiefen von FFT rumtreiben, bis ich etwas verständliches/frei verwendbares gefunden habe.

Wenn jemand sonst noch eine Idee oder gar einen von Grund auf besseren Lösungsvorschlag hat - immer nur her damit, freue mich über jede Rückmeldung!
Auch für Tipps, in was für Büchern ich mich denn am besten schlau machen sollte, wären vermutlich nicht schlecht, wobei ich eingestehen muss, dass ich nur ungerne umfassendes Physik/Mathematik-Buch von A-Z lesen würde, _wenn_ sich das vermeiden ließe.

Viele Grüße!

Hallo

Wenn jemand sonst noch eine Idee oder gar einen von Grund auf
besseren Lösungsvorschlag hat - immer nur her damit, freue mich über jede Rückmeldung!

Wenn es eine periodische Schwingung ist, ein einfacher Sinus z.B., hat jede Welle (jedes Sample) gleich viele Bytes.
Jede Welle hat zwei Nulldurchgänge (naja: wenn sie periodisch ist).
Ich brauch dann also nur die Nulldurchgänge abzurattern, und bei jedem zweiten die Länge (Anzahl Bytes) rechnen und in ein Array schreiben.
Ich darf mal annehmen, dass Du das Signal gepuffert kriegst, z.B. 32 Puffer pro Sekunde.
Abhängig von der Bufferlänge (je nach Samplingrate und Bits) passen N Samples da rein (das letzte kann abgschnitten sein, „passte nicht mehr rein“).
Jetzt rechne ich von den Längen den Mittelwert (das Signal könnte ja ein Vibrato haben), und das ist dann die Frequenz.
Ich habe das noch nicht getestet, aber müsste so gehen.
Kann aber auch sein, das FFT schneller ist.

dass ich nur ungerne umfassendes Physik/Mathematik-Buch von A-Z lesen würde,

Geht mir genauso, :wink: Sieh doch auch mal weiter oben, am C+±Brett, da habe ich ein paar Tipps unter: „Mikrofondaten einlesen und als Sound verarbeiten“.

lG
Martin B

Hallo,

ich bin kein Spezialist für Java/C##, aber zu Deinem Vorhaben: Es gibt keine MIDI-Töne.

MIDI ist ein Datenübertragungsprotokoll. Es werden also Datenpakete mit Informationen über Tonhöhen usw. gesendet, aber nicht in unterschiedlichen Tonhöhen.

Vielleicht hilfreich, hofft tf

dass ich nur ungerne umfassendes Physik/Mathematik-Buch von A-Z lesen würde,

Geht mir genauso, :wink:

Dann dürfte aber das Programmierergebnis nicht die Erwartungen erfüllen.
Die Sache mit den Nulldurchgängen setzt nämlich voraus, dass Du nur eine EINZIGE Sinusschwingung aufnimmst und keine Gleichspannungsanteile hast.
Überlege Dir mal, wie die Kurve aussieht, wenn Du zwei sich überlagernde Sinusschwingungen hast. Oder für Nicht-Theoretiker: Sieh Dir mal in einem Wave-Editor bei entsprechend hohem Zoomfaktor ein Kurvenverlauf an.

Programmierung ersetzt nicht hinreichendes Verständnis des Fachgebiets.