私は非常に単純なインプレース DFT を書いています。ここに示す式を使用しています: http://en.wikipedia.org/wiki/Discrete_Fourier_transform#Definitionとオイラーの式を組み合わせて、これだけのために複素数クラスを使用する必要がないようにします。これまでのところ、私はこれを持っています:
private void fft(double[] data)
{
double[] real = new double[256];
double[] imag = new double[256];
double pi_div_128 = -1 * Math.PI / 128;
for (int k = 0; k < 256; k++)
{
for (int n = 0; n < 256; n++)
{
real[k] += data[k] * Math.Cos(pi_div_128 * k * n);
imag[k] += data[k] * Math.Sin(pi_div_128 * k * n);
}
data[k] = Math.Sqrt(real[k] * real[k] + imag[k] * imag[k]);
}
}
しかし、Math.Cos と Math.Sin の項は最終的には正と負の両方になるため、これらの項に data[k] を掛けて加算すると、それらは相殺され、非常に小さな値が得られます。それがどのように起こっているかはわかりますが、私のコードが数学を誤って表現している可能性があることを理解できません。どんな助けでも大歓迎です。参考までに、私は自分で書く必要があります。既製のFFTを入手できることに気づきました。