2

LibXTractで Android NDK を使用してオーディオ機能を抽出する Android プロジェクトをビルドします。LibXTract はfftw3ライブラリを使用します。プロジェクトは、libxtract の簡単な例を実行するボタンで構成されています。

JNIEXPORT void JNICALL Java_com_androidnative1_NativeClass_showText(JNIEnv *env, jclass clazz)
{
    float mean = 0, vector[] = {.1, .2, .3, .4, -.5, -.4, -.3, -.2, -.1}, spectrum[10];
    int n, N = 9;
    float argf[4];

    argf[0] = 8000.f;
    argf[1] = XTRACT_MAGNITUDE_SPECTRUM;
    argf[2] = 0.f;
    argf[3] = 0.f;

    xtract[XTRACT_MEAN]((void *)&vector, N, 0, (void *)&mean);
    __android_log_print(ANDROID_LOG_DEBUG, "AndNat", "com_androidnative1_NativeClass.c before");
    xtract_init_fft(N, XTRACT_SPECTRUM);
    __android_log_print(ANDROID_LOG_DEBUG, "AndNat", "com_androidnative1_NativeClass.c after");
    // Comment for test purpose
    //xtract_init_bark(1, argf[1], 1);
    //xtract[XTRACT_SPECTRUM]((void *)&vector, N, &argf[0], (void *)&spectrum[0]);
}

Libxtract 関数xtract_init_fftjni/libxtract/jni/src/init.cにありますjni/fftw3/jni/api/plan-r2r-1d.cにあるfftw3 関数fftwf_plan_r2r_1dを実行します

__android_log_print(ANDROID_LOG_DEBUG, "AndNat", "libxtract/src/init.c before");
fft_plans.spectrum_plan = fftwf_plan_r2r_1d(N, input, output, FFTW_R2HC, optimisation);
__android_log_print(ANDROID_LOG_DEBUG, "AndNat", "libxtract/src/init.c after");

fftwf_paln_r2r_1d内でアプリケーションがハングアップし、クラッシュやその他のエラーは発生しません。強制的に動作を停止する必要があります。

fftwf_paln_r2r_1dは次のようになります。

X(plan) X(plan_r2r_1d)(int n, R *in, R *out, X(r2r_kind) kind, unsigned flags)
{
    __android_log_print(ANDROID_LOG_DEBUG, "AndNat", "fftw3/api/plan-r2r-1d.c");
    return X(plan_r2r)(1, &n, in, out, &kind, flags);
}

CatLog から、次のことがわかります。

07-16 18:50:09.615: D/AndNat(7313): com_androidnative1_NativeClass.c before
07-16 18:50:09.615: D/AndNat(7313): libxtract/src/init.c before
07-16 18:50:09.615: D/AndNat(7313): fftw3/api/plan-r2r-1d.c

fftw3 の config.h を生成し、gen.sh スクリプトを使用して libxtract を生成し、ソース フォルダーに配置して成功しました。どちらのライブラリも静的としてビルドされ、共有ライブラリ libcom_androidnative1_NativeClass.so にリンクされています

指示

nm -Ca libcom_androidnative1_NativeClass.so 

使用した機能が含まれていることを示します。

アプリケーションは問題なくビルドされ、デバイスにデプロイされます。

フラグ--disable-alloca--enable-float、およびフラグ--enable-fftおよび--disable-dependency-trackingを使用した LibXTract を使用して fftw3 をビルドし ます。

fftw ライブラリを検出できないため、ライブラリ ソース コードの ingerention のみが dbgprint に追加され、LibXtract から XTRACT_FFT の定義が削除されました。

誰かが私にとってこの奇妙な行動について何か考えを持っているなら、助けてください.


ここでは、プロジェクト全体を github に置いているので、誰かがこれを処理するのを手伝ってくれるかもしれません。

https://github.com/bl0ndynek/AndroidNative1

4

2 に答える 2

4

FFTW3 メンテナに感謝します 問題が解決されました。解決策は、FFTW3 で最適化レベルを FFTW_MEASURE から FFTW_ESTIMATE (1 から 0) に変更することでした。FFTW
のプランナー (xtract_init_fft 内) が実際に実行され、特定の n に対して最速のプランを選択するために、さまざまな可能な FFT アルゴリズムが実行されます。ただし、これをできるだけ短時間で行うには、タイマーの分解能が非常に高くなければなりません。これを実現するために、FFTW3 は、ほとんどの CPU で使用できますが、Android のデフォルト ARM 構成では使用できないハードウェア サイクル カウンターを使用します。したがって、このアルゴリズムは gettimeofday() ウィッチを使用し、解像度が低く、ARM では xtract_init_fft に永遠にかかりました。

于 2012-07-30T08:00:23.580 に答える
0

X()再帰関数に終了条件がないため、無限ループに陥っているように見えます。

于 2012-07-16T19:16:56.523 に答える