Zum Inhalt springen

Java - Frequenzberechnung von Sound


Empfohlene Beiträge

Geschrieben

Hallo! Bin neu auf diesem Forum....

Habe folgendes Problem:

Ich programmiere für die abschlussprüfung ein Stimmgerät mit JAva in eclipse. Den Sound aufzunehmen war ja noch ganz einfach, dank des Java Sound API's , doch die ermittlung der Frequenz macht mir zu schaffen......

Wie kann ich nun die Frequnez aus dem gerade aufgezeichneten gesamplten sound, berechnen???:confused:

HAbe da mal etwas über FFt (FAST FOURIER TRANSFORMATION-> ich glaub so heißt es :D) doch kapier das nicht..... :upps

Bin über jeden beitrag dankbar!

Toll wären Code-bsp. :)

Geschrieben

Ich hab folgenden Code gefunden:


import java.awt.*;


double[][] fft_1d(  double[][] array )

{

  double  u_r,u_i, w_r,w_i, t_r,t_i;

  int     ln, nv2, k, l, le, le1, j, ip, i, n;

  n = array.length;

  ln = (int)( Math.log( (double)n )/Math.log(2) + 0.5 );

  nv2 = n / 2;

  j = 1;

  for (i = 1; i < n; i++ )

  {

    if (i < j)

    {

      t_r = array[i - 1][0];

      t_i = array[i - 1][1];

      array[i - 1][0] = array[j - 1][0];

      array[i - 1][1] = array[j - 1][1];

      array[j - 1][0] = t_r;

      array[j - 1][1] = t_i;

    }

    k = nv2;

    while (k < j)

    {

      j = j - k;

      k = k / 2;

    }

    j = j + k;

  }

  for (l = 1; l <= ln; l++) /* loops thru stages */

  {

    le = (int)(Math.exp( (double)l * Math.log(2) ) + 0.5 );

    le1 = le / 2;

    u_r = 1.0;

    u_i = 0.0;

    w_r =  Math.cos( Math.PI / (double)le1 );

    w_i = -Math.sin( Math.PI / (double)le1 );

    for (j = 1; j <= le1; j++) /* loops thru 1/2 twiddle values per stage */

    {

      for (i = j; i <= n; i += le) /* loops thru points per 1/2 twiddle */

      {

        ip = i + le1;

    t_r = array[ip - 1][0] * u_r - u_i * array[ip - 1][1];

    t_i = array[ip - 1][1] * u_r + u_i * array[ip - 1][0];

    array[ip - 1][0] = array[i - 1][0] - t_r;

    array[ip - 1][1] = array[i - 1][1] - t_i;

    array[i - 1][0] =  array[i - 1][0] + t_r;

    array[i - 1][1] =  array[i - 1][1] + t_i;

      }

      t_r = u_r * w_r - w_i * u_i;

      u_i = w_r * u_i + w_i * u_r;

      u_r = t_r;

    }

  }

  return array;


Quelle: http://www.nauticom.net/www/jdtaft/JavaFFT.htm

Author: Jeffrey D. Taft, PhD.

Ich schaue mir das heute Abend mal an, da ich auch an einem digitalen Stimmgerät interssiert bin.

Soll es ein ganz normaler Tuner werden?

CDEFGAHC?

Gruß Chollay

Geschrieben

Danke für schnelle Anwort!!! :uli

nein sollte hauptsächlich für die egitarre und e-bass gedacht sein

die frequenzen wären evtl. falls es dich interessiert:

E -> 82,4 Hz

A -> 110 Hz

D -> 146,83 Hz

G -> 196 Hz

H -> 246,94 Hz

E -> 329,63 Hz

Bass:

E 41hz

A 55

D 73,42

G 98

Geschrieben

Hallo!

Habe es mit meinem FFT- algorithmus probiert jedoch ist dieser sehr langsam.

Für 1sec Aufnahme mit 44700 samples brauch er ca. 7 min ...... auch wenn ichs auf threads auslagere....... also fürs stimmgerät nicht geeignet :(

@Chollay Frage

Wie verwende ich die double matrix? Ich habe nur ein byte Array das mein signal beinhaltet. :confused:

Geschrieben (bearbeitet)

Wie verwende ich die double matrix? Ich habe nur ein byte Array das mein signal beinhaltet. :confused:

Eine Matrix ist im Gegensatz zu einem Array 2-dimensional. Du kannst zwar Dein Byte Array in eine Matrix oder auch Array vom Typ float bringen, aber ich sehe davon nicht aktuell den Nutzen, bzw. zu Deinen Daten, denn Du hast ein zeitabhängiges Signal (somit 1D)

Ich möchte Dir einmal den Hinweis zu dem Wikipedia Artikel geben Fourier-Transformation ? Wikipedia

Generell solltest Du nicht irgendwas einsetzen, wovon Du denkst, dass es das ist, was Du benötigst. Die DFT (diskrete FT) kann Dir aus Deinen Daten, die entsprechenden Frequenzen abbilden, oder zu den Amplituden die Frequenzen. Die FT liefert Dir somit eine globale Sicht auf das Frequenzspektrum Deiner Funktion (analog dazu ein Wavelet für lokale).

Es gibt verschiedene Implementierungen dazu z.B. für C/C++ GSL - GNU Scientific Library - GNU Project - Free Software Foundation (FSF) mit Hilfe anderer Libs kann man dann die passenden Datenstrukturen effizient implementieren Boost C++ Libraries

Dir nützt aber die schnellste Implementierung nichts, wenn Du die zugrunde liegenden Mathematik nicht verstehst, denn einfach Daten in eine Library reinstecken und zu hoffen, dass das heraus kommt, was man will, wird nicht funktionieren. Du solltest Dich erst einmal mit der Mathematik auseinander setzen. Zusätzlich würde ich mir auch, wenn Du nur eine visuelle Darstellung Deiner Frequenzen brauchst auch über die Datenmenge und das Sampling (Stichwork Sampling Theorem) Gedanken machen.

Phil

Bearbeitet von flashpixx

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...