私は現在、Android用のJavaに取り組んでいます。一種の周波数ビューアを実現するために、FFT を実装しようとしています。
実際にはできましたが、表示がまったく流動的ではありません。コードの各部分の処理時間を確認するためにいくつかのトレースを追加しました。実際には、FFT が 4096 要素を所有する複雑な配列に適用されるのに約 300 ミリ秒かかります。また、(周波数を表示する) スレッドは 100 ミリ秒ごとに更新されるため、100 ミリ秒未満で完了する必要があります。FFT の結果が 1028 要素のみを所有するように、最初の配列を減らしました。これは機能しますが、結果は非推奨です。
誰かがアイデアを持っていますか?
インターネットで見つけられるデフォルトの fft.java および Complex.java クラスを使用しました。
情報については、FFT を計算する私のコードは次のとおりです。
int bytesPerSample = 2;
Complex[] x = new Complex[bufferSize/2] ;
for (int index = 0 ; index < bufferReadResult - bytesPerSample + 1; index += bytesPerSample)
{
// 16BITS = 2BYTES
float asFloat = Float.intBitsToFloat(asInt);
double sample = 0;
for (int b = 0; b < bytesPerSample; b++) {
int v = buffer[index + b];
if (b < bytesPerSample - 1 || bytesPerSample == 1) {
v &= 0xFF;
}
sample += v << (b * 8);
}
double sample32 = 100 * (sample / 32768.0); // don't know the use of this compute...
x[index/bytesPerSample] = new Complex(sample32, 0);
}
Complex[] tx = new Complex[1024]; // size = 2048
///// reduction of the size of the signal in order to improve the fft traitment time
for (int i = 0; i < x.length/4; i++)
{
tx[i] = new Complex(x[i*4].re(), 0);
}
// Signal retrieval thanks to the FFT
fftRes = FFT.fft(tx);