質問

私は、Androidアプリケーションに使用することをMATLABに簡単なオーディオ処理アルゴリズムを書きました。 FFTの実装をJavaに翻訳するのに問題があります。

Javaバージョンの fftpack を使用しようとしています。また、私にとって少し潜在的に、おそらく、FFT上でのしっかりした握手があるためです。

私は単にFFTを表す対応する複素数の配列を生成したい二重配列を持っています。 FFTでやる唯一の計算はその要素の絶対値を取っています。

明確さのために、ここにJava FFTPACKを使用して複製したいという不可欠なMATLABコードがあります:

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

これはかなり単純であることを期待していますが、FFTPACKへの入り口点を識別することはできません。


解決済み:

LUTZLの作品からの回答は実際には、入力としてdoubleアレイをサポートするため、実際には複雑なオブジェクトを作成することは不要です。

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

役に立ちましたか?

解決

SourceForge JFFTACKリポジトリ

で新しい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);
.

FFTを正規化するためにNで除算します。

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


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


純粋なJavaで行われる異なる、サポートされているFFT実装を探すことをお勧めします。最後のスピードアップファクタを取得するために適切な変換を実行するときに唯一の複雑化が来ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top