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