Вычисление ДПФ с помощью Jtransform DoubleFFT_1D () для Android - PullRequest
1 голос
/ 21 апреля 2011

Я искал повсюду, чтобы найти надежный метод для вычисления БПФ аудиобайтового потока, полученного встроенной функцией в Android SDK (через Eclipse IDE).Я сталкивался с libgdx fft и Jtransform.Jtransform Найдено здесь JTransform .Я скачал их все и добавил файлы .jar в созданную папку libs в корневом каталоге проекта.Затем я связал проект с новыми файлами .jar через свойства проекта> Путь сборки Java> Библиотеки.

Мой файл 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 на ходу.Спасибо:)

Ответы [ 2 ]

3 голосов
/ 08 августа 2012

Сначала необходимо создать объект преобразования Фурье

DoubleFFT_1D fft = new DoubleFFT_1D(int n);

Где n - размер требуемого преобразования. Возможно, n должно быть в 2 раза больше, чем вы думаете, так как он ожидает, что реальные и мнимые части будут соседствовать в одной входной матрице.

Затем вы можете применить свои методы к FFT, например,

fft.complexForward(double[]);

Странно, но результат сохраняется во входном массиве.

0 голосов
/ 07 августа 2012

1.В свойствах проекта -> путь сборки Java -> упорядочить и экспортировать, проверьте все добавленные зависимости, которые будут включены в файлы классов проекта.

2.Выберите Инструменты Android> Исправить свойства проекта

Чем запустить ваше приложение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...