Я искал везде, где можно найти надежный метод вычисления БПФ потока аудио байтов, полученного встроенной функцией в SDK android SDK (через eclipse IDE). Я столкнулся с libgdx fft и Jtransform. Jtransform Найдено JTransform . Я загрузил их все и добавил файлы .jar в созданную папку libs в корневой каталог проекта. Затем я связал проект с новыми .jar-файлами с помощью свойств проекта> java Build Path> Libraries.Вычисление ДПФ с помощью DoubleFFT_1D() для Jtransform для android
Этот файл 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 не определены. Итак, есть что-то, чего я не вижу, например, неправильно связывая свои библиотеки, я не уверен. Любая помощь будет принята с благодарностью. Я хотел объявить экземпляр DoubleFFT_1D и complexForward перед onCreate или что-то еще?
Я знаю, что это вопрос о нобе, но я новичок в объектно-ориентированных языках и изучаю Java на ходу. Спасибо :)
У кого-нибудь есть идея? – digiphd
Вы хотите назвать эти функции или вы создаете свои собственные? – Shah