2

我一直在到处寻找一种可靠的方法来计算android SDK(通过eclipse IDE)中的本机函数接收到的音频字节流的FFT。我遇到了 libgdx fft 和 Jtransform。Jtransform 在这里找到 JTransform 。我已将它们全部下载,并将 .jar 文件添加到项目根目录中创建的 libs 文件夹中。然后,我通过项目属性 > java 构建路径 > 库将项目链接到新的 .jar 文件。

我的 src java 文件看起来像这样试图使用 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;

/** 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");
}
}

在这个例子中,我只使用了 Jtransform 包,但是对于 lingdx 包,我遇到了同样的编译错误。编译器说 DoubleFFT_1D 和 complexForward 未定义。所以我缺少一些东西,比如没有正确链接我的库,我不确定。任何帮助将不胜感激。我的意思是在 onCreate 之前声明一个 DoubleFFT_1D 和 complexForward 的实例吗?

我知道这是一个菜鸟问题,但我是面向对象语言的新手,并且在旅途中学习 java。谢谢 :)

4

2 回答 2

3

您首先需要创建一个傅立叶变换对象

DoubleFFT_1D fft = new DoubleFFT_1D(int n);

其中 n 是您想要的变换的大小。n 可能必须比您想象的大 2 倍,因为它期望实部和虚部在同一输入矩阵中并排。

然后您可以将您的方法应用于fft,例如

fft.complexForward(double[]);

奇怪的是,结果被保存到输入数组中。

于 2012-08-08T15:51:52.060 回答
0

1.在项目属性 -> Java 构建路径 -> 排序和导出中,检查所有添加的依赖项以包含在项目类文件中。

2.选择 Android 工具 > 修复项目属性

比运行你的应用程序

于 2012-08-07T13:02:02.357 回答