2 votes

Calcul de la DFT avec DoubleFFT_1D() de Jtransform pour Android

J'ai cherché partout pour trouver une méthode fiable pour calculer la FFT d'un flux audio binaire reçu par une fonction native dans le SDK Android (à travers l'IDE eclipse). Je suis tombé sur le fft de libgdx et Jtransform. Jtransform trouvé ici JTransform . Je les ai tous téléchargés et ajoutés les fichiers .jar à un dossier libs créé dans le répertoire racine du projet. J'ai ensuite lié le projet aux nouveaux fichiers .jar via les propriétés du projet > Chemin de construction Java > Bibliothèques.

Mon fichier java src ressemble à ceci en tentant d'utiliser Jtransform.

package com.spectrum;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.view.View;

import com.badlogic.gdx.audio.analysis.*;
import edu.emory.mathcs.jtransforms.fft.*;
import edu.emory.mathcs.utils.*; 

public class spectrum extends Activity {
static byte [] sin = null;
static int f = 2000;
static int fs = 44100;
double buf;

/** Appelée lorsque l'activité est créée. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //initialize(new SpectrumDesktop(), false);

    sin = playsin(f,fs);
    buf = bytearray2double(sin);
    public DoubleFFT_1D(512);        //
    public void complexForward(sin)  //
    playsound(sin);

}
public static double bytearray2double(byte[] b) {  
          ByteBuffer buf = ByteBuffer.wrap(b);  
          return buf.getDouble();  
      }  

 private void playsound(byte[] sin2){

int intSize = android.media.AudioTrack.getMinBufferSize(44100,     AudioFormat.CHANNEL_CONFIGURATION_STEREO,
            AudioFormat.ENCODING_PCM_16BIT);

AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
            AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM);

at.play();
at.write(sin2, 0, sin2.length ); 
at.stop();
at.release();

}

@Override
protected void onDestroy() {
    super.onDestroy();
    // TODO - méthode générée automatiquement
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }

}

 public native byte[] playsin(int f,int fs);

 /** Charge le fichier jni .so à l'initialisation */
 static {
   System.loadLibrary("SPL");
}
}

Dans cet exemple, je n'utilise que les packages Jtransform, cependant, j'obtiens la même erreur de compilation pour les packages libgdx. Le compilateur indique que DoubleFFT_1D et complexForward sont indéfinis. Il y a donc quelque chose qui m'échappe, comme ne pas lier mes bibliothèques correctement, je ne suis pas sûr. Toute aide serait grandement appréciée. Suis-je censé déclarer une instance de DoubleFFT_1D et complexForward avant onCreate ou quelque chose comme ça?

Je sais que c'est une question de débutant, mais je suis nouveau dans les langages orientés objets et j'apprends java sur le tas. Merci :)

4voto

Adam Points 46

Vous devez d'abord créer un objet Transformée de Fourier

DoubleFFT_1D fft = new DoubleFFT_1D(int n);

Où n est la taille de la transformée souhaitée. n doit peut-être être deux fois plus grand que ce que vous pensez car il s'attend à ce que les parties réelle et imaginaire soient côte à côte dans la même matrice d'entrée.

Ensuite, vous pouvez appliquer vos méthodes à fft, par exemple

fft.complexForward(double[]);

Étrangement, le résultat est enregistré dans le tableau d'entrée.

0voto

1. Dans les propriétés du projet -> Chemin de construction de Java -> Ordre et exportation, cochez toutes vos dépendances ajoutées pour qu'elles soient incluses avec les fichiers de classe du projet.

2. Sélectionnez Outils Android > Corriger les propriétés du projet

Ensuite, lancez votre application

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X