我一直在到处搜索以找到一种可靠的方法来计算由android SDK中的本机函数接收到的音频字节流的FFT(通过eclipse IDE)。我遇到了libgdx fft和Jtransform。 Jtransform在这里找到
JTransform
。
我已经全部下载了这些文件,并将.jar文件添加到了项目根目录下的libs文件夹中。然后,我通过项目属性> Java Build Path>库将项目链接到新的.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的新手。谢谢 :)
最佳答案
您首先需要创建一个Fourier Transform对象
DoubleFFT_1D fft = new DoubleFFT_1D(int n);
其中n是所需转换的大小。 n可能必须比您想象的大2倍,因为它期望在同一个输入矩阵中并排存在实部和虚部。
然后,您可以将方法应用于fft,例如
fft.complexForward(double[]);
奇怪的是结果被保存到输入数组中。
关于android - 使用Jtransform的DoubleFFT_1D()为Android计算DFT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5743795/