Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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. :)

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

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

Habe auch was gefunden.. soll sehr einfach sein laut autor (einfachere variante von FFt)

Fun with Java, Understanding the Fast Fourier Transform (FFT) Algorithm

funktioniert auch bekomme jedoch keine schöne periode aber ich probier dies mal mit meiner gitarre und direktanschluss(Line-IN),nicht mit mic und schau mal was dabei rauskommt.

ich lass von mir hören wenns geklappt hat

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:

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.