私は EE であり、コードの専門家ではありません。
Embarcadero C++ Builder (XE3) を使用しています。
複素数に対してかなりの数の演算を行う FFT アルゴリズムがあります。Embarcadero の複雑な数学ライブラリをバイパスし、独自のコードですべての計算を行うと、FFT が約 4.5 倍速く実行されることがわかりました。ここに示されている 4 つの操作はすべて、途方もない時間を必要とします。
#include <dinkumware\complex>
#define ComplexD std::complex<double>
ComplexD X, Y, Z, FFTInput[1024];
double x, y;
Z = X * Y;
x = X.real();
y = X.imag();
Z = ComplexD(x,y);
乗算を独自の交差乗算に置き換えると、実行時間が半分になりました。しかし、私の懸念は、入力配列の実部と虚部にアクセスする方法にあります。私はこれをやっています:
double *Input;
Input = reinterpret_cast<double *>(FFTInput);
// Then these statements are equivalent.
x = FFTInput[n].real();
y = FFTInput[n].imag();
x = Input[2*n];
y = Input[2*n+1];
これを行うと、実行時間が再び半分に短縮されますが、この reinterpret_cast が賢明かどうかはわかりません。入力配列を複素数ではなく 2 つの double に変更することもできますが、この FFT を多数のプログラムで使用しているため、すべてを書き直す必要はありません。
この reinterpret_cast は問題ありませんか、それともメモリの問題がありますか? また、Embarcadero の複雑な数学関数をより高速に実行する方法はありますか? そして最後に、私にとってそれほど重要ではありませんが、この reinterpret_cast は移植可能ですか?