Я пишу очень простой 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 в конечном итоге оказываются как положительными, так и отрицательными, поэтому, когда я добавляю эти термины, умноженные на данные [k], они отменяются, и я просто получаю какое-то непристойно небольшое значение. Я вижу, как это происходит, но я не могу понять, как мой код, возможно, неправильно представляет математику. Любая помощь приветствуется. К вашему сведению, я должен написать свое собственное, я понимаю, что могу получить готовые БПФ.