2011-04-21 6 views
1

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

+0

Quelqu'un a une idée? – digiphd

+0

voulez-vous appeler ces fonctions ou créez-vous les vôtres? – Shah

Répondre

3

Vous devez d'abord créer une transformée de Fourier objet

DoubleFFT_1D fft = new DoubleFFT_1D(int n); 

Où n est la taille de la transformation que vous vouloir. n peut devoir être 2 fois plus grand que vous ne le pensez car il attend des parties réelles et imaginaires côte à côte dans la même matrice d'entrée.

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

fft.complexForward(double[]); 

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

+2

Ce n'est pas étrange, ça s'appelle inplace fft et c'est en fait une fonctionnalité (et une grande à mon avis). – brimborium

+0

Salut! J'ai essayé d'utiliser la même méthode que celle que vous recommandez pour JTransforms, mais elle plantait toujours mon application sur la ligne "fft.complexForward (result)". "result" est un double [] et est rempli avec les informations du tampon. Peux-tu m'aider? – Sakura

0

1.Dans les propriétés du projet -> Java build path -> Commandez et exportez, vérifiez que toutes vos dépendances ajoutées soient incluses dans les fichiers de classe de projet.

2.Select Android Tools> Fix Propriétés du projet

Than exécuter votre application

Questions connexes