2011-04-21 5 views
1

나는 eclipse IDE를 통해 안드로이드 SDK에서 네이티브 함수가받은 오디오 바이트 스트림의 FFT를 계산할 수있는 신뢰할 수있는 방법을 찾고있다. 나는 libgdx fft와 Jtransform을 보았습니다. 여기에 번역본이 있습니다. JTransform . 나는 그 (것)들을 전부 다운로드하고 프로젝트를위한 루트 디렉토리에있는 창조 된 libs 폴더에 .jar 파일을 추가했다. 그런 다음 프로젝트 속성> Java 빌드 경로> 라이브러리를 통해 프로젝트를 새로운 .jar 파일에 연결했습니다.Jtransform의 DoubleFFT_1D()로 DFT 계산하기 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"); 
} 
} 

는 난 단지 그러나 나는 lingdx 패키지 같은 컴파일 오류가 발생되었습니다 Jtransform 패키지를 사용하고 있습니다. 컴파일러에서는 DoubleFFT_1D 및 complexForward가 정의되지 않는다고 말합니다. 내 라이브러리를 올바르게 연결하지 않아서 내가 누락 된 부분이 있으므로 확실하지 않습니다. 도움을 주시면 대단히 감사하겠습니다. onCreate 또는 뭔가 전에 DoubleFFT_1D 및 complexForward의 인스턴스를 선언하겠습니까?

나는 이것이 멍청한 질문이라는 것을 알고 있지만, 나는 객체 지향 언어에 익숙하지 않고 이동 중에도 자바를 배우고있다. 감사합니다 :)

+0

누구나 아이디어가 있으십니까? – digiphd

+0

이 함수를 호출 하시겠습니까? 아니면 직접 함수를 생성하고 있습니까? – Shah

답변

3

당신 오브젝트 푸리에 변환을 만들 수있는 최초의 필요성 n은 당신을 변화의 크기

DoubleFFT_1D fft = new DoubleFFT_1D(int n); 

필요. n은 동일한 입력 행렬에 실수와 허수 부가 나란히 있기 때문에 생각했던 것보다 2 배 더 커야합니다.

은 그럼 당신은 예를 들어 이상하게 결과가 입력 배열에 저장됩니다

fft.complexForward(double[]); 

, 당신의 방법은 FFT에 적용 할 수 있습니다.

+2

그건 이상한 일이 아니고, inft fft라고 불리며 사실은 기능입니다 (제 의견으로는 큰 것입니다). – brimborium

+0

안녕하세요. 나는 JTransforms에 대해 권장하는 것과 동일한 방법을 사용하려고 시도했지만 항상 "fft.complexForward (result)"줄에서 내 응용 프로그램을 충돌 시켰습니다. "result"는 double []이고 버퍼 정보로 채워진다. 너 나 좀 도와 줄 수있어? – Sakura

0

1. 프로젝트 속성 -> Java 빌드 경로 -> 주문 및 내보내기에서 프로젝트 클래스 파일에 포함될 모든 추가 종속성을 확인하십시오.

2.Select 안드로이드 도구> 프로젝트 속성 귀하의 응용 프로그램 실행보다

수정