4

Android アプリケーションで使用する MATLAB でいくつかの簡単なオーディオ処理アルゴリズムを作成しました。FFT 実装を Java に変換するのに問題があります。

Java バージョンのfftpackを使用しようとしていますが、これは効率的であると報告されていますが、FFT 全般についてしっかりと理解していないためか、少し不可解です。

私は単純に、FFT を表す複素数の対応する配列を生成したい double 配列を持っています。FFT で行う唯一の計算は、その要素の絶対値を取得することです。

わかりやすくするために、Java fftpack を使用して複製したい重要な MATLAB コードを次に示します。

X = fft(myDoubleArray);
abs(X[i]);

これはかなり単純だと思いますが、fftpack へのエントリ ポイントを特定できません。


解決済み:

以下の LutzL からの回答は機能しますが、fftpack は入力として double 配列をサポートするため、Complex1D オブジェクトの作成は実際には不要です。

RealDoubleFFT rdfft = new RealDoubleFFT(myArray.length);
rdfft.ft(myArray);
4

1 に答える 1

1

sourceforge jfftpack リポジトリからの読み取り

次の方法で新しいfftオブジェクトを初期化します

fft = new ComplexDoubleFFT(N);

次に、 fft オブジェクトの順変換を使用します

Complex1D X;
X.x=new double[N];
X.y=new double[N];
for(k=0;k<N;k++) X.x[k]=x[k];

fft.ft(X);

そして、絶対値に次のようにアクセスできます

x=X.x[k]; y=X.y[k]; a=Math.sqrt(x*x+y*y);

N必要に応じて、FFT を正規化するために除算します。

適切な変数宣言を追加します。


通常の規則が適用され、信号がサンプリング周波数 fs でサンプリングされる場合、エントリ X.(xy)[k] は k=N/2 ~ N-1 の k*fs/N での周波数成分を表します。


純粋な Java で行われる、より適切にサポートされている別の FFT 実装を探すことをお勧めします。2 進長の FFT を実装するのはそれほど複雑ではありません。唯一の複雑さは、最後の高速化係数を取得するために変換を実装するときに発生します。

于 2014-01-12T12:20:07.360 に答える