J'ai cherché partout pour trouver une méthode fiable pour calculer la FFT d'un flux d'octets audio reçu par une fonction native dans android SDK (via IDE eclipse). J'ai rencontré le libgdx fft et Jtransform. Jtransform Trouvé ici JTransform . Je les ai tous téléchargés et ajouté 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> java Build Path> Bibliothèques. Mon fichier src java ressemble à ceci en essayant d'utiliser Jtransform.Calcul de la DFT avec Jtransform DoubleFFT_1D() pour android
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;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//initialize(new SpectrumDesktop(), false);
sin = playsin(f,fs);
buf = bytearray2double(sin);
public DoubleFFT_1D(512); //<Undefined>
public void complexForward(sin) //<Undefined>
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 Auto-generated method stub
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}
public native byte[] playsin(int f,int fs);
/** Load jni .so on initialisation */
static {
System.loadLibrary("SPL");
}
}
Dans cet exemple, je suis en utilisant uniquement les paquets Jtransform, mais je reçois la même erreur de compilation pour les paquets de lingdx. Le compilateur dit que DoubleFFT_1D et complexForward sont indéfinis. Donc il y a quelque chose qui me manque, comme ne pas lier correctement mes librairies, 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?
Je sais que c'est une question noob, mais je suis nouveau dans les langages orientés objet et l'apprentissage de Java sur le pouce. Merci :)
Quelqu'un a une idée? – digiphd
voulez-vous appeler ces fonctions ou créez-vous les vôtres? – Shah