Digital Sound Processing & Fast Fourier

hasta_jesaja

Erfahrenes Mitglied
Hallo,

erstmal eine Kurzbeschreibung was ich vorhabe:
Ich würde gerne die Lautstärke/Ausschlag einer bestimmten Frequenz eines Live Audio Inputs an eine Methode eines Objektes weitergeben, oder einen Event bei einem bestimmten Ausschlag auslösen.

Dazu benötige ich die Möglichkeit einen oder mehrere Frequenzbereiche festzulegen und davon die Lautstärke ablesen zu können.

Leider habe ich nicht viel, bzw. gar keine Erfahrung mit DSP, deshalb meine Frage:
Gibt es Bibliotheken die mir solche Methoden zur verfügung stellen?
Gibt es eine freie Bibliothek die einen Fast Fourier implementiert?
Kennt jemand gute Resourcen und/oder Tutorials?

Was ich bisher gefunden habe hat mir leider nicht weitergeholfen.

Danke für jede Hilfe!

Sebastian
 

hasta_jesaja

Erfahrenes Mitglied
Ja, meinte ich ;)
Ojee, meine Mathekenntnisse. Zum Glück komm ich mit etwas Sinus und Cosinus Multiplikationen noch klar.Ganz dahinter gestiegen bin ich aber leider noch nicht. Dazu muss ich glaub meine gesammelten Resourcen noch mehrmals genau studieren.

Ich hab mir halt bis jetzt mit Java AudioSystem einen Input geholt, bekomme auch wunderbar ein ByteArray mit dem Signal. Was ich leider noch nicht ganz kapier ist, wie ich darauf jetzt am besten eine FFT anwende und wie ich die Daten nachher visualisier.

Mei is des aufregend!
 

hasta_jesaja

Erfahrenes Mitglied
Ich habe eine implementierung eines FFT gefunden, jedoch nimmt die ein float[].
Was ich aber über AudioSystem bekomme ist ein byte[]. Wie übergebe ich das denn?

Hier mal die FFT:
Code:
public final float[] fftMag(float[] x) {
    // assume n is a power of 2
    n = x.length;
    nu = (int)(Math.log(n)/Math.log(2));
    int n2 = n/2;
    int nu1 = nu - 1;
    float[] xre = new float[n];
    float[] xim = new float[n];
    float[] mag = new float[n2];
    float tr, ti, p, arg, c, s;
    for (int i = 0; i < n; i++) {
      xre[i] = x[i];
      xim[i] = 0.0f;
    }
    int k = 0;

    for (int l = 1; l <= nu; l++) {
      while (k < n) {
        for (int i = 1; i <= n2; i++) {
          p = bitrev (k >> nu1);
          arg = 2 * (float) Math.PI * p / n;
          c = (float) Math.cos (arg);
          s = (float) Math.sin (arg);
          tr = xre[k+n2]*c + xim[k+n2]*s;
          ti = xim[k+n2]*c - xre[k+n2]*s;
          xre[k+n2] = xre[k] - tr;
          xim[k+n2] = xim[k] - ti;
          xre[k] += tr;
          xim[k] += ti;
          k++;
        }
        k += n2;
      }
      k = 0;
      nu1--;
      n2 = n2/2;
    }
    k = 0;
    int r;
    while (k < n) {
      r = bitrev (k);
      if (r > k) {
        tr = xre[k];
        ti = xim[k];
        xre[k] = xre[r];
        xim[k] = xim[r];
        xre[r] = tr;
        xim[r] = ti;
      }
      k++;
    }

    mag[0] = (float) (Math.sqrt(xre[0]*xre[0] + xim[0]*xim[0]))/n;
    for (int i = 1; i < n/2; i++)
      mag[i]= 2 * (float) (Math.sqrt(xre[i]*xre[i] + xim[i]*xim[i]))/n;
    return mag;
  }