2

Android SDKのネイティブ関数によって受信されたオーディオバイトストリームのFFTを計算するための信頼できる方法を見つけるために、どこでも検索してきました(Eclipse IDEを介して)。libgdx fft と Jtransform に出会いました。Jtransform ここに ある JTransform 。それらをすべてダウンロードし、プロジェクトのルート ディレクトリに作成された libs フォルダーに .jar ファイルを追加しました。次に、プロジェクト プロパティ > Java ビルド パス > ライブラリを使用して、プロジェクトを新しい .jar ファイルにリンクしました。

Jtransform を使用しようとすると、私の src Java ファイルは次のようになります。

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 に答える